4

我有一个EAGLView我在动画中调整大小的动画,动画由NSTimer调用绘制函数的动画驱动。当我调整大小时EAGLView,我需要调整视图的投影以保持内容的纵横比。绘制函数如下所示:

gameView.frame = newFrame;
[gameView setFramebuffer];
[self updateProjection];

/* Drawing to the EAGLView, gameView, here, then... */  

[gameView presentFramebuffer];

但是,像这样运行,EAGLView 的内容似乎在动画“阶梯式”下降。当我记录下来并逐帧查看时,很明显调整了投影,然后在很短的时间内调整了视图的大小(不到一个动画帧)。

我怀疑原因是帧中的更改gameView被推迟了,同时更新的帧缓冲区正在进入屏幕。我曾尝试使用CATransactions让框架更新立即生效,但正如我对 UIView 更改的预期那样,这没有任何作用。我想我可以修改视口​​并保留EAGLView全帧,但我担心这可能会让我在其他地方遇到同步问题(例如,更新任何覆盖的 CALayers)。

这看起来像是对问题的合理评估吗?我怎样才能防止它——也就是说,我怎样才能最好地确保帧缓冲区呈现与 EAGLView(和其他 CA 元素)的实际帧的变化一致?

谢谢!

4

1 回答 1

1

EAGLView我写的自定义遇到了类似的问题。问题是当改变方向时,视图被调整大小并且内容被拉伸,并且只有动画之后,具有正确比例的场景才会显示出来。

我认为你的也是同样的问题,我认为你不能强制 CoreAnimation 在渲染动画帧之前等待你的视图更新,因为它的工作方式(CA 不知道视图的绘制机制或操作的层)。

但是您可以轻松绕过该问题:打开包含视图的xib文件,切换到右侧的属性检查器。选择您的EAGLView(同样适用于GLKView),在View部分下有Mode属性。如果您以编程方式创建视图,请设置contentMode属性。

该值描述了在动画期间如何管理视图内容。在缓冲区显示之前,旧场景会根据该模式调整大小;也许您可以找到适合您需要实现的动画的模式。

  • 如果您担心比例,中心内容模式可能会起作用,但尚未渲染的场景部分将在动画期间显示为空。

  • 不幸的是,重绘模式不一定会让你EAGLView刷新:视图实际上是重绘的,但可能会使用颜色缓冲区的旧内容。在正确的时间填充缓冲区是一个问题。

  • 您可以尝试调整大小并预渲染一个足够大的帧以在开始之前覆盖整个动画;或者您可以尝试将帧渲染为UIImage,动态替换视图,为其设置动画,将其放置在EAGLView后面,但这可能会严重影响性能。

  • 我解决问题的方法就是做得EAGLView足够大。

  • 关于其他CALayers的混合,据我尝试,没有遇到同步问题;尽可能EAGLView更新,以及其他层。CAEAGLLayer如果您使用 Alpha 通道,只需将正确的属性设置为

于 2012-11-11T18:00:31.220 回答