Unity 垃圾收集最佳实践
前言
最近在搞的一个 Unity 项目是以插件形式运行在服务端的,对内存碎片问题有比较高的要求,正好有机会深入学习了下 Unity 的 GC。这篇文章便是从 Unity 2019.4 官方文档 Garbage collection best practices 翻译、摘要而来。
正文
自动内存管理让你写起代码时又快又简单,还能减少出错。但是这种便利有可能带来性能影响。为了优化代码以提高性能,你必须避免频繁触发 GC 的情形。
最近在搞的一个 Unity 项目是以插件形式运行在服务端的,对内存碎片问题有比较高的要求,正好有机会深入学习了下 Unity 的 GC。这篇文章便是从 Unity 2019.4 官方文档 Garbage collection best practices 翻译、摘要而来。
自动内存管理让你写起代码时又快又简单,还能减少出错。但是这种便利有可能带来性能影响。为了优化代码以提高性能,你必须避免频繁触发 GC 的情形。
ScriptableObject 是一个数据容器类,可以用它来存储与类实例无关的数据。ScriptableObject 一个主要用途是利用它存储共享资源(比如 Prefab),减少无谓的复制,降低内存使用。
比如说,场景 A 和场景 B 都需要一个登录对话框。常规做法是创建一个 Prefab,分别在 A 和 B 中各自实例化;为了节省内存,可以在 ScriptableObject 中实例此 Prefab,在运行时将此 Prefab 实例添加到 A/B 场景中。
ScriptableObject 最典型的一个应用场景,便是用它来实现预加载了。
绝大多数应用里,都会有类似的业务逻辑:从 A 页面跳转到 B 页面,执行一系列操作后返回 A 页面。
这看似寻常的操作流程,Unity 是不能天然支持的。Unity 的 SceneManager 和 Android 的 activity stacks 在”页面”管理策略上大概有以下不同:
Unity 是微软旗下的跨平台游戏/应用开发工具,C# 自然成为其首推支持的前端开发语言。C# 虽是从 Java 脱胎而出,经过近二十年的独立发展,已经成长为一门明显优于 Java 的现代化语言(这当然是我个人的主观见解)。我也发愿以此项目为起点,重新掌握 C#/.NET 的技术体系。
开发阶段用的是 UnityEditor.EditorUtility.OpenFilePanel()
函数,简单易用。但是如其名所示,UnityEditor
只在 Unity 编辑器内可见,尝试 build 出 Windows 下 standalone 包时会报编译错误。
解决办法是用 mono 库下的相应功能实现打开文件。