本文介绍的实用工具可能会派上用场,以防遇到性能问题,并需要开始分析你的游戏。
FPSLogger
FPSLogge是一个简单的帮助类,用于记录每秒刷新的帧数。 只需在渲染方法中调用log()方法即可。记录每秒输出一次。
PerformanceCounter性能计数器
PerformanceCounter跟踪特定任务所需的时间和负载(总时间的百分比),在启动任务之前调用start(),然后结束时调用stop()方法.如果需要,您可以多次执行此操作,每个渲染或更新调用tick()来更新值,FloatCounter可以访问该任务所需的最小时间,最大时间,平均时间,总时间和当前时间。 还有负载值,也就是总时间的百分比。
OpenGL
剖析
分析您的游戏运行时发生的实际OpenGL调用通常不是很容易,因为libGDX尝试抽象所有这些低级别的东西。 为了能够收集这些信息,可以使用GLProfiler类。
要启用它,你必须调用静态方法GLProfiler.enable()。 在幕后,这将替换原来的GL20和GL30实例(Gdx.gl等)的剖析器。
现在开始监控实际的GL调用.您可能感兴趣的一个信息是发生的纹理绑定的数量,当然这代价也很昂贵,可能会减慢您的游戏。 要优化这个您可能会开始使用TextureAtlas。要获取纹理绑定数量,您可以从分析器读取静态字段GLProfiler.textureBindings。
您也可以执行类似于剔除操作来仅渲染在屏幕上可见的那些东西。 静态字段GLProfiler.drawCalls将显示这些优化的结果。
目前,Profiler提供以下信息:
- OpenGL总数量
- draw调用次数
- 纹理绑定量
- 着色器开关量
- 已使用顶点的数量
GLProfiler.vertexCount实际上是一个FloatCounter。 除了GLProfiler.vertexCount.total,它还有更多的信息,如GLProfiler.vertexCount.min,GLProfiler.vertexCount.max或GLProfiler.vertexCount.average。
一旦您读取并显示它们(可能每帧一次),为了重置所有这些数字,您必须调用GLProfiler.reset()方法。 要完全禁用性能分析并使用原始GL20和GL30实例替换Profiler,请使用GLProfiler.disable()。
请注意,如果您使用Gdx.graphics.getGL20()或Gdx.graphics.getGL30(),您将绕过性能分析器,这就是您应该直接使用Gdx.gl20或Gdx.gl30的原因.
如果你想了解更多Profiling的使用方法,可以参考Benchmark3DTest
错误检查(自1.6.5起)
GLProfiler有一个更有用的功能,那就是错误检查。
几乎所有GL调用在某些情况下都会产生错误。这些错误不会像Java错误那样抛出或记录下来,但是必须明确地检查这些错误(Gdx.gl.getError()),因此可能很难找到。启用GLProfiler(见上文关于如何启用)将在每次GL调用后自动检查GL错误并进行报告.
默认情况下,遇到的错误将打印到控制台(使用Gdx.app.error)。 但是,可以通过在GLProfiler.listener中设置不同的错误侦听器来定制(例如,用于自己的日志记录/崩溃报告系统)。
如果您想知道代码中发生错误的位置,您可能需要使用GLErrorListener.THROWING_LISTENER,它会显示堆栈跟踪并显示出错的位置
附上测试例子 GLProfilerErrorTest
apitrace
apitrace is an open source cross platform debugger and profiler for OpenGL. You run the tracer to record the state and each call (including contents of buffers). You then run the viewing tool will read the trace and playback any state at any point in time. It breaks down the cpu/gpu time, every single OpenGL call. You can see the contents of the framebuffer and each texture bound at any point you choose.
Running: For linux, do: apitrace trace java -cp /home/me/my-app/desktop/build/libs/*.jar -Dorg.lwjgl.opengl.libname=/usr/lib/apitrace/wrappers/glxtrace.so com.my.app.desktop.DesktopLauncher
Then just exit your app (if you want), run qapitrace
and open that trace file.