Próbuję napisać mały silnik wokseli, ponieważ jest fajny, ale staram się znaleźć najlepszy sposób przechowywania rzeczywistych wokseli. Wiem, że będę potrzebować kawałków, więc nie muszę mieć całego świata w pamięci, i wiem, że muszę je renderować z rozsądną wydajnością.
Czytam o oktatach i z tego, co rozumiem, zaczyna się od 1 sześcianu, w tym sześcianie może być jeszcze 8 kostek, a we wszystkich tych 8 kostkach może być kolejne 8 kostek itp. Ale nie sądzę, że pasuje to do mojego silnika wokseli, ponieważ moje kostki wokseli / przedmioty będą miały dokładnie ten sam rozmiar.
Tak więc inną opcją jest po prostu utworzenie tablicy o rozmiarze 16 * 16 * 16 i utworzenie z niej jednego kawałka i wypełnienie jej przedmiotami. Części, w których nie ma żadnych przedmiotów, będą miały wartość 0 (0 = powietrze). Ale obawiam się, że to zmarnuje dużo pamięci i nie będzie bardzo szybkie.
Następnie inną opcją jest wektor dla każdej porcji i wypełnienie go kostkami. A sześcian utrzymuje swoją pozycję we fragmencie. Oszczędza to pamięć (bez bloków powietrznych), ale znacznie wolniej szuka kostki w określonym miejscu.
Tak naprawdę nie mogę znaleźć dobrego rozwiązania i mam nadzieję, że ktoś może mi w tym pomóc. Więc czego byś użył i dlaczego?
Ale innym problemem jest renderowanie. Sam odczyt każdego fragmentu i przesłanie go do GPU przy użyciu OpenGL jest łatwe, ale bardzo powolne. Generowanie jednej siatki na porcję byłoby lepsze, ale oznacza to, że za każdym razem, gdy łamię jeden blok, muszę odbudowywać cały fragment, co może zająć trochę czasu, powodując niewielką, ale zauważalną czkawkę, czego oczywiście też nie chcę. To byłoby trudniejsze. Jak więc renderowałbym kostki? Po prostu utwórz wszystkie kostki w jednym buforze wierzchołków na porcję i renderuj to, a może spróbuj umieścić to w innym wątku, czy jest inny sposób?
Dzięki!