Performance probleme mit der SDL



  • hi!

    ich hab eine frage.

    und zwar ich schreibe gerade ein spiel mit der sdl und c und das leuft ziemlich langsam obwohl ich mir das nicht erklaeren kann...

    was mache ich(ich schreib hier nicht den ganzen code rein den ganzen findet man unter http://hazelnoot.ha.funpic.de/main.c):

    /*die main methode*/
    int main(void){
        int i, x, y;
        x = y = 0;
    
        survivor.x = (RES_X/2) - 40;
        survivor.y = (RES_Y/2) - 40;
        survivor.selected = FALSE;
        survivor.moving = FALSE;
        survivor.cast = FALSE;
        survivor.walkSpeed = 5;
    
        poin.x = 0;
        poin.y = 0;
    
        if (SDL_Init ( SDL_INIT_VIDEO ) != 0) {
            printf ("Konnte SDL nicht initialisieren: %s\n",
            SDL_GetError ());
            return EXIT_FAILURE;
        }
    
        atexit (SDL_Quit);
    
        if(fullscreen)
            screen = SDL_SetVideoMode (RES_X, RES_Y, 16, SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_FULLSCREEN);
        else
            screen = SDL_SetVideoMode (RES_X, RES_Y, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
    
        if (screen == NULL) {
            printf ("Videomodus konnte nicht eingerichtet werden: "
                    " %s\n", SDL_GetError ());
            return EXIT_FAILURE;
        }  
    
        fprintf(stderr, "lade map... ");
        if(!loadMap()){
            fprintf(stderr, "FAIL\n");
            return 1;
        }
        fprintf(stderr, "OK\n");
    
        fprintf(stderr, "lade interface... ");
        if(!loadInterface()){
            fprintf(stderr, "FAIL\n");
            return 1;
        }
        fprintf(stderr, "OK\n");
    
        fprintf(stderr, "lade chars... ");
        loadMan();
        fprintf(stderr, "OK\n");
    
        fprintf(stderr, "lade mobs... ");
        loadMOBS();
        fprintf(stderr, "OK\n");
    
        SDL_ShowCursor (SDL_DISABLE);
    
        /* start mainloop */
        while(eventloop()){
        	checkIfUserWantsToMoveMap();
        	blitMan(survivor.x, survivor.y);/*HIER WIRD GEBLITTET*/
        	blitMOBS();/*HIER EBENFALLS*/
            blitInterface();/*UND HIER AUCH*/
    
          moveMan();
    
          //WAENN ICH DAS AUCH NOCH REINMACHE IST ES ELENDIGLICH LAHM DAS SPIEL ES REAGIERT SEHR SEHR LANGSAM
          //SDL_Delay(10);
          SDL_Flip(screen);
        }
    
        SDL_FreeSurface(man_magician);
        SDL_FreeSurface(map);
        SDL_FreeSurface(man);
        SDL_FreeSurface(screen);
        SDL_FreeSurface(cross);
        SDL_FreeSurface(interfaceBack);
        SDL_FreeSurface(explosionButton);
        SDL_FreeSurface(mob_trasheater);
        SDL_FreeSurface(pointer_img);
        printf ("Erfolgreich beendet!\n");
    
        return EXIT_SUCCESS;
    }
    

    das spiel arbetet mit so nem scrolling wie man es von age of empires zum beispiel kennt... und das scrolling mach ich so:
    ein surface MAP wo alle maptiles raufgeblittet werden dann blitte ich einen gewissen ausschnitt von map auf das Screen surface.

    ich hoffe ihr findet vl einen fehler das gibt es doch nicht das ein sdl spiel so langsam ist.

    wo es sich am ärgsten auessert ist da ich den mauszeiger in dem spiel auch selber zeichne (in blitInterface) bewegt er sich urlangsam und mit verzoegerung eben.

    vl koennt ihr mir helfen

    danke linuxuser



  • ein paar blits mehr und ein nicht mehr allzu aktuelles system und sdl geht in die knie. ich hatte damals ähnliche probleme.
    am besten renderst du mit opengl und nutzt sdl nur um das fenster zu erstellen, eingabe etc.. da rennst du dann so schnell auch nicht mehr in performance probleme 🙂



  • --linuxuser-- schrieb:

    was mache ich(ich schreib hier nicht den ganzen code rein den ganzen findet man unter http://hazelnoot.ha.funpic.de/main.c):

    Wenn du die Bilder noch mit hochlädst, könnte mans mal ausprobieren.

    Ansonsten fehlt da auf jeden Fall SDL_DisplayFormat/Alpha.



  • hi!

    danke fuer die schnellen antworten das komplette programm mit bildern und alles unter: http://hazelnoot.ha.funpic.de/MLRTS.rar

    wie rendere ich das mit opengl? hab das noch nie gemacht kennst du da vl ein codebeispiel?

    danke!

    mfg linuxuser



  • Eine sehr simple Einführung zu "2D-OpenGL" findest du hier:
    http://www.resourcecode.de/index.php?section=12
    (SDL-Tutorial #8 - #10)

    Ist zwar nicht das Optimum aber ganz OK.



  • hi!

    danke der link hat mir sehr geholfen nur dort wird nur gezeigt wie ich aufd en screen blitte weis jemand wie ich auf ein offscreen surface blitten kann mit dem opengl zeugs?

    waer super thx!

    mfg linuxuser



  • garnicht bzw. der aufwand würde den nutzen nicht rechtfertigen.
    wenn du opengl zum rendern nutzt kannst du deine sdl_surfaces in die tonne kloppen, sprich du musst dein code zum zeichnen des bildes anpassen.


Anmelden zum Antworten