Iphone 许多png文件被加载到纹理中以与OpenGLES一起使用,这导致加载时间变慢

Iphone 许多png文件被加载到纹理中以与OpenGLES一起使用,这导致加载时间变慢,iphone,Iphone,我使用libpng加载了数千个png文件,然后创建了OpenGLES纹理以供应用程序使用。这样做会在iPhone上造成巨大的加载时间延迟。有没有办法加快加载时间?您可以在一个大纹理(1024x1024)中放置多个纹理。但这需要重新计算texcoords。还应尝试使纹理部分接近绘制时使用的实际分辨率,即如果纹理将填充1/2屏幕高度(240px),则足以使用256x256的纹理 然后,一个更高级的方法(未测试)可以是连接所有文件(+注册其长度+位置),然后使用mmap(..)访问此png db文件。

我使用libpng加载了数千个png文件,然后创建了OpenGLES纹理以供应用程序使用。这样做会在iPhone上造成巨大的加载时间延迟。有没有办法加快加载时间?

您可以在一个大纹理(1024x1024)中放置多个纹理。但这需要重新计算texcoords。还应尝试使纹理部分接近绘制时使用的实际分辨率,即如果纹理将填充1/2屏幕高度(240px),则足以使用256x256的纹理

然后,一个更高级的方法(未测试)可以是连接所有文件(+注册其长度+位置),然后使用
mmap(..)
访问此png db文件。然后使用
NSData
为基于
UIImage
的纹理加载函数提供数据。像这样使用
mmap(…)
的好处是,不需要打开和关闭很多文件,对数据的访问是在OS VM管理器的帮助下进行的


[注意:是的,iPhone原生PNG加载器需要一些PNG损坏…可能需要一个非原生读取器,或者连接损坏的文件]

你知道你需要数千张图像的顺序吗?也许你只能在应用程序启动时加载几百个,然后在后台线程中加载更多


将较小的图像组合成较小的较大纹理也是一个好主意,同样,只有当图像在一起使用时有一些模式。

我通常做的是构建一个对象,通过管理器处理纹理的延迟加载。在启动时,我注册我的已知纹理并解析它们的文件系统属性,稍后我需要在加载时保存在简单IO上,然后根据需要将它们拉入

为了加快速度,我也有一个批处理加载机制,我说“加载这个图像数组并将它们返回给我。”这只是为了消除重复方法调用的开销。事实上,我的单次加载解决方案只是一个围绕批处理加载的简单包装器

这样,在启动时,我会缓存我的簿记(对象创建、文件系统属性发现等),但会将繁重的工作推迟到必要时。当我在运行时将纹理加载到我的应用程序中时,它会触发错误,将纹理从存储区填充到纹理内存。如果我加载的场景中有许多以前已知的纹理,我会在预回迁中加载一组非常常见的纹理,但会将相对少见的纹理延迟到运行时

在实践中,由于所涉及的概率,这往往会起作用-在开始时间强制加载可确保您将同时遇到所有纹理,而在可能性中稀疏加载它们会导致预期用户延迟下降,这是由加载时间延迟*从开始起在某个时间窗口内加载的概率加权得出的。如果优化开始时间预取以不加载纹理,则会显著减少预期的UI延迟


此外,您可能需要考虑使用从存储中加载纹理的方法。它是异步的,因此您可以要求它异步加载最大的文件,同步加载较小的文件,以便在文件系统获取/纹理解压缩期间利用IO/CPU空闲因素(大文件加载时间长,而小文件加载速度快,可以同时反序列化)。不过,您应该对此进行测试,因为iPhone可能无法很好地处理异步文件系统访问。

在任何时候,我都只将png文件中的图像加载到程序中,并立即加载当前时间点所需的纹理。换句话说,我不会一次加载所有文件。但是,在任何给定的时间,我都需要至少1000个png加载到纹理中,以备显示。因此,如果我使用NSURLConnection或threads,我应该同时加载多个png文件,而不是串行加载,这样会更快?为什么纹理越少越好?在纹理上有很多开销吗?打开每个文件需要额外的工作,而且如果你的图像不是正方形,高度/宽度不是2的幂,那么你使用更少的纹理内存来组合它们。