Tworzę grę XNA, która wymaga dużej przestrzeni dla graczy. Obecnie używana mapa wysokości testu to 4096 x 4096 i jest zapisywana jako 4-bitowy BMP.
Próbuję wziąć ten ogromny plik mapy wysokości i wyrenderować go w grze. Problem, na który wpadam, polega na tym, że nieefektywne jest ładowanie całego terenu na raz do pamięci, ponieważ zużywa on większość dostępnej pamięci.
Innym problemem, na jaki natknąłem się, jest to, że nie mogę renderować terenu w jednym prymitywnym z powodu twardego limitu ustawionego w XNA.
Powiedziawszy to, natknąłem się na szereg rozwiązań, z których wszystkie wymieniłem poniżej:
- Renderowanie oparte na bieżącej lokalizacji użytkownika - w zasadzie rysowanie kwadratu wokół użytkownika bez względu na jego orientację w świecie. Tego też nie chciałem, ponieważ nadal renderujesz przestrzeń, której użytkownik nie widzi.
- Renderowanie oparte na orientacji i pozycji użytkownika - znalazłem formułę do pobrania trójkąta, który powinien zawierać piksele mapy wysokości, które mają być renderowane, ale okazało się to bardzo trudne.
- Dzielenie terenu na wiele fragmentów i renderowanie tych, które są najbliżej użytkownika - Nadal mało wydajne, ponieważ nadal renderujesz fragmenty, których ludzie nie zobaczą. Jest to pracochłonne, ponieważ muszę podzielić mapę wysokości na kilka części, a skalowalność staje się dużym problemem.
Po wypróbowaniu tych rozwiązań mam dość pomysłów na to, co robić. Otrzymałem odpowiedzi, w których ludzie mówią mi, żebym robił te skomplikowane algorytmy, ale po prostu nie mam pojęcia, jak podejść do ich wykonania.
Zasadniczo więc proszę o prosty, prosty sposób renderowania ogromnych terenów w XNA z najwyższą wydajnością.
Ogólnie jestem raczej nowy w tworzeniu gier, ale jestem gotów zbadać, czy wydaje się to obiecujące.
Aktualizacja 1: Po zbadaniu metody geoclipmapping zacząłem ją kodować. Mam całą matematykę, a gra działa. Jest to jednak wyjątkowo nieefektywne - co prawdopodobnie jest złym kodowaniem z mojej strony. Działa z prędkością 2 klatek na sekundę i wykorzystuje cały rdzeń mojego procesora. Spróbuję ulepszyć kod, ale myślę, że będę potrzebować dodatkowej pomocy, więc oto Pastebin kodu dla klasy menedżera terenu. Wrócę później z większą ilością wyników, jeśli kiedykolwiek będę mieć większą wydajność.