Układając własne formaty plików zwracam uwagę przede wszystkim na łatwość parsowania i zapisu pliku. Dokładnie w tej kolejności - plik ma przede wszystkim być łatwy w parsowaniu, dopiero potem łatwy w zapisie. Zależność jest oczywista: w większości przypadów plik jest zapisywany znacznie rzadziej niż wczytywany, poza tym prosty w napisaniu, poprawny parser ułatwia znalezienie błędów w kodzie zapisującym (w drugą stronę jest nieco gorzej). Stąd zmontowałem swego rodzaju prosty szablon dla plików binarnych.
Każdy plik binarny, zapisywany przeze mnie ma stały nagłówek. Składa się z: identyfikatora typu pliku (32-bitowa liczba naturalna), identyfikatora wersji (32 bity, zapisywane jako little endian 0xMMmmbbbb, gdzie MM = major version, mm = minor version, bbbb = build number) oraz nagłówka z adresami sekcji. W odczycie pliku oparłem się w dużym stopniu na seekowaniu - jest szybsze i mniej pamięciożerne, niż wczytywanie całego pliku do RAMu.Przykładowo: w pliku VFS lista sekcji to zapisane: ilość plików jako DWORD, przesunięcie do początku tablicy nazw, dalej po kolei dane o plikach w postaci: hash z nazwy pliku, przesunięcie do początku pliku oraz długość pliku. Siatka (mesh) zawiera ilość subsetów, a następnie listę danych podstawowych subsetu: przesunięcie do początku vertexbuffera, przesunięcie do początku indexbuffera, ilość wierzchołków, ilość indeksów.
Taki podział pliku pozwala w dość czytelny sposób na jego wczytywanie - mając sam nagłówek od razu mamy dane "co gdzie jest" i możemy je doczytywać w razie potrzeby, bez ładowania całego pliku. Oszczędność RAMu znaczna.
Nie wiem jeszcze, jak zorganizuję zapis różnych plików tekstowych, prawdopodobnie też oprę go na sekcjach. Pomysły?
Brak komentarzy:
Prześlij komentarz