Allegro Geschwindigkeitsproblem



  • Ich hab ein Geschwindigkeitsproblem mit einem Programm. Ich erreiche nicht mehr als 20 Frames pro Sekunde.

    Der Haupt-Geschwindigkeitsfresser ist die Funktion draw() der Map Klasse:

    Ich habe der Übersichtlichkeit halber die unnötigen Funktionen herausgenommen.

    #define	SETTILE(x,y)	((x<<8)+y)
    #define	GETTILE_X(x)	(x>>8)
    #define	GETTILE_Y(x)	(x-((x>>8)<<8))
    
    class Map {
    private:
        int     w, h;
        int	   map[512][512];
        BITMAP *tiles;
        int     tileWidth;
        int     tileHeight;
    
        BITMAP  *dest;
        int      visibleTilesX;
        int      visibleTilesY;
    
        inline void drawTile(BITMAP *dest, int x, int y, int tile);
    public:
        void draw(int wx, int wy);
    };
    
    void Map::drawTile(BITMAP *dest, int x, int y, int tile) {
        blit(tiles, dest, GETTILE_X(tile)*tileWidth, GETTILE_Y(tile)*tileHeight, x, y, tileWidth, tileHeight);
    }
    
    void Map::draw(int wx, int wy) {
        int ox = wx % tileWidth;
        int oy = wy % tileHeight;
    
    	int sx = wx>>5;
    	int sy = wy>>5;
    
        for (int y=0; y < visibleTilesY+1; ++y) {
            for (int x=0; x < visibleTilesX+1; ++x) {
                drawTile(dest, x*tileWidth-ox, y*tileHeight-oy, map[x+sx][y+sy]);
            }
        }
    }
    

    Die beiden for-Schleife am Ende der draw-Funktion kommen zusammen auf 825 Aufrufe der drawTile-Funktion. Soviele Aufrufe sind nötig, um alle sichtbaren Tiles der Karte zu zeichnen. Bei einer kleineren Auflösung habe ich noch 494 Durchgänge, aber auch nur 30 fps.
    Wie könnte ich das optimieren?



  • Wo im Standard war nochmal der Allegro-Abschnitt? 🙄



  • Dieser Thread wurde von Moderator/in davie aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Paulaner schrieb:

    Wie könnte ich das optimieren?

    Nicht die blit-Funktion aufrufen.

    Bye, TGGC (Dem beste BdT)



  • Hallo TGGC,
    war das ironisch gemeint, oder gibt es eine alternative Funktion?
    Ich "muss" die Blit-Funktion leider so oft verwenden, da ich damit alle sichtbaren Tiles meiner Karte zeichne. Und bei 32x32 Pixel sind das leider so viele. Aber in anderen Spielen funktioniert das doch auch ohne weiteres. Mache ich vielleicht einen Denkfehler? Das System habe ich einem Buch entnommen.



  • Paulaner schrieb:

    Hallo TGGC,
    war das ironisch gemeint, oder gibt es eine alternative Funktion?

    War dein Thread ironisch gemeint? Was willst du an einer Schleife, die x-mal die Funktion foo aufruft, optimieren?

    Bye, TGGC (Der Held lebt!)



  • Ich hab nicht wirklich ahnung, aber könnte es sein das man in diesem fall beim laden einer "map" die tiles zu einer groesseren fläche zusammenpackt ... so das man z.b. anstatt 16 tiles nur noch 4 zusammengefasste flächen blittet ?



  • Die Idee finde ich sehr gut ich werd's mal versuchen und dann sagen, ob's was gebracht hat.



  • durch die Technik komm ich auf gut doppelt so viele Frames pro Sekunde.
    Mein Hauptfehler: Ich lass die Karte mit den Tiles jedes mal neu zeichnen. Dabei müsste ich sie ja nur beim "scrollen" neu zeichnen.



  • Huhh, ich hatte recht.

    Typisch. 😎

    Bye, TGGC (Der Held lebt!)


Anmelden zum Antworten