簡體   English   中英

libGDX:如何渲染tilemap?

[英]libGDX: How to render a tilemap?

我想繪制一個由不同縮放級別的有限瓷磚組成的地圖,就像谷歌地圖一樣。 我考慮使用瓷磚的原因是因為地圖非常大並且在最高放大率下整個地圖非常大(大約15000到20000像素)。

現在我考慮創建一個四叉樹來組織瓷磚。 每次繪制一個幀時,四叉樹邏輯將評估要渲染的圖塊,以便渲染時間最短。 但是,我如何組織地圖圖塊對象本身? 我什么時候能最好地加載瓷磚? 為每個圖塊創建一個精靈似乎有點矯枉過正,因為圖塊和位置的尺寸保持不變。 在這種情況下,SpriteCache似乎沒有幫助,因為我每幀只繪制一個映射的子集。 此外,在幾種情況下有很多優點和缺點:當我在啟動應用程序時加載所有磁貼時,將需要很長時間來加載所有磁貼並將它們緩存在GPU中(甚至沒有考慮到所有瓷磚適合記憶)。 當我在運行時加載必要的tile時,我想在渲染tile時會遇到一些延遲。

這樣的案例是否有“最佳實踐”?

我知道對此沒有正確或錯誤的答案,但我想聽聽解決這個問題的其他建議。

謝謝!!!!

“我如何組織地圖圖塊對象本身?”:
a)你可以將瓷磚分組到區域;
b)然后你的觀察者/攝像機僅繪制視野中的區域(如截頭剔除,但不是每個瓷磚,因為詢問每個瓷磚是否太昂貴,如果它在視野中);
c)每個繪制區域在正確位置(相對於Area.position)繪制其Tiles。

這里有關於“我什么時候能最好裝載瓷磚?”的問題。 可以用答案解決:
- 最好的方法是在繪制調用之前加載精靈,並且僅在視圖上為Area.Tiles加載精靈;
- 從池中加載精靈。

我在Map 1000 x 1000瓷磚上測試了這種方法,
我的Viewer(活動圖塊)是3 x 3區域(90 x 90圖塊)。 並且通過這種方法,性能與地圖有多大並沒關系(當你的計算機有內存:)時,只有觀眾大小才重要...


如果觀察者可以有更大的維度 - 那么你可以預渲染整個Area.Tiles來紋理並直接為每個幀上的每個可見區域繪制一個Area.texture。

應用程序啟動時,應首先加載紋理。
在創建Viewer時以及向上/向下/向左/向右移動一個區域時,紋理可以鏈接到切片。

for (Area area : Viewer.areas) {
    for (Tile tile : area.tiles) {
        tile.texture = <loaded_texture> OR tile.image = new Libgdx.Image(<loaded_texture>) OR any other appropriate for your tile object way
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM