3

澄清一下,我知道纹理图集在使用多个不同图像时可以提高性能。但我感兴趣的是,当你不这样做时,事情是如何完成的。

我尝试在自定义 OpenGL 中手动制作一些逐帧动画,其中每一帧我绑定一个新纹理并将其绘制在同一个点精灵上。UIImageView它可以工作,但与抽象相同的能力相比,它非常慢。我预先加载了所有纹理,但每帧都会重新绑定。相比之下,UIImageView接受单独的图像,而不是纹理图集,所以我想它会做类似的事情。

这些是单独加载的 76 张图像,而不是作为纹理图集,每个大约 200 像素正方形。在 OpenGL 中,我怀疑瓶颈是需要在每一帧重新绑定纹理。但是如何UIImageView做到这一点,因为我期望有类似的瓶颈?是否UIImageView以某种方式在幕后创建地图集,因此不需要重新绑定纹理?由于 UIKit 最终会在其下运行 OpenGL,我很好奇它是如何工作的。

如果有一种更有效的方法来为多个纹理设置动画,而不是在 OpenGL 中每帧换出不同的绑定纹理,我想知道,因为它可能暗示 Apple 在他们的框架中正在做什么。

如果我确实在一秒钟内为 60 帧中的每一帧获得了一个新帧,那么在我的 76 帧中制作动画大约需要 1.25 秒。事实上,我使用 UIImageView 得到了这一点,但 OpenGL 大约需要 3 - 4 秒。

4

2 回答 2

0

我会说你的瓶颈在别的地方。openGL 更有能力按照您的方式制作动画。由于所有纹理都已加载,并且您每帧只需绑定另一个纹理,因此没有加载时间或其他任何内容。考虑进行比较,我有一个应用程序可以在运行时生成或删除纹理,并且可以在某些时候在 GPU 上加载大量纹理,我必须每帧绑定所有这些纹理(不是每帧 1 个),使用所有从深度缓冲区、模板、多个 FBO、大量用户输入、大约 5 个线程瓶颈到 1 个来处理所有 GL 代码,我对 FPS 完全没有问题。

由于您使用的是 iOS,我建议您运行一些分析器来查看哪些代码负责开销。如果由于某种原因你的时间分析器会告诉你这条线glBindTexture太长了,我仍然会说问题出在其他地方。

因此,要回答您的问题,UIImageView 的工作如此顺利是正常且很棒的,并且使用 openGL 实现相同的性能应该没有问题。不过,此时有几件事情需要考虑。你怎么能说图像视图不跳过图像,你可能会设置一个指向不同图像的指针每秒 60 次,但图像视图可能只是每秒要求自己 30 次重绘,并且当它确实使用分配的当前图像时给它。另一方面,使用您的 GL 代码,您正在强制应用程序执行 60FPS 重绘,无论它是否能够这样做。

综合考虑,苹果开发者为你创建了一个叫做显示链接的东西。我相信这正是您想做的事情。显示链接将告诉您帧之间经过了多长时间,通过该键您应该问自己要绑定什么纹理,而不是试图在可能太短的时间范围内强制它们全部。

还有一件事,我已经看到,如果您尝试在大多数 iOS 设备(可能全部)上以 100 FPS 呈现渲染缓冲区,您将只能获得 60 FPS,因为呈现渲染缓冲区的方法将暂停您的线程,如果它已被调用在不到 1/60 秒内。话虽如此,在 iOS 设备上以 60 FPS 的速度显示任何东西是相当不可能的,并且运行 30+ FPS 的所有东西都被认为是好的。

于 2013-04-24T10:36:46.247 回答
-1

“不是纹理图集”对我来说是一个危险信号。

使用纹理图集是一件好事......纹理被加载到内存中一次,然后您只需移动矩形位置即可播放动画。它很快,因为它已经全部在内存中。任何涉及不断加载和重新加载新图像帧的操作都会比这慢。

您必须发布源代码才能获得比这更准确的答案。

于 2013-04-24T03:16:04.517 回答