Telemetry 是一款 CPU 性能剖析工具,最大的特点是能够在对游戏运行影响非常小的情况下获取非常详尽的运行时信息。以前在 Unreal 上工作时,我曾短期使用过 Telemetry 2,当时让我大开眼界的是,它不仅能对性能数据做详尽直观的可视化展现,而且有着难得的实时响应和平滑流畅的操作体验——这种数据采集实时性和操作响应实时性结合起来,使得跟其他的工具比起来,Telemetry 出奇的容易使用——基本上有经验的程序员捡起来,不到一分钟就能开始做分析和诊断了。
前段时间我有机会看到了新版的 Telemetry 3 演示。其中让我印象最深的一个新版本功能,就是可视化的线程相关性——新的 Telemetry 可以用色块高亮提示不同线程之间 lock/wait 等同步的情况。现场拍了一张,见下图:
上图中,当鼠标指向某个线程的某一段执行开销时,绿色的色块高亮出与之相关的其他线程的活动。这个功能不仅让性能消耗一目了然,而且对辅助理解程序的行为也大有帮助(尤其是 deadlock / contention 相关的问题的调查)。
由于 Telemetry 是支持写入到文件的,我们可以让 QA 的同学开着跑这一类难以重现的问题,跑出问题时直接上传录下来的文件就好了。顺便说一句,Telemetry 的 overhead 很低,据说新版本每秒钟可以有上百万个计时块,对宿主本身执行效率的干扰很低。
注意,观察上图中每个线程时间线上的标签,可以看到,这个线程在那一刻活跃的执行时间内跑在哪个物理核上,以及对应的 context switch 时间开销。(现场没拍照,这是视频截图,不够清晰,见谅)
所有锁的时间开销汇总在最后,这样可以得到线程间共享资源的整体利用情况。
上图中可以看到按照CPU上每个核的执行情况组织的时间线。这样就可以针对不同的上下文灵活安排更合理的 thread affinity。
上图中可以看到手动打点的事件,这些定制事件可以跟内建的性能统计结合起来看。对那些在时间线上(单帧内)不是很显眼的函数,也可以通过汇总的列表来查看在整个生命周期中的累计开销情况。
在与 RAD 的工程师交流时,他们提到,RAD 正在开发 Telemetry 的 Mac 版。对于使用 Unity 来开发 iOS 移动游戏的团队来说,这不啻是打开了 Unity Profiler 之外的另一扇门。由于 Unity 工程的 iOS 版本经由 il2cpp 转化为 C++ 代码,理论上仅需对生成的 C++ 代码做简单的集成,即可使用 Telemetry 剖析 iOS 上的应用性能情况。这对于工具链相对不足的 mac/ios 来说,应会有不小的助益。
(全文完)