Dorothy SSR性能参数介绍

DorothyStats

  Dorothy SSR的程序中如果打开Director.displayStats = true,或是每帧调用ImGui.ShowStats(),就会在界面上展示一些引擎性能相关的参数。这些参数包括渲染器(Renderer),多线程渲染(Multithreaded),主渲染缓冲区的大小(BackBuffer),底层图形接口调用次数(Draw Call),逻辑处理时间(CPU Time),图形处理时间(GPU Time),帧间隔的时间差(Delta Time),C++对象数量(C++ Object),Lua对象数量(Lua Object),Lua回调函数数量(Lua Callback)。这些参数的含义如下:

Renderer

  当前使用的渲染底层的图形接口,可能是OpenGL、OpenGLES、DirectX9~12、Metal和Vulkan等等的之一。编译bgfx库时可以将Renderer配置为要使用的类型,然后就可以在不同的平台上使用不同的底层图形接口来改善渲染性能。

Multithreaded

  显示当前环境是否为多线程渲染,可以通过bgfx的编译选项开启或是关闭多线程渲染的特性。

BackBuffer

  主渲染缓冲区的大小,当前使用的缓冲区越大,预示着GPU要做的渲染处理也可能更多。可以简单当做是当前程序窗口的像素大小。

Draw Call

  底层图形接口的调用次数,图形接口的调用,包括设置渲染状态,传输渲染数据之类的操作。这些操作调用的次数减少对改善性能会有一定的帮助。

CPU Time

  过去1秒内的目标游戏帧中,平均每帧处理逻辑花费的时间。如果目标帧数设置为60FPS,那么每当过去60帧就会计算更新一次这个显示参数。因为逻辑处理和渲染处理不是不同的线程里执行,所以只要CPU Time的消耗小于16.67毫秒就不会成为导致游戏卡顿的原因。

GPU Time

  过去1秒内的目标游戏帧中,平均每帧处理渲染花费的时间。这个时间不包括交换渲染缓冲区(swap buffers)和等待垂直同步花费的时间。如果目标帧数设置为60FPS,那么每当过去60帧就会计算更新一次这个显示参数。因为逻辑处理和渲染处理不是不同的线程里执行,所以只要GPU Time的消耗小于16.67毫秒就不会成为导致游戏卡顿的原因。

Delta Time

  过去1秒内的目标游戏帧数中,平均两帧之间间隔的时间差。如果目标帧数设置为60FPS,那么每当过去60帧就会计算更新一次这个显示参数。注意CPU Time加上GPU Time并不会等于Delta Time。开启了垂直同步时(View.vsync = true),GPU处理的交换渲染缓冲区操作一般会每1.0/60秒才会执行一次,GPU完成处理后消耗时间还不到1.0/60秒时图形API会Block住当前程序并等待显示设备的垂直同步信号,等到信号后交换缓冲区并且开始跑下一帧,这时Delta Time就会等于GPU时间加上等待垂直同步消耗的时间。如果这时CPU Time大于1.0/60毫秒,这一帧内GPU没有等到CPU有发出渲染命令,并且还错过了一个垂直同步周期,这时的Delta Time就会等于CPU Time加上GPU Time再加上重新等待垂直同步的时间。所以用Delta Time判断性能情况会不太准确,建议只作为参考。

C++ Object

  游戏中创建的所有继承自Object类的C++对象的数量。可以粗略地通过观察这个参数分析是否出现对象的内存泄露或是在C++中出现无法释放的循环引用。另外还有一个相关的参数可以通过Object.maxObjectCount获取,表示同时存在的C++对象的峰值数量,如果这个参数过高的话,表示可能在某些逻辑中产生了大量的临时对象。

Lua Object

  所有被Lua VM引用的继承自Object类的C++对象的数量。可以粗略地通过观察这个参数分析是否存在被Lua长期引用而不被释放的C++对象。可以配合在Lua中提供的ubox()函数获取当前所有被lua引用的对象列表来进行跟踪。另外从性能指标上讲,这个参数越小对Lua GC扫描的压力就越小。另外通过Object.maxLuaRefCount可以获取另一个对象引用相关的参数,表示同时被Lua引用的C++对象的峰值数量。

Lua Callback

  所有被C++引用的Lua回调函数的数量。这些函数是在Lua中注册监听C++事件时所用的回调函数。实际上C++是无法直接引用Lua对象的,所以Lua会把C++要引用的函数放到一个Lua的数组里,然后返回数组的下标给C++引用,等待C++把这个函数使用结束后,返回这个下标让Lua清理相应被缓存的函数。这里的Callback性能参数也就是放在Lua回调缓存中的函数数量。有时候Lua引用了某C++对象,这个C++对象又保存了一个缓存的Lua函数的下标,不还给Lua,而这个函数又引用回了这个C++对象,这个时候就会形成无法释放的环形引用,而这个参数也是用来辅助监测这个问题是否存在的。

标题目录