2010-03-19

Wirtualny System Plików

Jako, że piszę silnik połączony z grą, niemal koniecznością stało się użycie jakiegoś VFS. "Gotowca" nie chciałem - większość operuje na ANSI nazwach plików, do tego różnie sobie radzą z przezroczystością systemu plików (archiwa, rzeczywisty FS, priorytety itp.). Stąd powstało moje własne rozwiązanie - system SFFS z obsługą (własnych) archiwów SFA.

Idea działania VFS jest prosta: jest to abstrakcja nad rzeczywisty (fizyczny) system plików oraz dostosowany do niego system archiwów, sprawiająca, że dla gry rzeczywista lokalizacja plików nie ma żadnego znaczenia. W ten sposób działa u mnie SFFS: w momencie startu wczytuje archiwa, następnie operując danymi opiera się na priorytetach (ścieżka wykonywania, ścieżki dodane z priorytetem wysokim, SFA, ścieżki dodane z priorytetem niskim). Pliki indeksowane są po MD5 ścieżki względnej, stąd ich szukanie jest szybkie i sprawniejsze, niż porównywanie (długich) łańcuchów.

Struktura pliku SFA jest prymitywna - co okazało się być rozwiązaniem świetnie dobranym do wymagań. Obecna forma:

Nagłówek: [ Id: DWORD; Wersja: DWORD; IlośćPlików: DWORD; PozycjaPoczątkuNazw;]
foreach(DWORD < IlośćPlików) : NagłówekPliku [HashNazwy: MD5; PozycjaWSFA: DWORD; Rozmiar: DWORD;]
foreach(DWORD < IlośćPlików) : Plik : BAJTY;
foreach(DWORD < IlośćPlików) : NazwaPliku [ IlośćZnaków: DWORD; Nazwa: WCHAR*;]

Przez "nazwa" jest tu rozumiana ścieżka względna od katalogu głównego, z którego generowane jest archiwum. Jest to o tyle elastyczne, że - wczytując plik w grze - nie muszę rozbijać nazwy na poszczególne foldery, a w postaci podstawowej podaję ją do VFS i za jej pomocą szukam. Samo archiwum zajmuje też niewiele miejsca na dysku (chwilowo bez obsługi kompresji) względem rozmiaru źródłowego dla dużej ilości małych plików. Pakując w SFA 3.5GB źródeł udało mi się oszczędzić prawie 500MB miejsca na dysku (zajętego z powodu wyrównania plików do sektora na dysku).

Brak komentarzy:

Prześlij komentarz