LibGDX图形模块之剖析

本文介绍的实用工具可能会派上用场,以防遇到性能问题,并需要开始分析你的游戏。

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提供以下信息:

  1. OpenGL总数量
  2. draw调用次数
  3. 纹理绑定量
  4. 着色器开关量
  5. 已使用顶点的数量

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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 1 前言 一直想沿着图像处理这条线建立一套完整的理论知识体系,同时积累实际应用经验。因此有了从使用AVFounda...
    RichardJieChen阅读 5,642评论 5 12
  • 在OpenGL中,大量的数据在着色器中传递,数据通过Buffer和Texture两种形式组织。 1 缓存(Buff...
    RichardJieChen阅读 7,952评论 1 10
  • 转自:http://blog.csdn.net/highning0007/article/details/3799...
    某人在阅读 1,643评论 0 0
  • 本篇文章是基于谷歌有关Graphic的一篇概览文章的翻译:http://source.android.com/de...
    lee_3do阅读 7,088评论 2 21