Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 仅在场景数据更改时重绘场景_Ios_Performance_Opengl Es - Fatal编程技术网

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

Ios 仅在场景数据更改时重绘场景,ios,performance,opengl-es,Ios,Performance,Opengl Es,我从第页读到: 仅在场景数据更改时重绘场景: 在渲染新帧之前,应用程序应等待场景中的某些内容发生更改。Core Animation缓存呈现给用户的最后一幅图像,并继续显示它,直到呈现新帧 即使数据发生更改,也不必以硬件处理命令的速度渲染帧。对于用户来说,较慢但固定的帧速率通常比较快但可变的帧速率更平滑。每秒30帧的固定帧速率对于大多数动画来说已经足够,并且有助于降低功耗 据我所知,有一个事件循环不断运行并重新渲染场景。我们只需覆盖onDrawFrame方法并将渲染代码放在那里。我无法控制何时调用

我从第页读到:

仅在场景数据更改时重绘场景: 在渲染新帧之前,应用程序应等待场景中的某些内容发生更改。Core Animation缓存呈现给用户的最后一幅图像,并继续显示它,直到呈现新帧

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

据我所知,有一个事件循环不断运行并重新渲染场景。我们只需覆盖
onDrawFrame
方法并将渲染代码放在那里。我无法控制何时调用此方法。那么,我如何“仅当场景数据更改时才重新绘制场景”


在我的例子中,只有当用户交互(单击、挤压等)时,场景才会发生变化。理想情况下,当用户不与我的场景交互时,我希望不进行渲染,但该函数会不断被调用。我很困惑。

在最低的曝光级别,有一个OpenGL包含CoreAnimation层的类型,
CaeAglayer
。它可以提供一个颜色缓冲区,可用于构造帧缓冲区对象,您可以在需要时绘制该对象,并在需要时呈现。这就是OpenGL在iOS中的全部过程:想画就画,想呈现就呈现

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

通常的做法是手动或仅利用其中一个
GLKit
结构连接计时器,通常是
CADisplayLink
。在这种情况下,您试图为每个计时器滴答声生成一帧。苹果公司建议,以刷新率的一半运行计时器是可以接受的,如果你醒来进行画画,意识到你只是在画与上次完全相同的帧,根本不需要费心画画。如果你有足够的远见,最好完全停止计时器

根据评论,
onDrawFrame
的措辞不像Objective-C或Swift方法,也不是任何苹果提供的库提供的。无论是谁发布这些信息——可能是为了让Android作者看起来很熟悉——都需要对适当的行为负责。

Re:“
onDrawFrame
”——这不是iOS提供的,不是GLKit的一部分,也不遵循Objective-C或Swift的常用命名约定。那么它是从哪里来的呢?答案很可能来自哪里。