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

Offline voytech

  • Użytkownik

# Wrzesień 17, 2008, 03:11:14
Ja dla ułatwienia dodam, że problem trzeba zrobić na kawałki.

1. Jeżeli zdecydujesz się na format tekstowy, to najpierw opracuj etap parsowania, bo chyba z tym również masz problem. Dopiero jak juz to rozwiążesz wtedy zaimplementuj dekompresje w programie ładującym. Pozwoli Ci to znacząco zmniejszyć rozmiar pliku.

2. W przypadku gdy zdecydujesz się na format binarny pozostanie ci tylko zaimplementować ładowanie tych danych z pliku. Wystarczy stworzenie np kilku funkcji, które wczytują pojedyncze wartości float, int, unsigned int, itd. Jest to banalnie proste, miałeś podane przykładowe kody. W tym przypadku również można zastosować kompresowanie plików, ale według mnie można to sobie darować.

Poza tym, skoro napisałeś konwerter md2, to powinieneś wiedzieć jak wczytywać dane binarne i również jak je zapisywać. Musisz się pogodzić z tym, że twoje pliki po konwersji zawsze będą dużo większe od tych źródłowych. Carmack również miał problem z wielkością plików, dlatego wprowadził kilka usprawnień do formatu md2 w celu silnego zoptymalizowania pod kątem wielkości danych, np. stablicowanie wektorów normalnych. Zresztą taka jest natura rzeczy dla animacji opartych na klatkach kluczowych dla wierzchołków. Im więcej klatek i/lub bardziej szczegółowy model, tym wielkość pliku szybko rośnie.

Musisz się z tym pogodzić albo zastosować animację opartą o kości. Zresztą wydaje mi się, że może to być przedwczesna optymalizacja. Najpierw pisz tak, żeby działało a później będziesz się martwił o prędkość

Offline Mr. Spam

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

Offline kafor7

  • Użytkownik

# Wrzesień 17, 2008, 14:40:57
w formacie tekstowym umię wczytywać bez problemu. Teraz zajmę się wczytywaniem danych z chara do floatow może się uda...

Offline voytech

  • Użytkownik

# Wrzesień 17, 2008, 18:30:49
nie może, tylko uda się na pewno :)

Offline kafor7

  • Użytkownik

# Wrzesień 28, 2008, 18:47:28
cześć udało mi się już to zdekompresować w programie i przypisać dane odpowiednim zmiennym. Teraz zamiast 20 mb plik zajmuje 2-3 mb tylko jest jeden problem i nie wiem czy to już da się rozwiązać mianowicie: sama dekompresja pliku w programie jest dość krótka ale przypisanie z buffora typu char do różnych zmiennych trwa już jakieś 15 -20 sekund dla jednego modelu :) dam może wam funkcje w jaki sposób przekształcam chara do floatów :

void readLine(char* oneline ,int & indeks,char* dane)
{
int index=0; //pocnicza zmienna aby dane z kazdej linijki byly wczytywane od zerowego indexu

for(int i=indeks;;++i)
{
if(oneline[i]=='\n')
{
++indeks;
break;
}
dane[index]=oneline[i];
++index;
++indeks;
}

return;
}

a potem robie to tak :
int indeks=0;
readLine(bufor_destination,indeks,data);
sscanf(data,"%f %f %f %f %f",&vertices[i].x,&vertices[i].y,&vertices[i].z,&texCoord[i].tu,&texCoord[i].tv);

Problem ma jakieś znaczenie bo jak będę miał ze sto modeli to już samo wczytywanie zajmnie z 30 minut i jak tu testować grę a potem w nią grać :)
« Ostatnia zmiana: Wrzesień 28, 2008, 18:49:52 wysłana przez kafor7 »

Offline Haxy.M

  • Użytkownik

# Wrzesień 28, 2008, 19:01:46
Moim skromnym zdaniem jak operujesz na tak  sporych ilościach danych, to ja mimo wszystko dałbym "unsigned int index = 0;" bo z tego co widzę to nawet, żebysmy bardzo chcieli, to w dół nie lecimy, wie połówka zakresu jest wogóle nie używana. To po pierwsze.

Po drugie sscanf jest tak prostą funkcja, ze mógłbyś się pokusić o to, by odrazu czytać i ładowć floaty, zwłaszcza, jeśli zakładasz, że nic więcej tam nie ma.

Pozatym i drobnmi detaami, które raczej nic nie wniosą nie widze nic co by jakos miała drastycznie spowalniać proces. Tu po prostu jest olbrzymia ilość danych do przetworzenia.

W zasadzie jeśli nie przewidujesz jakiejś wielkiej przenośności, to zaimplementowanie plików binarnych będzie dziecinnie proste. A powinieneś zyskać bardzo dużo.

Offline kafor7

  • Użytkownik

# Wrzesień 28, 2008, 19:39:51
te male zmiany nic nie pomogły niestety :)