Unity3D 的大场景内存优化

游客

标题:Unity3D 的大场景内存优化
正文:
我们公司的一个 MMORPG 项目最近在内存方面碰到了红线，昨天开会讨论了一下。我提出了一个改进方案，写篇 blog 记录一下。问题是这样的。在当下的手机及平板硬件设备条件下，操作系统留给应用的可用内存并不多，大约只有 500M 左右。和 PC 环境不同，手机上是交换分区的机制来对应一些临时突发性内存需求的。而手机必须保证一些系统服务（某些高优先级后台业务）的运行，所以在接电话、收取推送等等意外任务发生时，有可能多占用一些内存，导致操作系统杀掉前台任务让出资源。根据实际测试，游戏想跑在当前主流高端手机上必须把自己的内存占用峰值控制在 400M 内存以下，350 M 会是一个合理的值，而这个值是远远低于 10 年前的 PC 游戏标准的。而我们的项目却是一个写实类型的 拥有大场景的 MMORPG 。Unity3D 是在智能手机普及以前设计的，远没有料到会被广泛用于手机游戏的制作。它在设计之初并没有为低内存环境考虑。内存使用太粗犷，是在使用 Unity 开发 MMORPG 项目时最被吐槽的一点。为手机游戏定制游戏引擎，最特别的，和 PC 游戏不同的两点就是内存必须严格控制、能耗必须严格控制。比如在我们开发的 ejoy2d 中，会为资源数据中的项目引用定制短指针，即资源内部的相互引用使用 32bit 偏移量来代替 64bit 指针，每个指针节省出 4 字节内存；变换矩阵使用 6 个 32bit 的定点数，资源中相同矩阵共享一份数据；资源数据尽量连续存放，避免小数据块太多造成内存碎片浪费内存等等。这些显然是 Unity 没花精力去做的。在 PC 上，省下几M 几十M 内存微不足道，但在手机上很可能就是生死之间。ps. 能耗问题是另一个有趣点。在 PC 上你可以通过多线程并行，压榨出高 fps ，可以不管 CPU 多烫；但是到了手机上，即使 CPU 8 核心已经是标配，还是尽量不要这么做。因为在总任务相同的情况下，单线程能做完的工作只要拆分到多线程上完成，就一定意味着总工作量增加（至少增加了线程间协调的工作）。增加了总能耗。玩家是不想玩一个插着充电线也会玩关机，手机滚烫的游戏的。这个问题有机会我另写一篇 blog 展开，今天是想谈谈内存。在我们最近的测试中，在较坏情况下，我们的游戏会占到 360M 内存左右，已经接近了内存红线，所以要考虑进一步的优化。其中，较大的一
[<<][[1]][2][3][>>]

查看评论(0)
发表评论

首页