【问题标题】:iOS OpenGL ES - Only draw on requestiOS OpenGL ES - 仅根据请求绘制
【发布时间】:2012-05-22 00:37:08
【问题描述】:

我正在使用 OpenGL ES 在 iOS 上编写自定义 UI 框架。用例适用于应用程序,例如不会在每帧基础上更新的东西(例如游戏)。从我目前所见,似乎 GLKViewController 的默认行为是以大约 30fps 的速率重绘屏幕。 UI 通常只在必要时重绘自身以减少资源使用,并且我不想在用户不做任何事情时通过使用 GPU 来消耗额外的电池电量。

我尝试只清除和绘制一次屏幕作为测试,并从分析器收到警告说正在显示未初始化的颜色缓冲区。

查看它,我发现了这个文档:http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Reference/EAGLDrawable_Ref/EAGLDrawable/EAGLDrawable.html

文档指出有一个标志 kEAGLDrawablePropertyRetainedBacking,当设置为 YES 时,将允许后台缓冲区保留在前一帧中绘制到它的内容。但是,它还指出不建议这样做,并且会导致性能和内存问题,这正是我首先要避免的。

我打算尝试两种方式,绘制每一帧而不是,但我很好奇是否有人遇到过这种情况。你会推荐什么?每帧重新绘制所有内容 30 次不是我想象的那么重要吗?

【问题讨论】:

  • 你必须使用GLKViewController吗?滚动您自己的 OpenGL ES 托管视图和仅在需要时刷新的视图控制器并不难。这是我们所有人在 iOS 5.0 之前都必须做的事情。
  • 有趣,我没有意识到这是一个选项(我对 iOS 开发非常陌生)。我会调查的。
  • 我链接到this answer 中的几个示例应用程序,一个比另一个简单。两者都创建自己的自定义视图和视图控制器,并且手动或通过可中断的 CADisplayLink 处理更新。

标签: ios performance opengl-es frame-rate redraw


【解决方案1】:

在这种情况下,您不应该使用GLKViewController,因为它的目的是在主循环中提供一个简单的动画计时器。相反,您的视图可以由 UIViewController 的任何其他子类拥有(包括您自己创建的子类),并且您可以依赖所有其他 UIKit 视图使用的常用setNeedsDisplay/drawRect 系统。

【讨论】:

    【解决方案2】:

    保留图像的不是后备缓冲区,而是一个单独的缓冲区。可能是专门为您的视图创建的单独缓冲区。

    您始终可以在GLKViewController 上设置paused 以暂停渲染循环。

    【讨论】:

    • 不知道 paused 属性,这听起来是个不错的解决方案。这是否也会暂停更新循环(GLKViewControllerUpdate)?
    • 是的,paused 属性会阻止GLKViewController 更新和呈现GLKView。如果您想使用 setNeedsDisplay 根据不规则更改(例如用户输入)进行渲染,但有时会根据更新计时器进行动画处理,这是完美的选择。例如,如果您拖动某个东西然后松开它并弹回,您将取消暂停控制器直到弹簧动画完成,然后再次暂停它直到需要。
    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多