2015-07-11 165 views
0

我正在研究用LibGDX渲染一個平鋪球體,旨在爲桌面產生一個遊戲。以下是目前爲止我所得到的一些圖像:http://imgur.com/GoYvEYZ,xf52D6I#0。我渲染了大約10,000個ModelInstances,所有這些都是使用自己的ModelBuilder從代碼生成的。它們每個都包含3個或4個三角形部分,每個ModelInstance都對應於它自己的Model。下面是我使用的確切的渲染代碼:如何提高LibGDX 3D渲染性能?

modelBatch.begin(cam); 
    // Render all visible tiles 
    visibleCount = 0; 
    for (Tile t : tiles) { 
     if (isVisible(cam, t)) { 
      // t.rendered is a ModelInstance produced earlier by code. 
      // the Model corresponding to the instance is unique to this tile. 
      modelBatch.render(t.rendered, environment); 
      visibleCount++; 
     } 
    } 
    modelBatch.end(); 

ModelInstances不是從每幀剛剛繪製的代碼生成的。我只在需要時更新它們。 「isVisible」檢查只是一些非常簡單的截錐體剔除,我從本教程https://xoppa.github.io/blog/3d-frustum-culling-with-libgdx/開始遵循。從我的診斷信息可以看出,我的FPS非常糟糕。我的目標是至少60 FPS渲染,我希望是一個相當簡單的多邊形場景。我只知道我以非常低效的方式來做這件事。

我已經做了一些關於人們如何解決這個問題的研究,但我試圖將解決方案應用到我的項目中。例如,建議將場景分成塊,但我不知道如何在玩家能夠旋轉球體並查看所有側面時使用該場景。我閱讀了關於遮擋剔除的知識,以便我可以僅將球面上的ModelInstances呈現在面向相機的位置,但是在如何在LibGDX中實現這一點時卻不知所措。

此外,每個ModelInstance使用自己的模型有多糟糕?如果只使用一個共享的模型對象,速度會得到改善嗎?如果有人能夠指點我更多的資源,或者就如何改善這裏的表現給我任何好的建議,我會很感激。

+0

我並不完全熟悉Libgdx的3d,但我認爲10000個模型實例意味着有10000個繪製調用。由於模型數據沒有變化,這還不及10000 sprite批處理刷新那麼糟糕,但仍然不好。我認爲如果你可以合併一些模型實例,那麼你會看到一個很大的改進,因此你可以減少它們。此外,在中端或低端手機上,30000多個頂點可能太多,以確保順暢的性能。 – Tenfour04

+0

通過將遠平面設置爲距離相機稍微遠離球體的中心,您可能可以使用相機的遠平面去截取幾乎一半的頂點。但我認爲你的第一個瓶頸可能是大量的模型實例。 – Tenfour04

回答

0

如果瓷磚最終打算成爲堅實的,您可以改進的一項改進是打開back-face culling。這將導致任何不面向相機的臉部不被渲染(即每個臉部的一側變得不可見)。對於一個球體而言,這意味着GPU只需渲染大約一半的面部。

將該對象組合成單個模型也可能會產生很大的影響。它可能是10,000次繪製調用和1次的差異(這取決於modelBatch對象的智能程度,因爲它可能會在幕後進行組合)。如果用戶有時會縮放得很近,則分塊方法可能會有所幫助,這樣您就可以繼續進行截錐體剔除。

+0

感謝您的回覆。我從其他線索得到的建議一直在做這些類似的技術,它將我的表現提高了60倍。一旦我得到了一些我的代碼,我將在這裏發表一篇文章。 –

+0

你是否最終在這裏提到你寫的文章? –