obsidian/笔记文件/2.笔记/Unity性能优化_第三章.md
2025-03-26 00:02:56 +08:00

4.7 KiB
Raw Blame History

Unity DOTS

DOTSData-Oriented Technology Stack是Unity引擎中的一个新的编程模型和工具集。它旨在提供更高性能、更可扩展和更并行化的游戏开发体验。

DOTS中包含了三个主要部分

1、ECS框架ECS是一种用于组织和管理游戏对象的方式。它将游戏对象分解为实体Entity、组件Component和系统System。这种模式更加适合于并行处理和优化可以提高游戏性能。

2、Job System作业系统Job System允许开发者将任务并行化利用多核处理器的能力。它通过将任务划分为小的作业jobs并在多个线程上并发执行来提高性能。Job System还可以与ECS结合使用使得开发者可以更好地控制游戏的行为。

3、Burst Compiler突发编译器Burst Compiler是一种高性能的C#编译器可以将C#代码转换为高效的本机代码,以进一步提高游戏的性能。

DOTS的目标是为游戏开发者提供更好的性能和可扩展性并更好地利用现代硬件的并行能力。它适用于需要处理大量实体和需要高性能的游戏项目。

Unity Frame Debugger窗口帧调试器窗口

Frame Debugger窗口也叫帧调试器窗口用于查看每一帧的画面是如何渲染出来的可以详细查看这一帧的绘制过程。

打开Frame Debugger面板的方式 Window——Analysis——Frame Debugger

按下“Enable”则会启动帧调试此时如果运行了游戏则会自动暂停然后当前这帧的渲染情况可以在这个窗口中查看。

上方的 X of X 表示绘制过程中有多少步,可以查看下一步或上一步。

如果要禁用帧调试可以按下“Disable”。

用Frame Debugger窗口查看当前一帧的每一步时可以配合Stats窗口使用以此来确定哪一个物体造成的性能开销较大。

绘制的步骤越少,性能越好。

Frame Debugger窗口也能看到每一帧的Shader信息但是需要有一定Shader基础才能看懂。

    大多数平台都支持帧调试器的使用可以用手机的数据线成功连接到电脑在手机上运行Unity的游戏Frame Debugger窗口中会多出该手机设备供我们选择我们就可以分析该手机设备上运行的Unity项目的性能。
    也可以让手机和电脑都连接同一个wifi这样一来Frame Debugger窗口中也会多出该手机设备供我们选择我们就可以分析该手机设备上运行的Unity项目的性能。
    但是要注意构建时必须在Project Settings窗口中勾选“Development Build”。而且有些平台可能不支持Frame Debugger的使用例如WebGL平台。

Unity GPU Instancing

GPU Instancing是Unity的一种优化技术。

使用GPU Instancing可以在一个Draw Call中同时渲染多个相同或类似的物体从而减少CPU和GPU的开销。

官方文档:https://docs.unity3d.com/Manual/GPUInstancing.html

要启用GPU Instancing我们可以选中一个材质然后在Inspector窗口勾选Enable GPU Instancing这样就可以了。

但是即使勾选了Enable GPU Instancing也不一定会成功。

要成功使用GPU Instancing进行优化游戏对象必须同时满足以下条件 1、使用相同的材质和网格。 2、材质的着色器必须支持GPU Instancing。例如标准着色器和表面着色器就支持GPU Instancing。 3、网格的顶点布局和着色器必须相同。如果网格的顶点布局或着色器不同那么它们就无法被合并成一个实例。 4、每个实例需要有不同的变换信息例如位置、旋转、缩放。虽然多个实例可以使用相同的材质和网格但是它们必须拥有不同的变换信息才能被正确地实例化并渲染出来。 另外需要注意的是GPU Instancing与SRP Batcher不兼容。如果项目使用了SRP Batcher并且配置为优先使用SRP Batcher而不是GPU实例化启用GPU实例化可能不会生效。SRP Batcher是Unity提供的一种渲染优化技术它可以将多个网格合并成单个批次进行渲染从而提高性能。在这种情况下GPU实例化将被忽略。

使用GPU Instancing往往能减少CPU和GPU的开销提升游戏性能但同时也会占用一定的内存。

是否要启用GPU Instancing要根据自己的项目来定。可以尝试启用在性能分析器中看看效果如果如果效果好再确定启用它。

一般来说当场景中有大量重复的网格实例时可以尝试启用GPU Instancing。例如场景中有大量树木、草地、石块等这些实例具有相同的网格和材质只是位置、颜色等属性稍有差异那么启用GPU Instancing或许能够显著提高性能。