【问题标题】:LibGDX- Unexpected computing by libgdxLibGDX-libgdx 的意外计算
【发布时间】:2015-08-27 17:28:49
【问题描述】:

我最近遇到了 FPS 下降问题(~40 FPS),当我搜索它在哪里时。我发现不是我,我所有的计算都是在 7 毫秒内完成的,这与 16 毫秒的限制相差甚远。

这是我使用的代码:

long time = 0;
public void render(float delta)
{
    System.out.println("since last frame : " +( System.currentTimeMillis()-time));
    time = System.currentTimeMillis();

    // Rendering...

    System.out.println("render : " + (System.currentTimeMillis()-time));
}

“自上一帧以来”我的时间约为 22 毫秒,而我的“渲染”时间约为 7 毫秒。我只是不明白 libgdx 在这 15 毫秒内做了什么,或者这是我的错。

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    LibGDX 正在交换前后缓冲区。这需要等待 GPU 完成渲染。因此,无论您在 render() 中告诉 GPU 做什么但尚未完成,都必须在下一次调用 render() 方法之前完成。

    CPU 和 GPU 并行运行。例如当您调用SpriteBatch#end() 时,它几乎会立即返回(如果它不必先等待其他事情完成)。但这并不意味着它实际上是渲染的。这仅意味着它已指示 GPU 使用例如渲染您添加到批处理中的任何内容。 draw(...) 方法。

    此渲染发生在后台缓冲区上,这是一个离屏图像。当您的 render() 方法完成时,此后缓冲区将与前缓冲区交换,以便屏幕显示您在 render() 方法中呈现的任何内容。它只能在 GPU 完成执行您的指令时交换这些缓冲区,因此如果尚未完成则需要等待。

    【讨论】:

    • 谢谢,我认为这是问题所在,因为当我的 GPU 被其他软件使用时会发生这种情况。然后我想我什么都做不了,我只能尝试减少 spritebatch 调用。此外,我对您的回答如此快速和准确印象深刻。
    【解决方案2】:

    我建议你做一个堆转储来检查你是否以及在哪里可能有内存泄漏。我猜你忘了处置一些对象(StageSpriteBatch 经常被遗忘处置)。

    【讨论】:

    • 哦,是的,我没有任何内存泄漏,我检查过了。
    • Disposing 用于告诉 libGDX 它可以丢弃该实例。如果您不这样做,您的应用程序会越来越慢,因为您会在内存中收集大量未使用的实例。
    • 但我从来没有创建新的精灵批次实例,我只有一个。
    • 还有,一开始也很慢,显然不是内存泄漏。
    • 那么这不是问题所在。我只是在过去看到人们创建了许多 SpriteBatch 实例(有时甚至在渲染方法本身中),并且从未处理它们。我建议您在您的应用关闭时将其丢弃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多