陈巧倩

Frame Debugger

· 58 words · 1 minutes to read
Categories: Unity
Tags: Debugger

帧调试器 (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

结论 🔗

搬砖愉快!