Sposób na przechowywanie kilkuset milionów zmiennych

0

Witam
W jaki sposób można przechowywać kilkaset milionów zmiennych?

Tablica ma ograniczenie do 10 mln zmiennych, a tworzenie kilkudziesięciu, lub nawet kilkuset tablic nie wydaje mi się dobrym rozwiązaniem.
Obecnie próbuje rozwiązać ten problem na zasadzie zapisywania zmiennych do pliku i ich odczytywania, jednak zapis ich trwa zbyt długo oraz plik osiąga ogromny rozmiar.

Próbuję stworzyć grę opartą na niszczeniu oraz stawianiu bloków, jednak żeby taka gra miała sens musi posiadać prawie nieskończoną mapę. Obecnie mapa o wymiarach 100 x 200 x 100 zapisana do pliku tekstowego zajmuje 27,5 mb.

Czy istnieje lepszy sposób na rozwiązanie mojego problemu niż ten co obecnie stosuje?

0

Zmień założenia projektowe. Trzymaj w danej chwili tylko tyle danych, ile jest niezbędnych do działania. Zasranie całej pamięci procesu to chory pomysł.

0

Tablica ma ograniczenie do 10 mln zmiennych

Od kiedy niby? Tablica ma ograniczenie co najwyżej na max_int indeksów a to znacznie więcej niz 10mln. Zgaduje ze tworzysz tą tablicę na stosie zamiast na stercie i stąd brakuje ci pamięci. Lekcja na dziś: dynamiczna alokacja pamięci i new[]

0

Odpal Task Manager i zobacz ile pamięci zajmuje aktualnie twoja przeglądarka.
Jak sądzisz zmieszczą ci się te 27,5 MB w pamięci ?

0

@_13th_Dragon
27,5 MB zajmuje fragment przestrzeni o wymiarach 100 x 200 x 100, przestrzeń która będzie używana przez użytkownika to maksymalnie 3000 * 3000 (100 x 200 x 100), jednak to skrajny przypadek, zakładam że użytkownik użyje około 30 * 30 (100 x 200 x 100), jednak to już są 24 GB.

@Satirev
To właśnie próbuje osiągnąć pracując na pliku, do programu wczytuje tylko fragment mapy, a reszta jest trzymana w pliku, jednak zapis do pliku trwa około minuty, a przejście tego fragmentu mapy około 30 sekund, stąd pojawia się taki problem że użytkownik może dojść do końca generowanego fragmentu mapy i czekać na jej załadowanie, czego bardzo chciałbym uniknąć.

3

Robisz tak....
Ładujesz obszar mapy w odległości 100 jednostek (albo 1000 - najlepiej ustaw opcje i porób testy - nie znam skali Twojej mapy) od kamery. To daje obszar 200x200x200. Taki fragment mapy pakujesz w obiekt CMapNode, albo o innej, równie błyskotliwej nazwie. Poczytaj też o drzewie ósemkowym i ładowaniu(+kompresji) progresywnym. Nie musisz ładować szczegółów mapy do której się tylko trochę zbliżysz! W miarę zbliżenia się do kolejnego obszaru na 50 jednostek ładujesz go (w osobnym wątku! w TLE!). Odrzucasz fragment mapy od którego się oddaliłeś na dużą odległość. Musisz to dokładnie przemyśleć. Pewnie mapa będzie się dynamicznie zmieniać, więc zmieniony fragment musisz zapisać. Dysk to wąskie gardło komputera.

Co do kopii minekrafta. Magika grafiki wokselowej(tak to się po polsku pisze?) kryje się w matematyce. Z treści Twojego pytania wnioskuję, że nie przerobiłeś żadnej książki na temat tworzenia silników grafiki 3D z DirectX || OpenGL. Nie znając podstaw możesz bardzo się zawieść. I nie twierdzę, że powinieneś sobie odpuścić, ale skup się raczej na nauce od podstaw i postaraj się jak najwięcej zrozumieć i zapamiętać z tego projektu :)

0

@Ola Nordmann
Dzięki za odpowiedź, w najbliższych kilku dniach poczytam o zagadnieniach o których wspomniałaś i spróbuje je wdrożyć do mojej gry,

Co do drugiej części twojego postu, to moim celem nie jest projekt komercyjny tylko pogłębienie swojej wiedzy na temat programowania. Udało mi się już stworzyć dosyć dużo, jest już niszczenie oraz stawianie obiektów, fizyka postaci oraz różne rodzaje bloków. Co do silnika graficznego to uczę się DirectX. Jedyna rzecz, której brakuje mi żeby ten projekt można było nazwać grywalną grą jest prawie nieskończony świat oraz losowe generowanie obiektów, jednak z tym drugim wydaje mi się że dam radę poradzić sobie bez większych problemów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1