繁体   English   中英

在iOS上预载Opengles图像纹理

[英]Opengles image texture preloading on iOS

我正在创建一个幻灯片照片,其中包含iOS上图像之间的复杂过渡。 核心动画不适合该目的,因为可能的过渡是有限的,所以我诉诸于Opengles 2.0。 问题是将图像上传到GPU并创建纹理是一项耗时的操作,即使对于960x640图像也要花费大约200毫秒的时间,这不适合实时播放。 而且,在手工之前预先创建所有纹理是不可行的,因为可能会有100多个纹理。 我想知道Core Animation如何处理此问题,并且无论您在动画中分配了多少CGImage,它是否足够平滑地运行? (只要图像在不同的时间显示而不是在一起显示)。

纹理加载非常耗时,大多数处理大量纹理的应用程序都在初始化时加载它们。 那是最简单的方法,但是肯定是最消耗资源的。 您必须了解,后面发生的事情是读取图像文件,将其解压缩,在CPU上创建原始RGB(A)数据,在GPU上分配内存并将原始数据发送到GPU ...

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

我建议您创建2个其他线程。 首先将图像数据加载到CPU,而第二个将数据推送到GPU。 第一个线程很简单,而第二个线程将需要一些额外的GL代码来完成。 每个线程将需要自己的openGL上下文才能与GPU进行通信,因此一旦创建此线程,还需要创建一个额外的上下文。 这些上下文不了解彼此的资源,这导致在一个上下文中创建纹理将使其无法在另一上下文中使用。 为此,您将需要一个额外的参数,称为共享组。 因此,首先创建共享组,然后使用相同的共享组创建两个上下文,以便可以访问纹理。 请注意,上下文最好在您应该在其上使用的线程上创建(不过只要将其设置为当前线程就足够了)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM