Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Długie ładowanie plików PNG (SOIL, OpenGL)

Ostatnio zmodyfikowano 2016-02-14 21:48
Autor Wiadomość
Nazgul
Temat założony przez niniejszego użytkownika
Długie ładowanie plików PNG (SOIL, OpenGL)
» 2016-02-12 17:25:10
Chcę zrobić prostą grę. Mam problem, gdyż mimo swojej bardzo minimalistycznej konstrukcji, strasznie długo się ładuje podczas uruchamiania(potem działa już dobrze).

Sprawdziłem co jest przyczyną, otóż jest to ładowanie tekstur.

C/C++
////////
void loadtextures() {
    level0->texture = SOIL_load_OGL_texture( "level0.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT );
   
    level1->texture = SOIL_load_OGL_texture( "level1.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT );
   
    level2->texture = SOIL_load_OGL_texture( "level2.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT );
   
    hero->texture = SOIL_load_OGL_texture( "hero.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT );
   
    glEnable( GL_BLEND ); glEnable( GL_TEXTURE_2D ); glEnable( GL_DEPTH_TEST );
}

////////main
int main()
{
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );
    glutInitWindowSize( 792, 408 );
    glutInitWindowPosition( 0, 0 );
    glutCreateWindow( "Game" );
   
    loadtextures(); //funkcja ładująca tekstury
   
    glutDisplayFunc( display );
    glutReshapeFunc( resize );
    glutKeyboardFunc( keyboard_ );
    glutKeyboardUpFunc( keyboardUp_ );
   
    glutTimerFunc( 0, animation, 0 );
   
    glutMainLoop();
   
}

Grafiki, które tu ładuję to:
format .png,
32-głębia kolorów,
kanał alfa,
wymiary (level0,level1,level2) - 3000px X 3000px (duże), (hero) - 54px X 54px.

sprawdzałem czy nie jest to spowodowane zbyt dużymi plikami graficznymi i pociąłem te duże grafiki na małe, po 512pxX512px jednak załadowanie 36 takich grafik żeby rozmiary się zgadzały z tymi dużymi trwało bardzo zbliżoną ilość czasu.

ogólnie gra działa dobrze, tylko przeraża mnie to strasznie długie ładowanie kilku grafik..  Mógłby mi ktoś pomóc, jakoś nakierować w jaki sposób to zoptymalizować, będę bardzo wdzięczny.


P-144784
DejaVu
» 2016-02-13 09:13:02
1. Upewnij się czy jest to plik png, a nie plik bmp ze zmienionym rozszerzeniem (czytaj: czy plik zajmuje stosunkowo mało miejsca na dysku).
2. Skompiluj grę w trybie Release.
3/ Porównaj czas ładowania dużego pliku przez gimpa vs Twoja gra.
P-144802
Nazgul
Temat założony przez niniejszego użytkownika
» 2016-02-13 20:23:16
1. plik png 3000pxX3000px waży 19MB, co wydaje mi się właściwym rozmiarem pliku PNG.
2. kompilowanie gry w trybie relase nie wpływa na szybkość ładowania, jedynie podczas ładowania pojawia się komunikat o braku odpowiedzi programu i pytanie czy chcę zaczekać
3. Gimp otwiera pliki mniej więcej 15 razy szybciej niż mój program

Biorąc pod uwagę to jak Gimp otwiera wszystkie pliki to i tak jest wolno

opiszę może schemat działania programu, być może w moim myśleniu jest błąd

mm moja koncepcja opierała się na załadowaniu mapy z plików PNG. level 0, to ziemia, level 1 to drzewa/ściany te rzeczy za któymi nie widać bohatera i level 2 np.dachy to co znika jak bohater wejdzie np. do domu  oraz dodatkowo bitmapa(mapa dla programu, która poprzez sprawdzenie koloru piksela na indexach takich jakich jest bohater sprawdza czy bohater może w ogóle wejść na to pole (biały kolor-może wejść, czarny-nie może wejść). całość widać od góry jak w np.Sacred, Diablo.. zwykła mapka z pseudo 3D(imitowane 3D przez tekstury). jeden zestaw map (level0, 1, 2, bitmap) zawiera mapę, którą jesteśmy w stanie przejść w linii prostej w 30 sek(niezbyt dużo w porównaniu do 3 minutowego ładowania), a po przejściu do krawędzi mapy, ładowana jest następna mapa(znowu 3 minuty ładowania) i tak dalej..
mógłbym się pomęczyć i zrobić ładowanie następnych map w tle, ale i tak zagadkowe jest to że tak prosta gra ładowałaby się na początku wolniej niż np. wiedźmin 3.

Może ładowanie tekstur o takich wymiarach wymaga tyle czasu, a w wiedźminie jest załadowane znacznie mniejszy obraz, który jest powielany wielokrotnie.. hmm?
P-144832
Lora
» 2016-02-13 20:35:07
Sorry, nie doczytałem, że chodzi o ładowanie na samym początku gry.
P-144833
1aam2am1
» 2016-02-13 20:47:32
Usuń SOIL_FLAG_COMPRESS_TO_DXT
P-144834
Monika90
» 2016-02-13 20:48:26
Może tworzenie mipmap zabiera tyle czasu, czy jesteś pewien że są ci potrzebne?
P-144835
Nazgul
Temat założony przez niniejszego użytkownika
» 2016-02-13 21:17:07
szczerze mówiąc, nie są potrzebne;), zastąpiłem
zastąpiłem "SOIL_load_OGL_texture( "...", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT );"
na "SOIL_load_OGL_texture( "...", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, NULL);"

i faktycznie znacznie przyśpieszyło ładowanie;) teraz jest na poziomie takim jak jest łądowane w gimpie;) czyli około 30 sek

jednak ciągle nie rozumiem jak w tym wiedźminie 3 zrobili znacznie większy załadowany świat, znacznie większą ilość tekstur/obiektów oraz obliczeń fizycznych, a ładuje się tyle samo czasu.
Jakby ktoś znał odpowiedź na to nurtujące mnie pytanie, to byłoby ekstra;)

Póki co, dzięki za pomoc;)
P-144837
Lora
» 2016-02-13 21:51:55
Wcześniej dałem linka do wywiadu z twórcami RedEngine, ale później go usunąłem:
https://www.youtube.com/watch​?v=o0KVrwqPNkU. W pewnym momencie jest powiedziane, że używają oddzielnych wątków, żeby ładować zasoby gry w tle.
Edit:
Tu jest jeszcze jakaś dłuższa wersja: https://www.youtube.com/watch​?v=gFBQlIVMeBU
P-144838
« 1 » 2
  Strona 1 z 2 Następna strona