Opengles图像纹理预加载在iOS上

时间:2014-07-18 06:25:51

标签: ios core-animation opengl-es-2.0 avfoundation calayer

我正在创建一个照片幻灯片放映,在iOS上的图像之间有复杂的过渡。核心动画不适合目的,因为可能的过渡是有限的,所以我求助于Opengles 2.0。问题是将图像上传到GPU并且创建纹理是耗时的操作&即使对于960x640图像,也需要大约200 ms,这不适合实时播放场景。并且预先创建所有纹理是不可行的,因为它们可能有100个。我想知道Core Animation是如何处理这个问题的,并且无论你在动画中分配了多少CGImages,它都能够运行得足够顺畅? (只要图像在不同时间呈现而不是在一起呈现)。

1 个答案:

答案 0 :(得分:1)

纹理加载是耗时的,并且处理大量应用程序的大多数应用程序正在加载它们进行一些初始化。这是最简单的方法,但肯定是最耗费资源的。您必须了解后面的内容是读取图像文件,解压缩,在CPU上创建原始RGB(A)数据,在GPU上分配内存并将原始数据发送到GPU ......

处理大量纹理的最佳方法是将它们加载到背景中,最好是在需要它们之前。在您的情况下,如评论中已经提到的,您将需要创建这些纹理的一些智能缓存。这仍然是不够的,因为加载本身可能会使您的线程无响应。您需要添加后台任务来处理这些图像。

我建议你创建2个额外的线程。首先应该将图像数据加载到CPU,而第二个将数据推送到GPU。第一个线程非常直接,而第二个线程需要一些额外的GL代码来完成。每个线程都需要自己的openGL上下文才能与GPU通信,因此一旦创建了这个线程,您还需要创建一个额外的上下文。这些上下文不知道彼此的资源导致在一个上下文中创建纹理将使其在其他上下文中不可用。为此,您需要一个名为共享组的额外参数。首先,您创建共享组,然后使用相同的共享组创建两个上下文,以便可以访问纹理。请注意,上下文最好是在您应该使用它的线程上创建的(可能只需将其设置为当前即可)。