我正在开发一个显示光照贴图场景的iPad应用程序.加载所涉及的大约20个1Kx1K纹理需要一段时间,当我开始计时各种操作时,我发现每个纹理的时间略少于1/2秒.
事实证明,从文件系统加载纹理图像非常快,而且瓶颈在于将UIImage复制到CGContext以便将图像传递给glTexImage2D()
我尝试了两种不同的制作副本的方法:
CGContextSetInterpolationQuality(textureCopyContext,kCGInterpolationNone); CGContextDrawImage( textureCopyContext,CGRectMake( 0,width,height ),image);
和
UIGraphicsPushContext(textureCopyContext) ; [uiImage drawInRect:CGRectMake(0,height)] ; UIGraphicsPopContext() ;
两者都需要大约0.45秒.即使是相对不足的设备,这也让我觉得过度.
我对iOS开发比较陌生,所以我只想问一下我看到的时间是否合理,或者是否可以改进.
更新:我知道PVRTC的替代品,但是现在我必须坚持使用PNG.然而,对于PVRTC在this answer中的优缺点有一个很好的总结.同样的答案也暗示了为什么PNG导致如此长的纹理设置时间 – “内部像素重新排序”.任何人都可以证实吗?
解决方法
切换纹理上下文传统上是昂贵的,可以追溯到桌面(它在现代GPU上更快).您可以尝试使用纹理图集,具体取决于纹理的大小,这是最有效的方法.纹理Atlas将纹理放在一起,我相信iPad能够加载2048个2048纹理,你可以将4个纹理压缩在一起.
另一种方法是,使用pvrtc纹理压缩,您可以根据质量将文件大小减少约25%. PowerVR芯片使用此压缩功能将其存储在设备上,因此可节省时间和带宽复制.使用较低的设置时,这有时会看起来有损,但对于3d纹理,它是最佳选择,而2d精灵更喜欢第一个选项.
如果您需要更多说明,请与我们联系.不要忘记png文件在从文件系统加载时被压缩并扩展到ALOT更大的全尺寸位缓冲区.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。