gpt4 book ai didi

iphone - 在 iPhone 上同步 EAGLView 演示文稿和帧调整大小

转载 作者:行者123 更新时间:2023-12-03 19:22:09 24 4
gpt4 key购买 nike

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

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

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

[gameView presentFramebuffer];

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

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

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

谢谢!

最佳答案

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

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

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

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

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

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

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

  • 我解决问题的方法是让 EAGLView 足够大。

  • 关于其他CALayer的混合,据我尝试,没有遇到同步问题; EAGLView 会尽可能更新,其他层也会更新。如果您使用 Alpha channel ,只需为 CAEAGLLayer 设置正确的属性,并记住,每次 OpenGL 更新场景时混合图层可能会降低性能。

关于iphone - 在 iPhone 上同步 EAGLView 演示文稿和帧调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6488897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com