NukeBoards - Kreatywność przede wszystkim
FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  DownloadDownload
RejestracjaRejestracja  ZalogujZaloguj

Odpowiedz do tematu
Poprzedni temat :: Następny temat
[MMF2] Jak porządkujecie dane w bazie?
Autor Wiadomość
Zawieszony 
Kapral


Główny edytor: Fusion 2.5 Dev
Drugi edytor: MMF2
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 xP

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 :D

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 xP (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: Fusion 2.5
Drugi edytor: TGF2
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: Fusion 2.5 Dev
Drugi edytor: MMF2
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: Fusion 2.5
Drugi edytor: TGF2
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: Fusion 2.5 Dev
Drugi edytor: MMF2
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: Fusion 2.5
Drugi edytor: TGF2
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 :P
 
     
Zawieszony 
Kapral


Główny edytor: Fusion 2.5 Dev
Drugi edytor: MMF2
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 :)
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
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

Skocz do:  

PSK Cytaty Klikibaza - kopia wszystkich klików Klikipedia - encyklopedia o tworzeniu gier Discord KlikCzat Zaproszenie
Daj piniondza Wielkie Muzeum Klikowe

Powered by phpBB modified by Przemo © 2003 phpBB Group