浅谈Unity游戏内存优化(一)

发表于2017-09-30
评论0 2.6k浏览

这里和大家聊一下游戏中的内存优化。

游戏中的内存开销无外乎以下的三个重要部分:

  1. 资源内存占用;

  2. 引擎模块自身内存占用;

  3. 托管堆内存占用。

今天先谈以下第一个,也是游戏内存优化最简单,效果最明显的一个。

在一个较为复杂的游戏中,资源的内存占用约占据着总体内存的70%左右。因此,好不夸张的说,资源使用的合理与否直接决定了游戏的内存的占用情况,直接体现在游戏的流畅性上。

一般来说,项目资源的优化可以从一下几个方面入手:


1.UI纹理


纹理格式

一般来说,我们建议开发团队尽可能根据硬件的种类选择硬件支持的纹理格式,比如Android平台的ETC、iOS平台的PVRTC、Windows PC上的DXT等等。


纹理尺寸

一般来说,纹理尺寸越大,则内存占用越大。所以,尽可能降低纹理尺寸,如果512x512的纹理对于显示效果已经够用,那么就不要使用1024x1024的纹理,因为后者的内存占用是前者的四倍。因此,如果有比较长的ui资源,建立不要打进图集里,比如一个1024*2的图片,如果单独打成一个图集,纹理大小就是1024*1024,这个是很伤的。


Mipmap功能

Mipmap旨在有效降低渲染带宽的压力,提升游戏的渲染效率。但是,开启Mipmap会将纹理内存提升1.33倍。对于具有较大纵深感的3D游戏来说,3D场景模型和角色我们一般是建议开启Mipmap功能的,但是在平时的项目中,经常会发现部分UI纹理也开启了Mipmap功能。这其实就没有必要的,绝大多数UI均是渲染在屏幕最上层,开启Mipmap并不会提升渲染效率,反倒会增加无谓的内存占用。


Read&Write

一般情况下,纹理资源的“Read & Write”功能在Unity引擎中是默认关闭的。但是,我们仍然在项目深度优化时发现了不少项目的纹理资源会开启该选项。对此,我们建议研发团队密切关注纹理资源中该选项的使用,因为开启该选项将会使纹理内存增大一倍。




2.3D模型

对于一些带有3D模型的游戏,我们还可以从以下几个方面入手


使用一个单一的Skinned Mesh Rendere

应该对于每个角色仅使用一个skinned mesh renderer。Unity使用可见性裁剪和包围体更新的方法来优化角色的运动,并且这些优化只有在您使用一个运动组件和一个skinned mesh renderer时才会被激活。如果在一个网格的位置使用了两个蒙皮网格,那么该模型的渲染时间将变成原来的两倍。这样,这种做法与使用多个网格相比几乎没有任何实际的优势。


使用尽可能少的材质

应尽可能少的材质。在一个角色上使用多个材质的唯一理由应该是你需要在不同的部分使用不同的着色器(比如在眼睛上使用特殊的着色器)。但是,在大多数情况下,一个角色2-3个材质就已经足够了。减少draw call


使用尽可能少的骨骼

在桌面游戏中,一个骨骼结构大致使用15-60跟骨头。使用的骨骼数越少,您获得更好的性能。如果使用30根骨头的话,可以在桌面平台上达到非常好的质量,同时在移动平台上也会得到相当好的质量。理论上来说,在移动平台上应该保持骨骼数在30根以下,而在桌面游戏中也不要超过30根太多。


多边形数量

使用的多边形的数量取决于所需要的质量和您的目标平台。对于移动设备,每个mesh拥有300-1500个多边形的话将会达到比较好的效果,而对于桌面平台,这个理论范围大约为1500-4000。当然,如果游戏中任意时刻内屏幕上出现了大量的角色,那么您应该降低每个网格的面片数。比如,半条命2对于每个角色使用2500-5000个三角形面片。目前PS3或者Xbox360上的AAA级游戏中,每个角色大概拥有5000-7000个三角形面片。

移动游戏动态物体:300-2000面片

静态物体:少于500个面片  并在引擎中标记为static

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论