相关疑难解决方法(0)

drawRect或不绘制drawRect(何时应该使用drawRect/Core Graphics vs subviews/images以及为什么?)

为了澄清这个问题的目的:我知道如何使用子视图和使用drawRect创建复杂的视图.我试图完全理解何时使用一个而不是另一个.

我也明白,提前优化这一点是没有意义的,并且在进行任何分析之前做一些更难的方法.考虑到我对这两种方法感到满意,现在真的想要更深刻的理解.

我的很多困惑来自学习如何使表格视图滚动性能真正流畅和快速.当然,这种方法的原始来源是来自twitter for iPhone(以前的tweetie)的作者.基本上它说,为了使表格滚动黄油光滑,秘诀是不使用子视图,而是在一个自定义uiview中完成所有绘图.从本质上讲,使用大量子视图似乎会减慢渲染速度,因为它们有很多开销,并且经常在父视图上重新合成.

公平地说,这是在3GS是一个非常新的品牌时写的,iDevices从那以后变得更快.不过这种方法经常 建议interwebs和其他高性能表.事实上,它是Apple的表示例代码中的一种建议方法,已经在几个WWDC视频(iOS开发人员的实用绘图)和许多iOS 编程书籍中提出过.

甚至还有很棒的工具来设计图形并为它们生成Core Graphics代码.

所以起初我会相信"核心图形存在的原因.它很快!"

但是当我认为我得到"尽可能支持核心图形"的想法时,我开始看到drawRect经常导致应用程序响应能力差,内存非常昂贵,并且真正对CPU征税.基本上,我应该" 避免覆盖drawRect "(WWDC 2012 iOS App性能:图形和动画)

所以我想,就像一切一样,它很复杂.也许你可以帮助自己和其他人了解使用drawRect的时间和原因?

我看到一些使用Core Graphics的明显情况:

  1. 你有动态数据(Apple的股票图表示例)
  2. 您有一个灵活的UI元素,无法使用简单的可调整大小的图像执行
  3. 您正在创建动态图形,一旦渲染在多个位置使用

我看到避免Core Graphics的情况:

  1. 视图的属性需要单独设置动画
  2. 你有一个相对较小的视图层次结构,因此任何使用CG的额外努力都不值得获得
  3. 您想要更新视图的各个部分而不重绘整个视图
  4. 父视图大小更改时,子视图的布局需要更新

所以赐予你的知识.您在什么情况下可以使用drawRect/Core Graphics(也可以通过子视图完成)?哪些因素会导致您做出这个决定?如何/为什么在一个自定义视图中绘制建议用于黄油平滑表格单元格滚动,但Apple建议drawRect反对性能原因一般?那么简单的背景图像(你何时使用CG创建它们与使用可调整大小的png图像)?

制作有价值的应用程序可能不需要深入理解这个主题,但我不喜欢在不能解释原因的情况下在技术之间进行选择.我的大脑生我的气.

问题更新

感谢大家的信息.这里有一些澄清问题:

  1. 如果你正在绘制具有核心图形的东西,但是可以用UIImageViews和预渲染的png完成同样的事情,你应该总是走这条路吗?
  2. 一个类似的问题:特别是像这样的badass工具,你何时应该考虑在核心图形中绘制界面元素?(可能是元素的显示是可变的.例如,具有20种不同颜色变化的按钮.还有其他情况吗?)
  3. 根据我在下面的回答中的理解,通过在复杂的UIView渲染自身后有效捕获单元格的快照位图,并在滚动和隐藏复杂视图时显示,可以获得表格单元格相同的性能提升吗?显然有些部分必须要制定出来.我有一个有趣的想法.

iphone core-graphics ios

139
推荐指数
4
解决办法
2万
查看次数

如何正确使用setNeedsDisplayInRect for iOS应用程序?

我在Yosemite 10.10.5和Xcode 7上,使用Swift制作一款针对iOS 8及以上版本的游戏.

编辑:可能有用的更多细节:这是一个2D拼图/街机游戏,玩家可以移动石头来匹配它们.根本没有3D渲染.绘图已经太慢了,我还没有得到碎片爆炸.还有一个淡入淡出的水平,非常令人担忧.但到目前为止,这一切都在模拟器上.我还没有真正用iPhone测试,我打赌实际的设备至少要快一点.

我有自己的Draw2D类,它是一种UIView,在本教程中设置.我有一个NSTimer,它在Draw2D中启动以下调用链:

[setNeedsDisplay]; // which calls drawRect, which is the master draw function of Draw2D

drawRect(rect: CGRect)
{
  scr_step(); // the master update function, which loops thru all objects and calls their individual update functions. I put it here so that updating and drawing are always in sync

  CNT = UIGraphicsGetCurrentContext(); // get the curret drawing context

  switch (Realm) // based on what realm im in, call the draw function for that realm …
Run Code Online (Sandbox Code Playgroud)

ios swift xcode7

10
推荐指数
1
解决办法
880
查看次数

标签 统计

ios ×2

core-graphics ×1

iphone ×1

swift ×1

xcode7 ×1