|
|
[MMF2] Jak porządkujecie dane w bazie? |
Autor |
Wiadomość |
Zawieszony
Kapral
Główny edytor:
Drugi edytor:
Pojedynki: nie
Posty: 30
371 Prestiż
|
Wysłany: 02-02-2018, 17:41 [MMF2] Jak porządkujecie dane w bazie?
|
|
|
Heja ho,
To jest pewnie pytanie bardziej z ogólnego gamedevu niż do konkretnego pluginu z MMF2, ale nie ogarniam, więc zapytuję
Na przykładzie terenu, chyba najłatwiej. Mam sobie klocek terenu, który ma swoje właściwości - powiedzmy, że są to:
- ID (150),
- X i Y (96x128),
- typ (trawa),
- stan (wydeptana),
- surowiec (krowy),
- ilość tego surowca (5).
Jak to kuśka zapisać do datastore'a, żeby
a) nie zajmowało milion miejsca,
b) wczytywało się sprawnie i
c) było można łatwo operować na tych danych?
Opcja nr 1
Najpierw myślałem o Arrayu, gdzie jedno ID miałoby jeden rząd, a w kolumnach byłyby jego wszystkie wartości, ale
- powiedzmy, że różnego rodzaju surowców jest 50, musiałbym zrobić tablicę o szerokości przynajmniej 55, aby potem wszędzie wpisać same zera i tylko w tym jednym gdzie krowy dać jakąś liczbę.
- poza terenem będą jeszcze inne dane do zapisania, które nie potrzebują tylu kolumn, więc tam też by się marnowało miejsce.
Opcja nr 2
Zapisuję ID obiektu w pierwszej kolumnie, potem typ wartości i wartość. Czyli mam tabelę z trzech kolumn.
Na przykładzie z trawą wyglądałoby to tak:
150 coto teren
150 X 96
150 Y 128
150 typ trawa
150 stan wydeptana
150 krowy 5
Ma to chyba sens, bo robię tylko tyle rekordów, ile faktycznie potrzebuję (chociaż dubluję ID), a jeśli dojdzie mi jakiś surowiec to sobie po prostu go dopiszę.
Ale jakoś muszę na tym teraz operować. Powiedzmy, że co pięć tur krowy zżerają trawę i stan z wydeptanej zmienia się na zmasakrowaną. Więc gdy mija piąta tura muszę
- znaleźć wszystkie ID, które mają typ trawa i jednocześnie istnieją inne rekordy z tymi samymi ID, ale mające wartość krowy na więcej niż zero
- potem do tychże ID znaleźć rekordy ze stanem trawy i zmienić je z "wydeptana" na "zmasakrowana".
Tak to się profesjonalnie robi? Nie gadajcie, na pewno istnieje jakiś mądrzejszy sposób
Opcja nr 3
Najpowszechniejsza i najprostsza zarazem wydaje mi się zwyczajna korelacja binarna klucz - wartość. Gdyby w kluczu dałoby się zapisać jednocześnie dwie rzeczy, np.
150_typ = trawa
150_krowy = 5
to wtedy mam chyba znacznie bardziej uporządkowaną sytuację i wtedy fastloop, jakiego musiałbym zrobić dla wszystkich obiektów wydaje się dużo prostszy:
Jeśli
Loopindex + "_typ" = trawa
oraz
Loopindex + "_krowy" >/= 0
to
znajdź rekord o kluczu "Loopindex + "_stan" i zmień wartość z "wydeptana" na "zmasakrowana".
Na ten moment chyba ta opcja wydaje się najsensowniejsza... Tak to robicie? Czy macie jeszcze jakieś inne, wydajniejsze metody? Będę wdzięczny za jakieś protipy profesjonalistów w tej kwestii
PS. Fajnie by było jeszcze od razu jakoś ograniczyć ilość wykonywanych pętli, czyli np. założyć, że teren dostaje zawsze ID z przedziału od 0 do 15000, a powyżej są już inne ID, wtedy wykonuję tylko 15000 zapytań, a nie milion (zresztą ilość klocków terenu można łatwo ograniczyć przez rozmiar mapy, ale już np ilość jednostek to inna sprawa). |
|
|
|
|
jarlfenrir
Generał brygady
Główny edytor:
Drugi edytor:
Pomógł: 82 razy Posty: 1731
37283 Prestiż
|
Wysłany: 02-02-2018, 18:46
|
|
|
Bloki terenu są rozmieszczone na jakiejś siatce, czy mogą być zupełnie dowolnie? Dla przykładu z siatką, jeśli plansza ma być 2D, użyj tablicy 3D gdzie pozycja X i Y definiują pozycję terenu na planszy, a Z definiuje różne właściwości.
Np.
załóżmy, że twoja siatka to 32px
Chcemy zapisać bloczek na pozycji (160, 64)
Ustawiamy indeks X na 160/32 = 5
Ustawiamy indeks Y na 64/32 = 2
Teraz pod indeksem Z=0 zapisujemy typ bloczka
Następnie zmieniamy na Z=1 i zapisujemy stan
... Z=2 zapisujemy surowiec
...Z=3 zapisujemy ilość surowca.
Jeśli chcesz to jeszcze zoptymalizować pamięciowo i nie masz zbyt dużo różnych rodzajów terenu, stanów i surowców, można spróbować upchnąć wszystkie dane w jednej komórce X,Y na zasadzie:
typ bloczka + 100*stan + 10000*surowiec + 1000000*ilość. |
|
|
|
|
Zawieszony
Kapral
Główny edytor:
Drugi edytor:
Pojedynki: nie
Posty: 30
371 Prestiż
|
Wysłany: 03-02-2018, 11:51
|
|
|
Tak próbowałem to rozwiązywać wcześniej, ale o ile samą mapę można w ten sposób genialnie zapisać, to co z resztą danych?
Bo wydaje mi się, że najprościej będzie w jednym pliku, w jednej bazie, zapisać wszystko - zarówno sejva (obecne ilości surowców gracza, położenie jednostek itd), jak i plik mapy (nie tylko klocki terenu ale i opis mapy, tytuł, warunki zwycięstwa i tak dalej), jak i wszelkie dane potrzebne grze (np do AI, widoczności terenu, dyplomacja etc etc).
Chyba, że istnieje jakiś prosty sposób na operowanie tymi danymi w różnych plikach - ale jeśli np. zapiszę mapę jako osobny array, a dane gry czy sejva w .ini, to po pierwsze mam utrudnione i spowolnione manipulowanie tymi danymi (chyba, żeby z .ini na początku zawsze wszystko gdzieś sczytywać - ale gdzie? W milion liczników? ), a po drugie nie mogę już modyfikować pliku mapy w trakcie gry. A jednak surowce mają się zużywać, fajnie byłoby też mieć możliwość zmiany typu terenu w czasie rozgrywki.
Może właśnie w tym tkwi mój problem, że nie wiem, jak te dane rozsądnie rozlokować po plikach i jak potem z tego korzystać? xD
PS. Upychanie danych na zasadzie 100X + 1000Y itd zawsze wydawało mi się problematyczne, żeby potem z tego sprawnie korzystać... Potrzebuję jakiejś wartości i co teraz, muszę się nakombinować, żeby ją wydobyć. |
|
|
|
|
jarlfenrir
Generał brygady
Główny edytor:
Drugi edytor:
Pomógł: 82 razy Posty: 1731
37283 Prestiż
|
Wysłany: 03-02-2018, 12:17
|
|
|
Nie rozumiem dlaczego myślisz, że pliku mapy nie będziesz mógł modyfikować w trakcie gry...
Ja bym raczej zastanowił się jakie dane potrzebujesz, podzielił je na grupy i dla każdej grupy danych zastosował najlepszy sposób przechowywania go. Będziesz miał kilka plików, ale za to zawsze można je zapakować w jeden folder.
Ostatnio kiedy robiłem mapę na arrayu, zrobiłem array o jeden rząd większy niż plansza i na ostatnim rzędzie zapisywałem dodatkowe informacje o stanie gry, ale to podejście się sprawdzi tylko wtedy, kiedy poza planszą potrzebujesz może 5 wartości.
Możesz też spróbować zapoznać się z jakimś rozszerzeniem do operowania bezpośrednio na danych binarnych, wtedy miałbyś pełną kontrolę nad sposobem zapisu danych w jednym pliku, ale to byłoby dużo więcej pracy. |
|
|
|
|
Zawieszony
Kapral
Główny edytor:
Drugi edytor:
Pojedynki: nie
Posty: 30
371 Prestiż
|
Wysłany: 03-02-2018, 23:17
|
|
|
Cytat: | Nie rozumiem dlaczego myślisz, że pliku mapy nie będziesz mógł modyfikować w trakcie gry... |
Bo chcąc zagrać drugi raz w tą samą mapę muszę mieć jej oryginalny plik? Natomiast robienie znowu kolejnych kopii i zapisywanie sejwa jako zlepka kilku plików w folderze wydaje mi się dość dziwaczne (ew. w sejwie zapisywać tylko te elementy mapy, które ulegną zmianie i potem po wczytaniu mapy z oryginalnego pliku nadpisywać ją tymi danymi z sejwa, ale to też dziwaczne, no nie?).
Ja wiem, że są różne rozwiązania, natomiast właśnie chciałem się zorientować, czy ktoś z Was już jakieś podobne rzeczy robił i jakie rozwiązania uznał za najefektywniejsze / najmniej dziwaczne
Na przykład Twój sposób z podzieleniem danych zakłada, że będę miał powiedzmy trzy miejsca do przechowywania danych, co rodzi problem właśnie z ich zapisem w jednym sejwie - chyba, że są jakieś pliki zdolne łączyć kilka sposobów zapisu danych w jednym pliku - co chyba jeszcze jest w miarę łatwe - ale potem również z niego odtwarzać w niezmienionej formie - i wiedzieć jakie dane do jakiej bazy wczytać - co już będzie trudniejsze. |
|
|
|
|
jarlfenrir
Generał brygady
Główny edytor:
Drugi edytor:
Pomógł: 82 razy Posty: 1731
37283 Prestiż
|
Wysłany: 04-02-2018, 11:45
|
|
|
Znalazłem rozszerzenie SQLite 3 do CFa. Myślę, że nic lepszego nie znajdziesz, co pozwoliłoby Ci zapisać dane różnego typu w jednym pliku.
SQLite.
Dla wyjaśnienia: SQLite to interfejs pozwalający używać pliku jak standardowej relacyjnej bazy danych. Obawiam się, że znajomość SQLa będzie konieczna, żeby z tego rozszerzenia skorzystać, ale sam jeszcze nie wiem jak dokładnie ono działa |
|
|
|
|
Zawieszony
Kapral
Główny edytor:
Drugi edytor:
Pojedynki: nie
Posty: 30
371 Prestiż
|
Wysłany: 04-02-2018, 14:10
|
|
|
Tak, normalne wpisywanie komend.
Spróbuję to rozwalić najprostszą opcją klucz i wartość i zobaczę, jak wyjdzie, może nienajgorzej..? Dzięki za zainteresowanie moim tematem |
|
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych Wersja do druku
|
|