Istnieje kilka różnych sposobów przechowywania danych dla gry z blokami, takimi jak Minecraft.
Sposób, w jaki uważam, że robi to Minecraft, rozbija świat na kawałki 16x16x256. Kawałki wokół odtwarzacza są ładowane do pamięci, gdy gracz rozpoczyna grę, a następnie wątek tła ładuje się więcej, gdy spacerujesz. Oto wideo, które to pokazuje: http://www.youtube.com/watch?v=oR_ZdJH9eho .
Innym sposobem na to jest rozbicie świata na oktree. Michael Goodfellow napisał blog o implementacji świata kostki o tej strukturze danych: http://www.sea-of-memes.com/LetsCode1/LetsCode1.html . Octree jest fajny, ponieważ daje trochę wbudowanej kompresji, ale prawdopodobnie będzie nieco trudniej pracować z tablicą.
O zachowaniu „tylko tych potrzebnych w pamięci?” Jest to trochę trudniejsze, ponieważ musisz zapytać, co jest „potrzebne”. Jeśli masz NPC, którzy mieszkają w innej części świata z AI, która wchodzi w interakcje ze środowiskiem, wtedy „potrzebujesz” dużo więcej świata, aby być w pamięci. Dane świata Voxel mogą być bardzo duże bardzo szybko, dlatego najlepiej jest zachować jak najmniejszą ilość pamięci. (IE, w pobliżu odtwarzacza są tylko postacie niezależne).
Silnik graficzny będzie „potrzebował” każdego bloku, który nie jest całkowicie otoczony innymi nieprzezroczystymi blokami. Zwykłym sposobem renderowania świata jest zbudowanie pojedynczej siatki, która zawiera wierzchołki dla każdego widocznego bloku. Rysowanie jest znacznie szybsze, ponieważ wykonujesz tylko 1 wywołanie metod losowania dla 65 536 bloków (w kawałkach wielkości Minecraft). Ponieważ silnik graficzny będzie musiał zbudować tę siatkę, zazwyczaj musi znać wszystkie kostki w porcji. Zauważ, że właśnie dlatego, gdy patrzysz przez podłogę w Minecraft, duża część świata jest niewidoczna. Jest tak, ponieważ każdy blok otoczony ze wszystkich sześciu stron jest pomijany. Wierzę, że Minecraft zmniejsza również liczbę wierzchołków, łącząc poziome boki tego samego rodzaju tekstury w jednym polu z powtarzającą się teksturą.
Moja rada to pójść z kawałkami 16x16x256. Przechowuj je w tablicy, ponieważ będziesz potrzebować szybkiej iteracji i edycji ze względu na budowanie siatki i logiki gry (wykrywanie kolizji, dodawanie / usuwanie bloków itp.). Następnie załaduj jak najwięcej kawałków w kręgu wokół gracza. Skaluj liczbę porcji w górę lub w dół, aby uzyskać lepsze lub gorsze komputery.
Ładowanie fragmentów będzie ogromnym hitem dla wydajności, więc umieść je w wątku, który biegnie z czasem. Zrób to, abyś mógł całkowicie załadować 3 nowe fragmenty w czasie, gdy gracz musi przejść od jednego końca fragmentu do drugiego.