0

我正在开发一个使用 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 混合全屏叠加层正在削弱我的表现。

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

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

4

1 回答 1

1

成本来自 OpenGL 视图,而不是来自按钮;当它改变时,顶部的所有内容都需要重新组合。

那么就实际解决方案而言,放弃布局视图并改用IBCollections 怎么样?您肯定希望仅在实际更改时将隐藏标志推送更改以避免数组迭代,但您将获得与以前相同的总体合成成本。

所以你会声明如下:

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

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

于 2012-09-29T01:23:23.980 回答