# Anfänger braucht einen Rat ^^ --> Performance



## Tapsi (25. Nov 2008)

Hallo , ich programmiere ein Spiel und wollte mal die Profis fragen ob man das untere noch performanter machen kann 


```
public void starte_takt(){
        
        takt = 0;
        ...
        
        // Diese Schleife läuft solange das Spiel nicht beendet wurde
        while (true){
            
            System.out.println(takt);   // Tester um die geschwindigkeit zu sehen
            // SPIELMETHODEN
            
                // Runde für Spieler starten
                ...
            // <-- ENDE SPIELMETHODEN
            
            // GRAFIKMETHODEN
            
                Farbbild grafik_komplett = new Farbbild(16*spielfeldgroeße_x,16*spielfeldgroeße_y); 
                Graphics gp = grafik_komplett.createGraphics();
                
                for( int x = 0 ; x < spielfeldgroeße_x ; x++ ){
                    for( int y = 0 ; y < spielfeldgroeße_y ; y++ ){
                        gp.drawImage(sprites[1][0],(x*16) ,(y*16)-16 , null );   // Sprite[1][0] beinhaltet ein 16x32 Sprite (von einer .png) mit AlphaChannel
                    }
                }
                
                fenster.setze_grafik(grafik_komplett); 
            
            // <-- ENDE GRAFIKMETHODEN
            
            try{Thread.sleep (1);}         
            catch (InterruptedException ex){}   // Geprüfte Exception
            
            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
            takt = takt%7 + 1;                 // Der aktuelle Takt ( akt. 32er Takt )
            
        } 
    }
```

Ohne Alpha ( laden einer PNG ) zeichnet er extrem schnell , aber Alpha ist extrem wichtig , da die Felder 16x16 sind und die Sprites 16x32. Einige Sprites wie Berge enthalten Informationen die über das obere Feld gezeichnet werden müssen...


----------



## Ark (26. Nov 2008)

Versuche, irgendwie dieses new aus der Schleife rauszukriegen, gleiches gilt für das createGraphics(). Auch dieses Modulo solltest du irgendwie rausnehmen (Divisionen sind teuer). Wozu soll takt überhaupt gut sein? Das mit der Threadpriorität ist auch invariant, kann also außerhalb der Schleife stehen. Mit Thread.sleep(1) kommst du theoretisch auf 1000 fps - kein Mensch braucht so etwas. Fernsehbilder haben z.B. nur 25 fps. Ganzzahl "mal 16" kannst du auch durch "vier Bits nach links schieben" abbilden. Das kann was ausmachen. Und wo um alles in der Welt bist du überhaupt? Wo ist die paint()- bzw. paintComponent()-Methode?

Ark


----------



## Quaxli (26. Nov 2008)

Ein bißchen mehr als 25 fps sollten es schon sein - abhängig vom Spiekonzept.
Ein Ansatz könnte z. B. sein, sich an der Monitorfrequenz zu orientieren. 
Da es ratsam ist, Bewegungen in Abhängigkeit von der Zeit, die der GameLoop benötigt, zu berechnen, damit das Spiel auf allen Rechnern flüssig läuft, ist eine hohe FPS-Zahl hier sehr vorteilhaft. 
Aus meiner Erfahrung wäre ein Wert größer 60 erstrebenswert. 

Google mal nach "Killer Game Programming" bzw. sollte hier im Forum auch irgendwo ein Link sein. Dort gibt es ein großes Kapitel zu dem Thema. Angefangen von einem ganz einfachen Loop mit "fixem Thread.sleep(...)" bis zu einem sehr ausgereiften Ansatz mit Anpassung and die Monitorfrequenz, Aussetzen der Grafikanzeige, aktivem Rendern, etc..


----------



## Tapsi (26. Nov 2008)

Danke für die schnellen Tipps.

Dies ist die Schleife die solange durchläuft bis das Spiel zu ende ist.
Ja gestern kurz vorm Schlafen gehen ist mit auch ne Idee eingefallen , dass Ich das Bild zeichnen so groß wie möglich 
aus der Schleife schaffen muss. 

Das Problem ist, das alle 2 Taktschritte ein anderes Bild gezeichnet wird ( ich bekomme es nicht hin animationen aus Gif bildern zu lesen , weiß einer was ??? ). Ich teile die gif in 4 einzellne Bilder und lasse alle 2 Takte das Bild wechseln ( Takt 2 -> Einheit_sprite-1 , Takt 5 -> Einheit_sprite-3 usw. ).


----------



## Quaxli (26. Nov 2008)

Wie Ark schon gesagt hat, können wir von Deinem Code nicht wissen, wie Du Dein Spiel konzipiert hast. Zum Beispiel fehlt auch der Teil wo Du zeichnest (hat Ark auch schon angemerkt).

Aus dem Code oben würde ich jetzt erst mal vermuten, daß Du die Zeichnen-Operationen grundsätzlich falsch konzipiert hast.


----------



## Tapsi (26. Nov 2008)

habe die zeichnen_operationen umgeändert und größtenteils ausgelagert. Läuft nun sauschnell   

Und fenster.setze_grafik(...); ruft an der Klasse Fenster die das Objekt mit der Grafikfläche enthält die paint Methode auf, die eigentlich nur grafik_komplet sichtbar macht :wink:
Grafik komplett wird also in der schleife berechnet und der letzte befehl übergibt alles zum fenster.
Im moment Lasse ich 4 einzellne komplette feld grafiken berechnen die ich immer im wechsel anzeigen lasse ( damit es einheiten animation gibt ), anstatt das immer wieder neu zu berechnen, wird die grafik nur neu berechnet wenn sich eine Einheit bewegt hat.

Das Spiel wird eine Art Advance Wars Klon


----------



## Ark (26. Nov 2008)

Ha! BlueJ! Das erklärt einiges. ^^

Spaß beiseite. Ich habe mich zwar noch nicht sonderlich der Spieleprogrammierung gewidmet, aber für meinen Geschmack sind die im Diagramm dargestellten Abhängigkeiten der Wahnsinn. Und noch immer gilt: So lange du uns nicht die ultimative paint()/paintComponent()-Methode zeigst, werden wir dir nicht groß weiterhelfen können.

Ark


----------



## Tapsi (26. Nov 2008)

Im moment gehts ja super voran   

Trotzdem danke ich euch das ihr mir helft ^^

Falls jemand weiß wie Color Overlay geht , hab ein Post aufgemacht. Für das wäre ich echt dankbar , hab mich schon durch ewig viele Seiten gebuddelt aber nix gefunden.

PS : Muss ich vom Studium her benutzen xD


----------

