帧调试器 (Frame Debugger) 可将正在运行的游戏的状态冻结到特定帧来自由回放,并查看用于渲染该帧的各个DrawCall。除了列出DrawCall调用,调试器还可逐个单步执行这些DrawCall,以便详细查看游戏视图是如何从场景的图形元素构建的。
Frame Debugger 🔗
使用帧调试器 🔗
Frame Debugger 窗口(菜单:Window > Analysis > Frame Debugger),打开后点击Enable,会显示DrawCall调用信息。 以上图为例,显示该帧有7次DrawCall,结合Profiler可以进一步确认 单独点击Frame Debugger左侧,可以查看DrawCall渲染顺序
RenderTarget面板 🔗
Channels:分别提供了仅仅显示对应颜色Channle。
Shader:渲染这个物体采用的是哪个Shader的哪个SubShader。
Blend:着色到目标的颜色混合规则。
ZClip:开启片元深度检测模式,如果一个片元在near与far的外面就会被丢弃。
ZTest:深度测试的规则,根据通过深度测试的才会被渲染。
ZWrite:是否将当前片元的深度信息写入深度缓存。
Cull:裁剪剔除的模式,有back, front, none三种模式,分别是裁剪剔除掉背对摄像机的面,裁剪提出掉真对摄像机的面和不裁剪剔除。
Why Drawcall cannot be batched?:不能合批的原因描述。
ShaderProperties:CPU传递给GPU的数据的详细信息。
注意事项: 🔗
当Frame Debugger点击Enable后,编辑器处于暂停状态,点击DrawCall渲染次序,可以发现某些时候,DrawCall次序会不同发生变化。
原因:当点击Frame Debugger不同DrawCall时,Unity会传递一帧,所以行为的Mono都会执行一次Update,因此Update里面的逻辑也会被执行。Unity使用Time.Scale = 0来实现暂停,Time.deltaTime将为零并且Time.time在下一帧中不会改变,如果Update逻辑中使用了改两个值逻辑也将保持不变。 但是 Time.unscaledTime 和 Time.unscaledDeltaTime 始终有效,即使编辑器已经处于暂停状态,Frame Debugger点击的时候DrawCall也会发生变化。
总之,如果Update方法中有一些逻辑,而不是使用 Time.scale计算时间,那么即使编辑器暂停,也会在帧通过时进行更改。
解决方案:可以通过使用UnityEditor.EditorApplication.isPaused在一些关键的Update进行检查即可。
#if UNITY_EDITOR
if(UnityEditor.EditorApplication.isPaused)
return;
#endif
结论 🔗
搬砖愉快!