理解游戏中使用的贴图资源

贴图资源是游戏中最常用的一种资源,做为游戏引擎的开发者,我们不仅要了解如何使用这些贴图,还要考虑运行性能,内存,磁盘空间,网络流量等一些产品化的东西。

通常我们需要考虑以下几个因素:

  • 贴图读取的时间
  • 内存占用及创建,销毁的次数
  • 网络流量
  • 磁盘空间占用
  • 对美术开发是否友好

贴图格式与纹理格式

纹理格式是为显卡设计的,对于显卡来说,贴图资源就是一块显存,cpu需要按照纹理格式在内存中将纹理数据准备好,然后通过图形API告诉gpu这块数据使用的格式,是否使用了mipmap以及mipmap的层数等等,最后cpu将资源从内存拷贝到显存中供gpu流水线使用。

贴图格式是为了减少磁盘空间设计的,各种格式的贴图比如png,tga,jpg等等,都是为了做压缩减少磁盘空间的占用。

因为很多贴图格式的压缩算法不适合gpu解码,所以很多时候我们都需要在cpu中先把贴图进行解码然后再转换成纹理格式。举个例子如果我们需要在shader中使用一张png贴图,我们需要经历以下步骤:

文件从磁盘读取到内存 - > 解码png文件将其转换成原始位图 - > 编码成纹理格式 - > 上传到显存中

在运行时将贴图格式转换成纹理格式,这个我们是无法接受的,因为这会严重影响场景的加载时间,通常我们会在打包的时候将贴图格式转换成纹理格式,比如unity将资源打包成assetbundle。

贴图格式的选择会影响打包的速度,比如png的压缩率要比tga的高,因此png加载到内存的速度要明显快于tga,但是tga的解码速度会比png快。我们可以在图片加载到工程的时候将其转换成原始位图缓存起来,等打包的时候将其转换成对应平台的纹理数据。如果是这样做的话,只要保证精度使用什么贴图格式其实就不重要了,因为都会被统一转换成原始位图。

有些贴图格式比如DDS是专门为3D渲染设计的,它里面直接存储了纹理格式的数据而且还支持mipmap,纹理数组,立方体贴图等图形渲染相关的信息,我们可以通过外部工具将其他贴图格式转换成对应的dds文件,然后在引擎中直接读取这个文件就可以了。这种类型的文件和assetbundle中存储的纹理数据是一致的。

压缩纹理格式

dxt/pvr/etc这些格式是针对不同平台的压缩纹理格式,它们都可以被gpu解码,为什么要有压缩纹理格式,第一可以减少内存到显存传输的带宽压力,第二可以减少内存和显存的占用,这些格式无需在cpu端进行解压,直接传输给gpu即可使用。由于压缩算法的关系对贴图的分辨率可能会有一些限制,比如dxt块压缩算法要以4x4的像素块为基础进行处理,所以纹理的尺寸必须是4的倍数。通常对于模型纹理我们针对不同平台使用不同的压缩纹理格式,而UI这种对精度要求比较高的资源我们使用非压缩的纹理格式。

客户端大小及网络流量的问题

通常我们会将游戏资源(包括压缩纹理)使用标准压缩算法进行二次压缩,这样可以降低客户端的大小以及更新时的网络流量。客户端可以直接加载压缩的文件然后在运行时进行解压,这样可以减少IO时间。

早期的移动端游戏为了导量容易,对客户端的大小有严格的要求,我们可以使用压缩率更高的贴图格式存储资源,然后在初次启动游戏的时候进行转换,或者运行时转换,但这种做法我个人是觉得不可取的,运行时转换会导致内存爆增也会导致频繁的创建和销毁内存,这些都会影响加载的时间,与加载速度相比客户端大小就没有那么重要了,以后的5G时代,客户端大小更不是问题了。

版权声明:本文为CSDN博主「隐士低手」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liran2019/article/details/108466327

最新文章