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

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

  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时代,客户端大小更不是问题了。

理解游戏中使用的贴图资源相关推荐

  1. 【Android 安装包优化】Android 中使用 SVG 图片 ( SVG 矢量图简介 | Android 中生成 Vector 矢量图资源 )

    文章目录 一.SVG 矢量图简介 二.Android 中生成 Vector 矢量图资源 三.参考资料 一.SVG 矢量图简介 Android SVG 参考文档 : https://developer. ...

  2. 如何快速找到最优路线?深入理解游戏中寻路算法

    如果你玩过MMOARPG游戏,比如魔兽,你会发现人物行走会很有趣,为了模仿人物行走的真实体验,他们会选择最近路线达到目的地,期间会避开高山或者湖水,绕过箱子或者树林,直到走到你所选定的目的地. 这种看 ...

  3. LayaBox游戏项目实录四:游戏中多边形属性雷达图

    目录 前言 准备知识 如何画多边形 画多边形: 画圆心点到多边形顶点的线段 绘制数据点组成的多边形 封装代码 外部调用 前言 游戏项目中经常用到多边形雷达图,来表示人物的属性分布: 像这种: (注:以 ...

  4. Unity中的法线贴图、漫反射及高光

    我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性.在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了. 我 ...

  5. unity 游戏中的寻路与导航系统(5种寻路算法详解)

    @了解游戏中常见的寻路方式 通常来讲一般是根据建模方式来决定寻路方式 常见的寻路方式--建模方式 这里提供一下三种建模方式的示意图,如下 ,分别对应着,原图.Grid.WayPoint.NavMesh ...

  6. 游戏中的人工智能AI设计

    因为在现在的项目中花了很大精力设计和制作怪物AI和技能,所以在这里也做个小总结. 什么叫做游戏中的AI        游戏中的AI可以简单的理解为计算机控制的智能角色,这些智能角色能够通过周遭环境或者 ...

  7. 游戏中的图像资源(位图与矢量图比较)

    当今游戏早已不再是黑白机的时代,游戏都由色彩丰富.精致的图像,流畅的动画构成.Flash游戏也不例外,Flash既支持矢量图又支持位图,他们各有优缺点.本文的目的即是介绍何时使用矢量图,何时使用位图, ...

  8. 游戏设计中的纹理贴图

    以下内容综合了维基百科,百度百科,各游戏开发论坛,博客等,有些地方并未详述来源: 若有冒犯版权,请留言,我将删除博文.谢谢 BMEM技术(凹凸映射Bump Mapping) BMEM技术通过一张叫做高 ...

  9. Unity 中渲染顺序的理解以及一些坑点 以及2.5D游戏中的渲染排序解决方案

    1.ZTest & ZWrite ZTest:深度测试,开启后测试结果决定片元是否被舍弃,可配置  ZWrite:深度写入,开启后决定片元的深度值是否写入深度缓冲,可配置 ZTest可设置的测 ...

最新文章

  1. VIM编辑器(第十章)
  2. Hbase写入量大导致region过大无法split问题
  3. 数据库连接池——C3P0:数据库连接池技术
  4. 4.等待链表与调度链表
  5. spark如何防止内存溢出_spark开发十大原则
  6. JavaScript基础学习之强制类转换(二)
  7. Web安全的三个攻防姿势
  8. 【BZOJ4035】数组游戏,博弈论+分块乱搞
  9. word2vec实例详解python_在python下实现word2vec词向量训练与加载实例
  10. 微信支付之JSAPI开发-第二篇:业务流程详解与方案设计
  11. Python的几个相关实例
  12. vue____后台管理系统搭建(推荐,懒得自己写了)
  13. 从零开始学androidNotification通知.四十四.
  14. MySQL工具【mysql 客户端连接工具】
  15. HDOJ1008 Elevator
  16. 2021年茶艺师(初级)考试内容及茶艺师(初级)考试总结
  17. Dm365 VPBE 后端模块讲解
  18. DOA算法3:Matrix Pencil
  19. hive中reduce类函数说明
  20. Mac Mini 安装Ubuntu20.04 KVM

热门文章

  1. 将本地图片转为url网络图片
  2. Java+Selenium3自动化入门9-Selenium中截图方法-TakeScreenshot
  3. OSGi 规范和框架 OSGi框架类加载机制 Java默认类加载器机制和OSGI类加载器机制比较
  4. 逆战———微信小程序
  5. IDM+百度云链下载网盘资源
  6. 集合石总显示服务器连线中,魔兽世界集合石地下城挑战活动火热开启
  7. php 获取 知乎,php - 如何获取知乎日报里的图片?
  8. iOSsqlite3的线程安全BUG IN CLIENT OF sqlite3.dylib:illegal multi-threaded access to database connection
  9. 计算机二级ms难度,为什么二级ms通过低
  10. SQL Server新建维护计划