为什么游戏在libgdx中运行缓慢?

时间:2013-06-27 15:58:35

标签: libgdx

我在Libgdx制作赛车游戏。我的游戏apk大小是9.92 mb,而我使用的是四个总大小的纹理包装器是9.92 Mb。我的游戏在桌面上运行,但它在Android设备上运行速度非常慢。它背后的原因是什么?

8 个答案:

答案 0 :(得分:33)

编程时我们忽略了一些漏洞。 桌面处理器功能更强大,因此游戏可以在桌面上流畅运行,但在移动设备上可能会变慢。

以下为优化游戏流程应遵循的一些关键注意事项:

  1. 渲染方法中没有I / O操作。
  2. 避免在渲染方法中创建对象。
  3. 必须重复使用对象(例如,如果您的游戏有1000个平台,但在当前屏幕上,您只能显示3个,而不是使1000个对象生成5或6并重复使用它们)。您可以使用LibGdx提供的Pool类进行对象池化。
  4. 尝试仅加载必须在当前屏幕上显示的资源。
  5. 如果调用垃圾收集器,请尝试检查logcat。如果是这样,那么尝试使用对象类的finalize方法来查找哪些类对象被收集为垃圾并尝试对其进行改进。

    祝你好运。

答案 1 :(得分:17)

我有一些提高性能的其他提示:

  1. 尝试在渲染循环中最小化纹理绑定(或者在制作3D游戏时通常绑定)。在绑定另一个纹理单元之前,使用纹理图集并尽可能经常在绑定后使用一个纹理。
  2. 不要显示不在视锥/视口中的内容。首先计算是否有活动相机甚至可以看到绘制的对象。如果没有看到,请不要在渲染时将其加载到GPU上!
  3. 不要在渲染循环中经常使用spritebatch.begin()或spritebatch.end(),因为每次开始/结束时,它都会被刷新并加载到GPU上以呈现其内容。
  4. 渲染时不要加载资源,除非你在另一个线程中执行过一次。
  5. 最新版本的libgdx还提供了一个GLProfiler,您可以在其中测量每帧有多少绘制调用,纹理绑定,顶点等。我强烈推荐这个,因为总会有一些情况你不会期望内存/计算使用的开销。
    1. 使用libgdx Poolable(接口)对象和Pool来池化对象并最大限度地缩短创建对象的时间,因为对象的创建可能会在游戏渲染循环中引起微小但明显的断断续续。
  6. 顺便说一句,没有任何额外的信息,没有人会给你一个好的或精确的答案。如果您认为为您的问题撰写足够的文本或信息是不值得的,那为什么值得回答呢?

答案 2 :(得分:1)

要真正了解游戏运行缓慢的原因,您需要对自己的应用进行分析。

可以使用免费工具。

在桌面上,您可以使用VisualVM。 在Android上,您可以使用Android Monitor。

通过剖析,你会发现哪些方法占用的时间最多。

减速的可能原因是纹理绑定。你经常在不同的打包纹理页面之间切换吗?在切换到另一个页面之前,尝试从一个页面绘制所有内容。

答案 3 :(得分:1)

答案可能只是“计算机快速;手机速度慢”。相反,重要的是要注意,您的计算机Java VM可能是Oracles非常优化的JVM,而您的手机的Java VM可能是Dalvik,对于其性能而言,它没有对对象创建和管理进行相同的优化。 / p>

正如其他人所说,libGDX正是出于这个原因提供了一个Pool类。看看这里:https://github.com/libgdx/libgdx/wiki/Memory-management

答案 4 :(得分:0)

LibGDX中一个非常重要的事情是你应该确保有时从内存加载资产不能进入render()方法。确保您在正确的时间加载资源,并且它们不会进入渲染方法。

另一个非常重要的事情是尝试计算你的数学并使其独立于渲染,因为你的下一帧不应该等待计算发生......!

这是我在制作Snake game Tutorial时遇到的两件大事 谢谢,
Abhijeet。

答案 5 :(得分:0)

我发现的一件事是绘画是滞后的。这意味着如果您要绘制屏幕外项目,那么它会使用大量无用的资源。如果你只是在绘图之前检查它们是否在屏幕上,那么你的表现会令人惊讶地提高。

答案 6 :(得分:0)

需要思考的问题(来自个人经历)

  1. 不要继续在渲染方法中调用一个函数来更新时间,HUD上的分数(仅在需要时才进行这些更新,例如当分数仅增加时更新分数等)

  2. 根据具体情况拨打电话(在某种情况下进行更新,而非所有时间) 例如。在60FPS的渲染方法中调用/更新 - 意味着你需要每秒更新一次,每秒更新60次)

  3. 这些要点会对表现产生巨大影响(竖起大拇指)

答案 7 :(得分:-3)

您需要检查游戏的图像大小。如果图像大小超过图像大小,请使用以下链接“http://tinypng.org/”。 它会对你有帮助。