关于IOS opengl ES上的快速交换纹理

时间:2011-01-26 17:50:09

标签: optimization memory-management opengl-es

我正在使用缓冲区来将非常大的图片(屏幕尺寸)加载到单个表面。 这个想法是逐帧动画很多图片(比视频内存可以存储的更多)。

我已经创建了一个用于创建缓冲区的代码,但是我对位图的加载时间有很大的问题。

我的代码可以解决这个问题:

  1. 我加载了一个本地位图文件数组路径。

  2. 我(想)我在内存中预加载我的位图数据。我正在使用一个线程将NSIrray中的CGImageRef存储到我的所有图片中(暂时为40)

  3. 在第二个线程中,代码看起来是另一个NSArray,用于确定是否为空,如果为空,则通过创建纹理将我的cgimageRef绑定到视频内存。 (使用sharedgroup) 这个数组存储了20个纹理名称的地址,并且它可以直接通过openGL用于绘制表面。这个数组是我的(缓冲区)

  4. 当我播放动画时,我从“缓冲区”删除旧纹理,我的线程(在第3点)加载一个新纹理。

    它的功能非常好,但速度非常慢,几秒后,动画就缺乏了。

    你能帮我优化我的代码吗?

1 个答案:

答案 0 :(得分:1)

根据设备和iOS版本,glTexImage很慢。 iOS 4的性能得到了提升,因此您可以在第二代设备上获得不错的速度,并且体面的意思是每帧一个或两个纹理上传... 无论如何: 使用glTexSubImage并重用已创建的纹理ID。 此外,在使用glTex(Sub)Image时,请尝试使用未在该帧中渲染的纹理ID。我的意思是:添加一些纹理ID-doublebuffering。 我认为你在同一个线程中做了所有的GL事情,如果没有改变的话。