Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么libgdx中的游戏运行缓慢?_Libgdx - Fatal编程技术网

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

为什么libgdx中的游戏运行缓慢?,libgdx,Libgdx,我正在用Libgdx制作赛车游戏。我的游戏apk大小是9.92MB,我使用的是四个纹理打包机,总大小是9.92MB。我的游戏在桌面上运行,但在android设备上运行非常慢。它背后的原因是什么?在编程时我们忽略了一些漏洞。 桌面处理器的功能更强大,因此游戏在桌面上运行平稳,但在移动设备上运行缓慢 以下是一些关键注意事项,您应该遵循这些注意事项以获得最佳游戏流程: 渲染方法中没有I/O操作 避免在渲染方法中创建对象 对象必须重复使用(例如,如果您的游戏有1000个平台,但在当前屏幕上,您只能显示3

我正在用Libgdx制作赛车游戏。我的游戏apk大小是9.92MB,我使用的是四个纹理打包机,总大小是9.92MB。我的游戏在桌面上运行,但在android设备上运行非常慢。它背后的原因是什么?

在编程时我们忽略了一些漏洞。 桌面处理器的功能更强大,因此游戏在桌面上运行平稳,但在移动设备上运行缓慢

以下是一些关键注意事项,您应该遵循这些注意事项以获得最佳游戏流程:

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


    祝你好运。

    你需要检查你的游戏图像大小。如果你的图像大小大于,请使用以下链接“”减小图像大小。
    这将对您有所帮助。

    我有一些提高性能的额外提示:

  • 尝试在渲染循环中最小化纹理绑定(或者通常在制作3D游戏时使用绑定)。使用纹理地图集,在绑定另一个纹理单元之前,尝试在绑定后尽可能多地使用一个纹理
  • 不要显示不在视锥/视口中的对象。首先计算活动摄影机是否可以看到绘制的对象。如果看不到,渲染时不要将其加载到GPU上
  • 不要在渲染循环中太频繁地使用spritebatch.begin()或spritebatch.end(),因为每次开始/结束它时,它都会刷新并加载到GPU上以渲染其内容
  • 渲染时不要加载资源,除非在另一个线程中加载一次
  • libgdx的最新版本还提供了一个GLProfiler,您可以在其中测量每帧有多少绘制调用、纹理绑定、顶点等。我强烈建议这样做,因为在某些情况下,您不会期望内存/计算使用的开销。
  • 使用libgdx Poolable(interface)对象和Pool来汇集对象并最小化对象创建时间,因为对象的创建可能会在游戏渲染循环中造成微小但明显的口吃

  • 顺便说一句,如果没有任何额外的信息,没有人会给你一个好的或准确的答案。如果您认为不值得为您的问题编写足够的文本或信息,为什么值得回答它?

    要真正了解游戏运行缓慢的原因,您需要分析您的应用程序

    有免费的工具可用于此

    在桌面上,您可以使用VisualVM。 在Android上,您可以使用Android监视器

    通过分析,您会发现哪些方法占用的时间最多


    速度减慢的一个可能原因是纹理绑定。你经常在不同的页面之间切换压缩纹理吗?在切换到另一页之前,试着从一页中画出所有内容。

    答案很可能是“电脑快;电话慢”。相反,需要注意的是,您的计算机Java VM很可能是Oracles非常优化的JVM,而您手机的Java VM很可能是Dalvik,更不用说它的性能了,它在对象创建和管理方面没有相同的优化


    正如其他人所说,libGDX提供Pool类正是出于这个原因。看看这里:

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

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

    这是我在制作过程中遇到的两个主要问题。
    谢谢,

    阿比吉特。

    我发现的一件事是,这幅画太长了。这意味着,如果您正在绘制屏幕外项目,那么它将使用大量无用的资源。如果你在画画之前只检查它们是否在屏幕上,那么你的表现会出人意料地提高很多。

    思考的要点(个人经验)

  • 不要在render method中不断调用函数,该函数会更新HUD上的时间、分数等内容(仅在需要时进行这些更新,例如分数增加后才更新分数等)

  • 在特定情况下拨打电话(在特定条件下进行更新,而不是一直更新) 例如,在渲染方法中以60FPS的速度调用/更新-意味着您每秒更新时间60次,而它只需要每秒更新一次)


  • 这些要点将对性能产生巨大影响(竖起大拇指)

    您需要提供更多信息。您是否尝试过隔离代码中占用时间最多的区域?这可能是由于你正在做的事情,但是我们不能不看代码。我的游戏在游戏屏幕上的性能非常慢。它有30多个类,我不知道是哪一部分导致了我的游戏速度慢。堆栈溢出不擅长这类问题。你需要一个档案器来回答你的问题:我不知道你是如何创建图像的,但也许你应该熟悉“抖动”(dither)并尝试优化你的图片。不,这只会缩小你的文件大小。当加载到GPU上时,内存使用量基本相同,因为GPU自己处理位图(无论如何,它会将位图作为位图存储在GPU内部)