Autor Wątek: zmiejszanie rozmiaru pliku  (Przeczytany 5437 razy)

Offline kafor7

  • Użytkownik

# Wrzesień 13, 2008, 21:24:30
Cześć! Zrobiłem sobie prosty format pliku zapisujący w moim formacie. Format jest ten prosty, zawiera: nagłówek pliku ( ile klatek, trójkątów itd..) dane wierzchołków,wsp textur i animacje. Napisałem konwerter który konwertuje z formatu md2 do tego mojego. Tylko jest taki problem :  gdy konwertacja się skończy to model zajmuje prawie 40mb a w formacie md2 800kb. Wszystko zapisuję w systemie dziesiętnym bo tylko tak umie więc dlatego tyle zajmuje :)

Moje pytanie brzmi : Jak ludzie zapisują to w takiej formie aby zajmowało mało miejsca i było trudne do edycji gdy otworzymy za pomocą notatnika?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Karczas

  • Użytkownik
    • DevBlog

# Wrzesień 13, 2008, 21:26:12
Pewnie zapisujesz w postaci tekstowej... Zapisuj binarnie.
Możesz też zastosować jakąś standardową metodę kompresji.

//Edit: Najlepiej wklej fragment pliku w twoim formacie ;)

Offline kafor7

  • Użytkownik

# Wrzesień 13, 2008, 21:30:16
no zapisuje w formacie tekstowej :) ale masz fragment jeszcze :
//1 Frame
19.927 -2.99001 -10.1316 53 238
19.927 3.79867 -14.5444 44 227
19.927 -1.43831 -9.24908 62 227
-0.134588 12.9149 0.206835 0 238
-0.134588 -2.99001 -10.1316 53 238
-0.134588 -9.19681 -6.60142 43 247
19.927 -2.99001 -10.1316 53 238
19.927 12.9149 0.206835 0 238
19.927 3.79867 -14.5444 44 227
-2.29809 7.48396 -6.47535 0 0
-2.29809 8.25981 -7.10574 0 0
-2.29809 8.06585 -7.73613 0 0
-2.29809 7.48396 -6.47535 89 213
-2.29809 8.06585 -7.73613 96 237

metode kompresji ? tzn ? bo jestem właśnie w tym zielony tak samo jak zapisując binarnie :)

Offline micran

  • Użytkownik
    • Micran - Warsztat

# Wrzesień 13, 2008, 22:08:28
Musisz posiadać każdą klatkę??? Przecież możesz mieć tylko klatki kluczowe i wystarczy. Zapis binarnie też raczej zmniejsza rozmiar pliku chyba że to tekst.

Offline voytech

  • Użytkownik

# Wrzesień 13, 2008, 23:03:06
Format tekstowy zawsze będzie zajmował więcej miejsca na dysku. Możesz ten plik skompresować np. WinZipem. Najprawdopodobniej wczytanie spakowanego pliku i go rozpakowanie w programie będzie szybsze niż wczytanie zwykłego dużego pliku. Przy tekscie  stopień komresji jest dość duży i powinien zmniejszyć rozmiar sześciokrotnie a może nawet więcej.

Druga sprawa to kompresja normalnych i koordynat w samym formacie md2. Tam dla wierzchołka przeznaczono tylko 3 bajty! (unsigned char v[3]) a dla wektora normalnego tylko 1 bajt. Pomyśl tylko, jak zapiszesz w pliku jako tekst trzy zmienne float z precyzją tak z 6 miejsc po przecinku, to uwzględniając jeszcze miejsca na znak minus wyjdzie, że tak średnio będziesz musiał przeznaczyć na to około 30 bajtów co jest wielkością 10 razy większą niż to co przechowuje format md2.

Możliwość edycji w notatniku to raczej zaleta niż wada :). Nie trzeba żadnych skomplikowanych narzędzi żeby wprowadzić jakieś poprawki.

Offline Mrowa

  • Użytkownik

# Wrzesień 13, 2008, 23:22:47
Co tutaj można dodać. Zapis binarny zajmuje mniej miejsca w pamięci. Do tego stosujesz kompresję i powinno być lepiej ;)
A to co można dodać to odnośnik do artykułu, gdzie jest pokazane w jak prosty sposób skorzystać z biblioteki zlib przy kompresji danych.

Link: http://www.warsztat.gd/files/articles/Biblioteka%20zlib.pdf

Pozdrawiam
Mrowa

Offline kafor7

  • Użytkownik

# Wrzesień 13, 2008, 23:40:39
spróbuję zaraz ten artykuł co mi podano. A jak zapisać dane binarnie ?? Trzeba zrobić to samemu czy są jakieś funkcje do tego?

Offline Dab

  • Redaktor
    • blog

# Wrzesień 13, 2008, 23:57:52
Meet tha power of tha almighty fwrite!

Offline Karczas

  • Użytkownik
    • DevBlog

# Wrzesień 14, 2008, 00:38:01
A w czym tworzysz?

Offline kafor7

  • Użytkownik

# Wrzesień 14, 2008, 00:38:41
w c++ teraz bawię się tą kompresją kto podał link wyżej:)

Offline Will

  • Użytkownik

# Wrzesień 14, 2008, 00:50:19
Jeżeli używasz fstream to otwórz plik do zapisu tak: fstream plik("plik.bin",ios::out|ios::binary); i po sprawie ;]

Offline Mrowa

  • Użytkownik

# Wrzesień 14, 2008, 11:37:12
Tak jak kolega wyżej mówi. Masz dwie możliwości albo i więcej :P.

a) przy użyciu starszych funkcji, które pracują na strukturze FILE, jakieś tam funkcje fopen, fclose, fwrite i fread.
b) Zalecane chyba - to strumienie, tak jak używasz ich do zapisu tekstowego, wtedy nic nie zmieniasz, bo przez domniemanie strumień zapisu i odczytu pracuje w trybie tekstowym. Natomiast poprzez flagi możesz zmienić na tryb binarny i już. Poczytać musisz tylko o strumieniach.

Offline RedHot

  • Użytkownik

# Wrzesień 14, 2008, 14:29:54
Porównanie wydajności wczytywania danych.

Część I
http://www.gamasutra.com/view/feature/1565/fast_file_loading_pt_1.php

Część II
http://www.gamasutra.com/view/feature/1461/fast_file_loading_pt_2.php

Ogólnie ciekawe wnisoki można wyciągnąć.

Offline kafor7

  • Użytkownik

# Wrzesień 14, 2008, 18:26:27
skompresowałem tym zlibem i zajmuje teraz 5mb z 39 wiec może już być. Jak dekompresuje to wsyzstkie dane z tego pliku mam w zwykłym charze (dokadnie w moim programie jest to zmienna (char* buffer)). Tylko teraz mam taki problem. Jak z tego chara wczytywać dane o wierzchołkach do zmiennych które zajmują się przechowywaniem tych wierzchołków?

Offline soku11

  • Użytkownik

# Wrzesień 14, 2008, 19:31:24
Jesli masz to po dekompresji w formacie typu:
Cytuj
buf={19.927 -2.99001 -10.1316 53 238
19.927 3.79867 -14.5444 44 227
inne...
};

To przydaloby sie napisac jakiegos prostego parsera czy cos. Bo zwykla funkcja np. atof zwraca liczbe typu float, ale do pierwszego bialego znaku... Czyl musialbys wczytac jednego floata, wyczyscic to co juz przeczytales i konwertowac dalej. Wymyslane na szybko i pewnie wolne rozwiazanie. Pozdrawiam.

BTW. Oczywscie duzo lepszym rozwiazaniem bylyby pliki binarne. Tam jedna liczbe wczytujesz jednym wywolaniem np. fread, albo nawet odrazu wczytujesz caly model jednym wywolaniem :)
« Ostatnia zmiana: Wrzesień 14, 2008, 19:37:26 wysłana przez soku11 »