ios - 如何减少覆盖在 GL View 上的 UIKit 元素的渲染开销?

标签 ios opengl-es uikit

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

最近,我进行了一些结构更改,导致两个全屏 View 在 GL View 之上包含了我的按钮叠加层,这损害了某些速度较慢的设备(例如 iPhone 4 和第四代 iPod Touch)上的渲染帧速率。我这样做是为了更轻松地使用现有的 IB/UIKit 架构一次性显示/隐藏完整的控件布局。

旧的:

|-Root (GLKView)
|  |-Buttons

新:

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

覆盖层(布局 1, 2, ..., n)是完全透明的,包含一些 subview (按钮 1, 2, ..., n),图像和文本位于屏幕边缘。当 View 是 Root View 的直接后代时,覆盖这几个按钮和其他东西的开销并没有那么糟糕,但是中间有一个额外的透明 View 似乎削弱了我的性能,因为我的帧速率下降了很多。

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

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

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

最佳答案

成本从 OpenGL View 向上产生,而不是从按钮向下产生;当它发生变化时,上面的所有内容都需要重新组合。

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

所以你会声明类似的内容:

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

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

关于ios - 如何减少覆盖在 GL View 上的 UIKit 元素的渲染开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12649081/

相关文章:

objective-c - iPad [opengl-es] 的画图应用程序线条不正确

ios - 如何在 UIView 中使 SwiftUI View 透明或半透明?

ios - 禁用 UITextfield 的键盘

objective-c - 为什么在使用 CLLocationManager 时总是泄漏?

android - 这可能吗,GNOME (lib)Clutter with OpenGL ES & Vulkane?

android - GLSurfaceView 父级为空,即使它嵌套在 LinearLayout 中

cocoa-touch - 如何向适合图像内容形状但具有一些旋转和移位效果的 UIImageView 添加阴影

ios - UIStepper不会注册任何事件

ios - 在我构建的第一个函数中获取 "unrecognized selector error"

ios - NSURLIsExcludedFromBackupKey - 应用程序必须遵循 iOS 数据存储指南,否则将被拒绝