除非已經完成或無法;考慮從前景分離背景。
如果你使用一個簡單的背景(認爲超級馬里奧普通的藍色背景),那麼你可以最有可能重用這些瓷磚/該位圖/顏色/梯度比前景元素更長的時間。
這也會讓你的數組包含很多沒有前景存在的空白空間,這意味着你可以摺疊數組並只存儲包含切片的部分。摺疊陣列的缺點是必須存儲瓦片的高度屬性以知道它們應該去的位置。
(A背景從前景分離還得到的視差效應的可能性(在不同的速度比前景)背景中的移動)
的這種調整如何改變查找一個例子:
考慮遊戲正在運行在橫向模式下的480x800屏幕上。
這意味着要查找50 * 30(1500)的瓷磚。
每個貼片都保存在2d陣列中。 目前的可視面積看起來是這樣的:
- 接地面積,4個箱體高。
- 一個平臺,高5瓦,寬20瓦,地上。
- 另一個平臺3瓦高,5瓦寬,也高於地面。
- 從地面延伸到屏幕頂部的牆,5瓦寬。
去除背景磚和摺疊陣列,我們只需要擡頭看瓷磚: 地磚:50個* 4
PLATFORM1瓷磚:5個* 20
PLATFORM2瓷磚:3個* 5個
牆磚:26 * 5
總查找: 50 * 4 + 5 * 20 + 3 * 5 + 26×5 = 445小於原來的1500
現在三分之一,當然有一些額外的工作要弄清楚每個瓷磚的位置並繪製背景,但假設其中有一個非常優化的情況s花費的時間與查找相比,花費的時間還少於1000次查找。
當然,這只是解決問題的方法之一。
還記得像2d陣列比'扁平'陣列慢得多的小事情。如果您不能將數據放入1d數組中,請儘量減少嵌套的調用,例如得到一個行或列的時間和執行從該陣列的查找切換到下一個前:
//Really bad:
for(int x=0; x<array.length; x++){
for(int y=0; y<array[x].length; y++){
Object o = array[x][y];
}
}
//Better (can be made even better by using the for(Object o : array)-syntax):
for(int x=0; x<array.length; x++){
Object[] yArray = array[x];
for(int y=0; y<yArray.length; y++){
Object o = yArray[y];
}
}
我其實是有背景和前景分開,但數組不以任何方式坍塌所以還是導致檢查1500個數組條目。許多被發現是空的,沒有繪製瓦片,但正如你所說,它看起來像二維數組訪問速度很慢。我正在使用Tiled,它在.tmx文件中輸出,以及我爲Android創建的.tmx解析器,它創建了2d數組,並且包含從中創建位圖的痛苦緩慢方法。 – 2012-01-18 11:53:26
您可以自己重新創建2d數組,以使其成爲1d數組,或以其他方式對其進行修改。此外,應該不需要一直創建一個大的位圖,而只需爲每個圖塊繪製位圖。 – Jave 2012-01-18 12:45:25
不會將每個圖塊繪製爲單獨的位圖會導致垃圾收集器的大量開銷?我聽說它不是太快 – 2012-01-18 16:00:56