2010-05-14 248 views
0

我一直在生產這個基於2d的基於tile的遊戲引擎,以用於幾個項目。在OpenGL中繪製多個四邊形的最有效方法

我有一個名爲「ScreenObject」類,它主要由

Dictionary<Point, Tile> 

的點關鍵是要顯示在何處渲染屏幕上的瓷磚和瓷磚包含一個或多個紋理是在那一刻畫出來。這個ScreenObject是瓷磚將被修改,刪除,添加等等。

我在測試中繪製瓷磚的原始方法是遍歷ScreenObject並在每個位置分別繪製每個四邊形。從我看過的文字來看,這是一個巨大的資源浪費。在測試中速度並不是很慢,但是在完成動畫課程和效果課程後,我相信它會非常緩慢。

還有最後一件事,如果你不介意的話。 正如我之前所說的,Tile類可以包含多個紋理以在屏幕上的Point位置繪製。

我在這裏認識到可能有兩種選擇。爲每個要繪製的紋理添加一個四邊形,或者,以某種方式爲相同的四邊形使用多個紋理(如果可能的話)。即使每個圖塊只包含一個紋理,也會在屏幕上繪製64個四邊形。大多數瓷磚將包含2-5個紋理,所以使用這種方法總的四邊形數量將顯着增加。爲每個新紋理添加一個四邊形是否可行?還是我忽略了一個更好的方法來做到這一點?

回答

0

我懷疑使用字典會比只使用直陣列慢。如果你的世界包含512x512瓦片,那麼你可以分配一個長度爲512x512(262144)的數組。 YTou可以通過使用「array [x +(y * 512)]」來獲得該數組中任何給定的圖塊。

你知道有多少瓦片可以存儲一個數組,其中每個指向該位置的瓦片或者列表中的瓦片都有一個索引(您可能會以這種方式節省內存,因爲您可能會保留所有的內存數組中的圖塊小於65536,甚至可能是256,因此將索引存儲爲16位。

然後,您可以找到要渲染的數組區域,爲了達到最佳效果,您希望儘量避免切換紋理,所以首先我要檢查一下你的瓷磚有多大,然後嘗試將盡可能多的紋理合併成一個大紋理,然後設置你的UV來採樣這個小部分大的紋理,這樣你就可以用一些大的紋理來限制紋理的使用數量,當然你可能會bly發現一個給定的瓷磚集(比如說岩石地面)將使用相同的紋理組。草地上也可能會出現一些混合,所以很有必要將草地的紋理保持在很大的紋理中,以避免進行如此多的紋理交換。即犧牲視頻內存的速度。

然後迭代數組的可見部分,並使用紋理1繪製所有圖塊,然後使用紋理2繪製所有圖塊等等。

0

我會推薦使用由三角形+索引組成的單個VAO對象。計算客戶端的位置,並在每個幀(流)上更新它。

使用紋理圖集將所有內容存儲在單個紋理中(以避免切換狀態)。您可以使用紋理打包工具。

一次渲染(如果啓用了深度緩衝區)。否則渲染不透明的第一個對象,然後渲染應該混合的所有東西。

相關問題