我在 Libgdx 中制作赛车游戏。我的游戏 apk 大小为 9.92 mb,我使用四个纹理打包器,总大小为 9.92 Mb。我的游戏在台式机上运行,但在 android 设备上运行速度非常慢。背后的原因是什么?
8 回答
编程时我们忽略的漏洞很少。台式机处理器功能更强大,因此游戏可以在台式机上流畅运行,但在移动设备上可能会变慢。
以下是您应该遵循的一些关键注意事项,以获得最佳游戏流程:
- 渲染方法中没有 I/O 操作。
- 避免在渲染方法中创建对象。
- 必须重复使用对象(例如,如果您的游戏有 1000 个平台,但在当前屏幕上您只能显示 3 个,而不是让 1000 个对象生成 5 或 6 个并重复使用它们)。您可以使用 LibGdx 提供的 Pool 类进行对象池。
- 尝试仅加载那些必须在当前屏幕上显示的资产。
如果调用了垃圾收集器,请尝试检查您的 logcat。如果是这样,请尝试使用对象类的 finalize 方法来查找哪个类对象被作为垃圾收集并尝试对其进行改进。
祝你好运。
我有一些额外的提示来提高性能:
- 尝试在渲染循环中最小化纹理绑定(或通常在制作 3D 游戏时的绑定)。使用纹理图集并尝试在绑定后尽可能多地使用一个纹理,然后再绑定另一个纹理单元。
- 不要显示不在视锥体/视口中的东西。首先计算绘制的对象是否可以被活动相机看到。如果没有看到,请不要在渲染时将其加载到 GPU 上!
- 不要在渲染循环中过于频繁地使用 spritebatch.begin() 或 spritebatch.end(),因为每次开始/结束它时,它都会被刷新并加载到 GPU 上以渲染其内容。
- 渲染时不要加载资源,除非你在另一个线程中加载一次。
- 最新版本的 libgdx 还提供了一个 GLProfiler,您可以在其中测量每帧有多少绘制调用、纹理绑定、顶点等。我强烈建议您这样做,因为在某些情况下您不会期望内存/计算使用的开销。
- 使用 libgdx Poolable(接口)对象和 Pool 来池化对象并最大限度地减少对象创建的时间,因为创建对象可能会在游戏渲染循环中导致微小但明显的卡顿
顺便说一句,没有任何额外的信息,没有人会给你一个好的或准确的答案。如果您认为为您的问题写足够多的文本或信息不值得,为什么值得回答它?
答案可能比“电脑快;手机慢”多一点。相反,重要的是要注意,您的计算机 Java VM 可能是 Oracles 非常优化的 JVM,而您手机的 Java VM 可能是 Dalvik,更不用说它的性能了,它在对象创建和管理方面没有相同的优化。
正如其他人所说,libGDX 正是出于这个原因提供了一个 Pool 类。看看这里:https ://github.com/libgdx/libgdx/wiki/Memory-management
要真正了解您的游戏运行缓慢的原因,您需要分析您的应用程序。
有可用的免费工具。
在桌面上,您可以使用 VisualVM。在 Android 上,您可以使用 Android Monitor。
通过分析,您会发现哪些方法占用的时间最多。
减速的一个可能原因是纹理绑定。您是否经常在打包纹理的不同页面之间切换?尝试在切换到另一页之前从一页绘制所有内容。
LibGDX 中一件非常重要的事情是,您应该确保有时从内存中加载资产不能进入 render() 方法。确保您在正确的时间加载资产并且它们没有出现在渲染方法中。
另一个非常重要的事情是尝试计算你的数学并使其独立于渲染,因为你的下一帧不应该等待计算发生......!
这些是我在制作Snake 游戏教程时遇到的主要 2 件事。
谢谢,
阿比吉特。
思考点(亲身经历)
不要在渲染方法中继续调用函数,更新诸如时间之类的内容,HUD上的分数(仅在需要时进行这些更新,例如当分数增加时才更新分数等)
如果特定情况下拨打电话(在特定条件下进行更新,而不是一直),例如。在渲染方法中以 60FPS 调用/更新 - 意味着您每秒更新时间 60 次,而它只需要每秒更新一次)
这些点将极大地影响性能(竖起大拇指)
我发现的一件事是,绘图是滞后的。这意味着,如果您正在绘制屏幕外的项目,那么它会使用大量无用的资源。如果您只是在绘图前检查它们是否在屏幕上,那么您的性能会大大提高。
您需要检查您游戏的图像大小。如果您的图像大小超过使用以下链接“ http://tinypng.org/ ”减小图像的大小。它会帮助你。