Unity GC Cheatsheet

关于 Unity 的垃圾回收 (GC) 你可能已经看到不少的文章讨论了。下面是一个极简形式的 Cheatsheet,希望能在最小的篇幅内尽可能全面地列出关于 GC 你需要注意的事项。

Unity GC Cheatsheet

a01. struct Foo 在栈上,但 struct Foo[] 分配在堆上

a02. GetType() 会产生 GC Alloc (每个调用 20 Bytes)

a03. delegate 的创建时

a04. delegate 尽量使用 =,避免无意的 += 导致 InvocationList 的增长

a05. 在针对 GC Alloc ......

Unity MemoryProfiler 的工作机制及可能的改进

Unity 的开源内存分析工具 MemoryProfiler 非常有用,可以提供所有由 Unity 分配的 C++ 对象的内存信息,在该工具内被称为 NativeUnityEngineObject (Native-only Mode)。当 C# 脚本经由 il2cpp 编译为 C++ 时,此工具可以提供额外的所有 C# 对象的信息,在该工具内被称为 ManagedObject (Full Mode)。

本文简单地描述了该工具的工作机制,并探讨了一下基于该工具的一些可能的改进。

工作机制

这个工具中所能提供的所有的内存数据均来源于一个 Unity API:

UnityEdi......

Unity 协程运行时的监控和优化

协程 (Coroutine) 是大部分现代编程环境都提供的一个非常有用的机制。它允许我们把不同时刻发生的行为,在代码中以线性的方式聚合起来。与基于事件与回调的系统相比,以协程方式组织的业务逻辑,可读性相对好一些。

Unity 内的协程实现是传统协程的简化——在主线程内每一帧给定的时间点上,引擎通过一定的调度机制来唤醒和执行满足条件的协程,以实际上的分时串行化执行回避了协程之间的通信问题。但由于种种因素,协程的执行情况对程序员而言相对不那么透明,可以通过一些简单的机制来对其进行监控和优化。

Warm up: 从复用 Yield 对象说起

先从一个最简单而直接的改进开始吧。下面一......

Unity 游戏的 string interning 优化

Unity 游戏的 string interning 优化

问题描述

在开始之前,先说一下这个问题为什么很容易被忽视吧。

通常情况下,我们难以注意到运行着的 Unity 程序内 string 的实例化情况。这些字符串的创建,销毁的时机是否合理,是否存在有重复 (相同内容的字符串),冗余 (存有已不再有意义的垃圾字符),低效 (capacity 远大于 length),以及泄漏 (没有在期望的时机及时销毁) 的情况就更容易被忽视了。由于 string 没法随时像普通的 Unity 对象那样通过调用 Object.GetInstanceID() 来查看实例id,我们不太容易感知字符串......

(Unity) 为动态加载的 C# DLL 添加调试支持

昨天遇到了一个 C# DLL 动态载入后调试信息缺失的问题,今天上午解决后记录一下,以便遇到这个问题的同学可以参考。

(注)此文中的截图内文字偏小,可以 Ctrl + 鼠标滚轮放大查看。

问题描述

我们知道,Unity 中的 Debug.Log() 系列函数不仅能输出用户内容,而且能通过类似 StackTraceUtility.ExtractStackTrace() 这样的机制把该输出对应的堆栈打出来;当用户代码出现未捕获异常时,Unity 也会利用该机制输出异常及相关的完整堆栈信息。

如这个函数:

void PrintStacktraceOrdinary()......

知识共享许可协议
本作品由Gu Lu创作,采用知识共享Attribution-NonCommercial-NoDerivatives 4.0 国际许可协议进行许可。