whoimi

A geek blog

View on GitHub

美术资源优化思路与原理

美术资源可能带来的性能问题

  1. 游戏内存: 场景当中要绘制的所有东西都需要保存到内存中,其中最重要的就是:模型、贴图

  2. drawcall:每绘制一种东西(不同的模型:即使是相同的材质球也算不同的模型,除非合并他们的mesh),内存都需要把相关的渲染参数、模型数据、贴图数据传递到GPU,这个速度非常慢,所以看到的模型越多,drawcall越多。

  3. GPU渲染速度:模型的材质越复杂,渲染越慢。这个靠TA来制定标准即可。

美术制作资源是需要关注前两点。

场景美术资源优化策略

场景美术资源优化主要有个以下方面:

  1. 模型拆分,模型组件复用:美术制作场景时,复用模型资源进行摆放。只是为了提升工作效率,拆分之后还是需要尽可能使用相同材质,最终还是要合并。

  2. 贴图Tiling,贴图复用:能够直接降低内存开销。为了效果可以使用更少、分辨率更高的贴图。

  3. 材质复用:不同的模型使用同一个材质球(必须是同一个材质球,而不是不同的材质球同一个参数。)材质复用的目的,是最终要合并网格以减少drawcall,如果不合并那么材质复用就没有意义。 Dynamic Batch 就是这个原理,但是他会在内存生成一份合并后的mesh,相当于内存占用翻倍,浪费内存。Static Batch也是一样,只不过是静态合并好。但是合并的物体覆盖全场景。还会导致遮挡剔除失效,同样占内存。

  4. Prefab复用(包括组件的Prefab,完整模型的Prefab):直接提升资源利用率。这种服用就是一模一样的mesh和材质,可以直接合并。

游戏性能瓶颈:模型

由于场景资源复杂,可能遇到的性能瓶颈:

  1. 模型数量:模型数量越多( 一个submesh算一个模型 )drawcall越多,成正比。

  2. 一个模型的面数:模型越大,越占内存。(不使用static batch的原因)。

  3. 模型属性太多(比如各个uv通道全部使用,normal、tangent全部使用):属性使用的越多,越占内存。

模型的内存开销=模型数量 * 一个模型的面数 * 模型属性

模型的drawcall 开销= 场景中的模型数量。

游戏性能优化:模型

  1. 美术在3Dmax当中合并不同的mesh。(相同材质的合并,通过合理分布uv可以让大部分mesh复用同一个材质)。能够在模型总内存消耗不变的情况下降低drawcall。

  2. 如果材质的属性不使用,就不要输出,例如:第二套uv,顶点色,切线信息。直接降低内存开销。

  3. 控制模型面数,场景当中看不到的面裁切掉。直接降低内存开销。

游戏性能瓶颈:贴图

  1. 场景中涉及到的贴图数量越多,内存占用越大。(例如:一张1024*1024的三通道贴图,相当于一个100万点的只记录了顶点位置的模型,相当于10万顶点并记录了顶点色的模型),美术需要考虑模型和贴图之间的平衡。

  2. 场景中涉及到的贴图越大,内存占用越多。

  3. 场景中涉及到的贴图开启mipmap占用内存越多。

  4. 如果贴图不在场景中,那他就只是占用内存而已。

贴图内存开销= 贴图数量 * 贴图大小。

贴图drawcall开销 = 基本只和内存有关。

*注:“场景当中涉及到的”指的是客户端从硬盘加载到内存的场景数据。

游戏性能优化:贴图

贴图内存开销= 贴图数量 * 贴图大小。

  1. 使用Tiling方式的贴图。减小贴图大小。

  2. 提高利用率。减少贴图数量。

游戏性能瓶颈:材质

  1. 场景中涉及到的材质数量越多drawcall越多。

  2. 场景中涉及到的材质使用的贴图越多占用内存越多。

材质内存开销 = 几乎不考虑。

材质drawcall开销= 主要看mesh,因为如果同一个mesh 使用不同的材质,那么drawcall还是两个。

材质复用的真正目的是为了能够合并场景中使用相同材质的mesh。以直接减少drawcall。

游戏性能优化:材质

材质复用的真正目的:为了能够合并场景中使用相同材质的mesh,以直接减少drawcall。

  1. 使用相同的材质 + 不同的mesh 的策略来实现丰富的表现,方便合并。例如:用刷顶点色,代替mask贴图。

  2. 材质复用优先于mesh复用:如果mesh复用,而使用了不同的材质,那么drawcall不能再减少了。如果复用了材质(同一个材质球),而使用了不同的mesh,那么有很多方法来合并mesh以减少drawcall。