Unity 配置窍门:内存,音频和纹理

来源:互联网 发布:怎么开发一个软件 编辑:程序博客网 时间:2024/06/06 02:14

本篇博客由英特尔视觉计算部应用工程师 Steve Hughes 编写而成,主要介绍关于内存优 化和处理纹理方面的提示与技巧。 更多信息请参阅 Steve 和 Cristiano 的 文章 (大部分技巧同时适用于 Windows 和 Android)和我的Unity 与 英特尔® 实感™ SDK 使用技巧

处理纹理                                                                                                              

  • 除非真正需要,否则不要创建面向纹理 的 Mipmap
  • 使用压缩纹理
  • 除非需要,否则不要将纹理设置为可读 状态(CPU 读/写)。 这样可避免额外的 CPU 副本,标记等。
  • 根据屏幕分辨率缩小纹理
  • Android 和小屏幕:
    • 关于模型 - 跳过 顶部的 MIP ( Quality Settings>Rendering>Texture Quality) 
    • 将 RGB(可压缩) 和 Alpha(不可压缩)通道分开

设计技巧

  • 常见地图不需要 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 使用技巧
0 0
原创粉丝点击