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

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

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

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

贴图格式与纹理格式

纹理格式是为显卡设计的,对于显卡来说,贴图资源就是一块显存,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时代,客户端大小更不是问题了。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值