2014-08-28 223 views
2

我基本上試圖用默認的幀緩衝區像素圖做些事情。當有人暫停遊戲時,我希望模糊它。我的問題是,即使我爲整個模糊操作使用單獨的線程,也必須在呈現線程上調用ScreenUtils.getFrameBufferPixmap方法。但是這個方法需要至少1秒才能在nexus上返回5.在我的模糊處理線程上調用該方法是不可能的,因爲除了渲染線程之外的任何其他線程上都沒有gl上下文。getFrameBufferPixels在libgdx中花費太長時間

是否有消除失速

+0

如果我的回答幫助你解決了這個問題,請接受它;) – Elvithari 2014-09-22 09:15:42

回答

0

你想要做什麼任何解決方案:採取截圖,修改它的CPU上,並將它上傳到GPU。這種方法有三個問題。 1.抓取像素,需要很長時間。 2.可以獨立成功地爲每個像素執行模糊處理,因此在CPU上執行操作毫無意義。 GPU可以一眨眼的功夫。 3.上傳紋理還需要一些時間。

正確的做法是:不是將所有內容都渲染到屏幕上,而是渲染到屏幕外的紋理。 (請參閱離線渲染教程)接下來,在屏幕大小的四邊形上繪製此紋理,但在繪製時使用模糊着色器。有很多示例模糊着色器可用。它應該基本上對目標像素的周圍進行採樣並使其平均。

+0

你沒有明白我的觀點。我不想讓實時模糊,因爲我只是在遊戲暫停時顯示靜態背景。另外我想生成一個lerp模糊(在這裏描述的效果在ios plus中使用:https://github.com/mattdesl/lwjgl-basics/wiki/Lerp-Blur-Brief。 – 2014-08-28 07:51:10

+0

@Rahul Verma:我明白了你的觀點。我的觀點是:抓取輸出像素的速度太慢,無法順利運行,如果堅持,嘗試使用其他方法來讀取它們,但是它會變得很慢,你不想實時模糊?只是暫停時按一次,在GPU上記錄模糊的紋理,並在暫停處於活動狀態時將其用作靜態圖像,不需要再應用模糊處理,如果您想在一段時間內模糊更強,您可以 – Elvithari 2014-08-28 08:09:53

+0

你似乎是正確的,事實上,隨着時間的推移模糊加強問題,我可以使用mix()bw實際像素和模糊像素,並逐漸增加重量模糊像素到滿,但有短暫的你會看到,軟件模糊(java代碼)本來可以很容易地異步執行。毫無疑問,Shader的模糊會快速減弱,但它確定它不會落後於較老的設備(功能較弱的gpus)?無論如何,它肯定會比拉動GPU的像素值更小。 – 2014-08-28 10:57:41

0

source for ScreenUtils.java你可以看到,getFrameBufferPixmap基本上是圍繞OpenGL's glReadPixels的包裝。你可以做的改善Java或Libgdx包裝的東西並不多。這不是OpenGL優化的方向(它擅長將數據推送到GPU,而不是拉取數據)。

將當前屏幕重新渲染到(更小,屏幕外)FrameBuffer,然後再將其拉下,可能會更好。您也可以使用GPU以這種方式進行模糊處理。

我相信屏幕的格式(例如,不是RGBA8888)可能會影響讀取性能。

這不是Libgdx特定的,因此對於OpenGL的任何提示或建議(如Making glReadPixel() run faster)都應該適用。

相關問題