Iphone OpenGL ES中的PVR纹理与PNG

Iphone OpenGL ES中的PVR纹理与PNG,iphone,opengl-es,Iphone,Opengl Es,我正在为iPhone开发一个2D应用程序,可以渲染很多纹理。其中大多数是从PNG文件加载的,目前具有alpha透明度。作为一个测试,我一直在玩PVR测试,看看是否有任何性能差异 PNG纹理与崩溃着陆示例附带的Texture2D类一起加载。PVR测试集由PVRTextureLoader示例中的PVRTexture类加载。我使用苹果的texturetool创建PVR纹理 作为测试,我渲染一个背景(512*512),并在36个90*64像素的精灵(来自512*512纹理)之上渲染透明度。PVR纹理渲染

我正在为iPhone开发一个2D应用程序,可以渲染很多纹理。其中大多数是从PNG文件加载的,目前具有alpha透明度。作为一个测试,我一直在玩PVR测试,看看是否有任何性能差异

PNG纹理与崩溃着陆示例附带的Texture2D类一起加载。PVR测试集由PVRTextureLoader示例中的PVRTexture类加载。我使用苹果的texturetool创建PVR纹理


作为测试,我渲染一个背景(512*512),并在36个90*64像素的精灵(来自512*512纹理)之上渲染透明度。PVR纹理渲染速度约为58 fps,PNG渲染速度约为47 fps。这是我所能期望的,还是差距应该更大?此外,texturetool生成的纹理看起来非常糟糕,PVRTexTool更好吗?

使用PVRTC纹理时,性能应该更好,因为它们是压缩的(有损的)。解压是在图形硬件本身中完成的。传输的纹理数据更少,因此可以获得更多带宽。您为RAM和带宽节约付出的代价是质量损失。

PNGs:
  • 高精度颜色表示,无损耗
  • 从磁盘读取/解压缩速度较慢
  • 缓慢上传到图形硬件,内部像素重新排序(旋转)由驱动程序执行。可能还有RGBABGRARGB之间的转换,尽管Xcode通常会将PNG转换为更适合硬件的颜色格式
  • 由于内存带宽有限(GPU需要从内存读取更多字节),渲染速度较慢。实际的减速量取决于使用场景。当放大率低于1x且无MIP映射时,此问题最为明显
  • 占用更多的RAM/VRAM空间
  • 可编辑,可在上传前由软件过滤/混合/调整大小/转换
  • Mip贴图可以在驱动程序上传纹理时自动生成
  • 磁盘空间的使用因内容而异,对于简单图像来说非常小,对于真实照片图像来说几乎是未压缩的
  • 可从任何图像编辑软件直接快速导出
PVR:
  • 低精度有损压缩。有2个压缩级别,每像素2位和每像素4位。块状,可能损坏锐边和平滑渐变。图像质量因内容而异。3或4个颜色通道,因此可以使用alpha通道,但有损压缩可能会产生不希望的结果
  • 快速从磁盘加载,无需软件解压缩
  • 几乎即时的纹理上传,因为它是一种内部硬件格式,将通过驱动程序不变
  • 由于占用的内存带宽较小,因此渲染速度较快。使用PVR纹理时,像素渲染速度主要受到其他因素的限制
  • 使用最少的RAM和VRAM空间
  • Mip映射必须预先生成
  • 您不能在软件AFAIK中生成或编辑PVR。否则会很慢
  • 磁盘空间使用量与源映像大小成正比(固定压缩比)。可以通过其他方法进一步压缩(稍微压缩)
  • 尺寸限制。2的幂,只有平方
  • 需要额外的转换工具,处理可以自动化,但会大大降低构建时间

我使用PVR作为一个容器,其中包含PNG图像。这样我就可以打破正方形的限制。如果我不使用PVR作为一种选定的图像格式,而只是一个容器,那么我到底能从PVR中得到什么好处呢?很清楚(因为这似乎令人惊讶,上面也不完全清楚):PVR在GPU和CPU上占用的内存更少。使用PVR压缩不仅可以获得更好的启动时间和渲染性能,还可以同时加载更多更大尺寸的纹理。“低精度有损压缩(2级)、块状、无锐边和平滑渐变。”2级?我不知道你这是什么意思。你也可以有锐利的边缘和平滑的渐变,但这将取决于每个局部区域需要表现多少其他细节。@Adam我说过PVR占用更少的RAM和VRAM空间。很明显,有些东西占用更少的空间,可以加载更多的内容。好的。公平地说,尽管(这是我在一本书中的尝试;-))FWIW,PVRTC“仅限square”限制是iOS中强加的软件限制。比如说,安卓PowerVR设备中就没有。