2015-06-11 43 views
0

意外计算我最近有FPS降(〜40 FPS)的问题,并且当我搜索在哪里。我看到它不是我,我所有的计算都是在7毫秒内完成的,这远远不是16毫秒的限制。LibGDX-通过libgdx

这是我使用的代码:

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毫秒。我只是不明白在15毫秒内libgdx正在做什么,或者它是我的错。

回答

4

LibGDX被交换的背部和前缓冲器。这需要等待GPU完成渲染。因此,无论您告诉GPU在render()中完成的任务尚未完成,在下一次调用render()方法之前仍需要完成。

CPU和GPU并行操作。例如当你致电SpriteBatch#end()它几乎会立即返回(如果它不必等待其他事情先完成)。但是,这并不意味着它实际上呈现。这只意味着它有指示 GPU渲染你添加到批处理中的任何东西,例如使用例如。方法draw(...)

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

+0

好吧,谢谢,我认为这是问题,因为它发生在使用我的GPU时由另一个软件。然后我想我什么都做不了,我只能尝试做更少的spritebatch调用。另外,我留下了深刻的印象,你的答案有多快和精确。 –

0

我建议你做一个堆转储检查,并在那里你可能有内存泄漏。我猜你忘了处理一些物品(StageSpriteBatch经常被遗忘处置)。

+0

噢,我没有任何内存泄漏,我检查了。 –

+0

处置用于告诉libGDX它可以丢弃实例。如果你不这样做,你的应用会越来越慢,因为你在内存中收集了很多未使用的实例。 – flogy

+0

但我从来没有做出sprite批次的新实例,我只有一个。 –