本篇博客由英特尔视觉计算部应用工程师 Steve Hughes 编写而成,主要介绍关于内存优 化和处理纹理方面的提示与技巧。 更多信息请参阅 Steve 和 Cristiano 的 文章(大部分技巧同时适用于 Windows 和 Android)和我的 Unity 与英特尔® 实感™ SDK 使用技巧 。
处理纹理
| Image may be NSFW. Clik here to view. ![]() |
设计技巧
- 常见地图不需要 1:1 的比例和漫反射图。
- 删除动画中的冗余关键帧(仅进行更新以改变图形)
对于网格模型
- 删除网格中的不常用通道(在“Player”设置下方,启用 “Optimized Mesh Data”)
- 如果是低 RAM 系统中的高细节网格,请设置“Quality”以使用 “maxLOD”
如欲了解更多有关在 Unity 中优化图形的信息,请参阅: 如何使用 Unity 规划优化
音频
- 使用 200k 缓冲器支持音频回放
- 将已解压的片段加载至该缓冲器
- 或使用 AudioClip.GetData 解压,然后释放已解压的片 段
内存优化
- 有两种方法可查看是什么在占用 RAM
- Profiler.GetRuntimeMemorySize() 可以查看占用大 量 RAM 的对象(显示输出以调试日志)
- 查看单声道的 CIL(通用中间语言)以支持 3 种分配类型 — Newarr、Newobj 和 Box
- (基于资产使用历史)在启动时预分配内存空间,以手动扩展内存堆。
- 如有动态需求,调用 Resources.UnloadAsset (如果资产仍然需要引用)或使 用 Resources.UnloadUnusedAssets(针对未引用的资产)
- 由于Unity 的 “自动垃圾回收”通常只在内存堆已满或没有足够大的自由块的情况下才被调用 ,所以在进行层加载前后考虑调用 (System.GC..Collect),否则转换期间会出现清空现象。
- 避免使用包含大 量隐藏分配的函数
- 使用结构(保存在 堆栈上),而非类(保存在内存堆上),以避免出现内存碎片。
- 请记住,模拟器可 分配 RAM。 而且,(Foreach) 也可重新处理成可分配模拟器的代码块。
- 出于相同原因,请 避免使用匿名方法和 Lambda。
- 流资产占用的 RAM 较少,在构建时将相关资产收集至资产束,然后在运行时流 输出这些资产束。 (务必在下个场景或资产束流之前将其破坏)。
- 不要将字符串加在一起。 不要操作每帧字 符串(而是添加一个限制,以便您在它更改数值时仅进行升级。)
- 使用 StringBuilder 类生成字符串。不要在会返回字符串的函数内使用阵列,因为它将在循环内每 次都进行转储和重新分配。
- 创建资产池类(子弹/导弹)以保存对象, 而非多个 new-ing,比如:
MyClass m – poolOfMyClass //do stuff poolOfMyClass.Store(m);
致谢名单:以上部分内容来源于:
- Unity3.com 中的 内存资源
- Andrew Frey - 减少 Unity 中的内存使用,C# AND .NET/MONO
Gamasutra: 面向开发人员的 C# 内存管理(第 1 部分,共 3 部分)
如欲了解更多信息,请访问:
- https://software.intel.com/zh- cn/node/542152(大部分技巧同时适用于 Windows 和 Android)
- Unity 与 英特尔® 实感™ SDK 使用技巧。
Immagine icona:
Image may be NSFW.
Clik here to view.
Clik here to view.

Includere in RSS:
1