仅在场景数据更改时重绘场景

时间:2016-05-25 07:55:19

标签: ios performance opengl-es

我在Tuning Your OpenGL ES App的页面上看到了这个:

  

仅在场景数据更改时重绘场景:   您的应用应该等到场景中的某些内容发生变化,然后再渲染新帧。核心动画缓存呈现给用户的最后一个图像并继续显示它直到呈现新帧。

     

即使数据发生变化,也无需以硬件处理命令的速度渲染帧。对于用户来说,较慢但固定的帧速率通常比快速但可变的帧速率更平滑。对于大多数动画而言,每秒30帧的固定帧速率就足够了,并且有助于降低功耗。

据我所知,有一个事件循环继续运行并重新渲染场景。我们只是覆盖onDrawFrame方法并将渲染代码放在那里。我无法控制何时调用此方法。那么我怎么能只在场景数据发生变化时 重绘场景" ?

在我的情况下,只有当用户进行交互(点击,捏等)时,场景才会发生变化。理想情况下,当用户没有与我的场景交互时,我不想渲染,但是这个函数被连续调用。很困惑。

1 个答案:

答案 0 :(得分:1)

在最低暴露级别,有一个包含OpenGL的CoreAnimation层类型CAEAGLLayer。这可以提供一个颜色缓冲区,可用于构建一个帧缓冲对象,您可以根据需要随时绘制,随时随地显示。这就是iOS中OpenGL流程的全部范围:随时抽取,随时展示。

然后该图层具有场景的像素副本。普通核心动画规则适用,因此您永远不会被自动要求重绘。完整的构图,过渡,核心动画动画等都可以在您无需任何工作的情况下完成。

通常的做法是手动连接计时器,通常是CADisplayLink,或者只是利用其中一个GLKit结构。在这种情况下,你试图每个计时器滴答产生一帧。 Apple建议以刷新率的一半运行计时器是可以接受的,如果你醒来进行平局并意识到你只是绘制与上次完全相同的框架,而不是完全没有画画。如果你有足够的远见,最好完全停止计时器。

根据评论,onDrawFrame的措辞不像Objective-C或Swift方法,并且不是Apple提供的任何库提供的。任何人发布的内容 - 可能是为了让Android作者都熟悉 - 需要对适当的行为负责。