如何减少叠加在GL视图上的UIKit元素的渲染开销?

时间:2012-09-29 01:12:53

标签: ios opengl-es uikit

我正在开发一个使用GLKit完成渲染的游戏。为了节省创建UI布局的一些工作,我使用Interface Builder和UIKit视图来管理某些界面元素的显示/隐藏和交互。

最近我进行了一些结构性更改,导致两个全屏视图在GL视图顶部包含我的按钮覆盖,这对一些较慢的设备(如iPhone 4和第4代iPod Touch)的渲染帧速率造成了损害。我这样做是为了使用现有的IB / UIKit架构更容易一次显示/隐藏完整的控件布局。

旧:

|-Root (GLKView)
|  |-Buttons

新:

|-Root  (GLKView)
|  |-Layout 1
|  |  |-Buttons 1
|  |-Layout 2
|  |  |-Buttons 2
(Etc...)

叠加层(布局1,2,...,n)是完全透明的,包含一些子视图(按钮1,2,...,n),图像和文本围绕屏幕边缘。当视图是根视图的直接后代时,覆盖这几个按钮和事物的开销并没有那么糟糕,但是在中间有一个额外的透明视图似乎增加了我的性能,因为我的帧率降低了很多。

我有哪些选项来减少开销?叠加层中没有任何动画或任何事情发生,所以我认为它们不应该重绘超出他们需要的范围,而且它可能只是额外的alpha混合全屏叠加,这会削弱我的性能。

我在每一帧的所有UIViews上设置hidden属性,而不检查它们是否已更改,是否会导致视图被标记为需要重绘?

将所有这些按钮转换为OpenGL绘图是可能的,因为我没有使用iOS的本机控件,如UIButtons和UISwitches(Just UIViews带图像和标签),但如果可以,我想避免使用它。

1 个答案:

答案 0 :(得分:1)

成本来自OpenGL视图,而不是来自按钮;当它改变顶部的一切都需要重新编译。

因此,就实际解决方案而言,如何放弃布局视图并使用IBCollection来代替?您肯定希望仅在实际更改时更改隐藏标志以避免数组迭代,但您将获得与以前相同的整体合成成本。

所以你要声明如下:

@property(retain) IBOutletCollection(UIView) NSArray *viewsInLayout1;

然后,您可以在界面设计器中将其连接到任意数量的视图。随后在代码中,您可以使用可以迭代的数组viewsInLayout1(或尽可能使用makeObjectsPerformSelector:)来区分一个组与另一个组,而无需对整个地方的分组进行硬编码。 / p>