2015-06-11 104 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批次的新實例,我只有一個。 –