在iPhone上同步EAGLView演示与帧大小调整

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全屏,但我担心这可能会在其他地方(例如,与任何重叠的CALayer更新同步)留下同步问题。
这是否似乎是问题的合理评估? 如何防止这种情况-即如何最好确保帧缓冲区呈现与EAGLView(以及其他CA元素)实际帧的更改相一致?
谢谢!
1个回答

1

我遇到了一个类似的问题,与我编写的自定义EAGLView有关。问题在于当改变方向时,视图被重新调整大小,内容被拉伸,并且只有在动画之后才会显示正确比例的场景。

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

但是,你可以轻松地解决这个问题:打开包含视图的xib文件,切换到右侧的属性检查器。选择你的EAGLView(适用于GLKView),在视图部分下,有一个模式属性。如果你是通过编程创建视图,请设置contentMode属性。

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

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

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

  • 您可以尝试调整大小并预先渲染足够大的帧以覆盖整个动画,然后再开始;或者您可以尝试将帧渲染到UIImage,在飞行中替换视图,对其进行动画处理,然后放置EAGLView回来,但这可能会严重影响性能。

  • 我解决我的问题的方法是简单地使EAGLView足够大。

  • 关于其他CALayer的混合,就我所尝试的而言,我没有遇到同步问题;EAGLView在可以更新时更新,其他图层也是如此。只需为CAEAGLLayer设置正确的属性(如果使用alpha通道),并记住每次OpenGL更新场景时混合图层可能会在性能方面产生昂贵的代价。


“使EAGLView足够大:您是在屏幕外绘制吗?”的意思是什么? - Vinzzz
不,只需要将大小设置为480x480(例如),居中于父视图,没有调整大小的掩码。因此,方向动画发生在EAGLView的边界内,相机不需要更新,因为没有调整大小。 - Pietro Saccardi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接