# Spiel: Performance mit Overlays



## m@nu (13. Sep 2006)

hi zusamm'n

mein sokoban-clone hat eine eigene engine.
über die normale GameView können Overlays hinzugefügt werden, welche von der engine anschliessend mitgezeichnet werden.
das eine overlay zeigt z.b. infos zum level, spielzeit, bewegungen usw. an.

genau hier findet sich mein problem.
das overlay muss immer wieder neu gezeichnet werden, da die spielzeit ja kontinuierlich steigt (ausser während der spielpause  )

bis anhin habe ich im overlay selbst einen thread erstellt, welcher das overlay neu zeichnen lässt.

```
private void initThread() {
        repaintThread = new Thread(new Runnable() {
            public void run() {
                while(true) {                    
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    
                    gameController.repaintGameView();
                }
            }
        });
        
        repaintThread.start();
    }
    
    public void paintOverlay(Graphics g) {
        String level = "Level: " + gameData.getLevelNumber();
        String time = statistics.getFormattedElapsedTime();
        String moves = "Moves: " + statistics.getMoves() + "/" + statistics.getPushes();
        String box = "Fertig: " + statistics.getBoxPercentage() + " (" + statistics.getBoxStatus() + ")";
        
        int oldW = g.getClipWidth();
        int oldH = g.getClipHeight();
        int oldX = g.getClipX();
        int oldY = g.getClipY();
        
        
        g.setClip(0, 0, canvasWidth, 13);
        NovaBitmapFont.getInstance().drawString(g, level, 5, 5);
        int width = NovaBitmapFont.getInstance().calcStringWidth(time);
        NovaBitmapFont.getInstance().drawString(g, time, canvasWidth - width - 5, 5);        
        
        g.setClip(0, canvasHeight-13, canvasWidth, 13);
        NovaBitmapFont.getInstance().drawString(g, moves, 5, canvasHeight - 13);
        width = NovaBitmapFont.getInstance().calcStringWidth(box);
        NovaBitmapFont.getInstance().drawString(g, box, canvasWidth - width - 5, canvasHeight - 13);
        
        g.setClip(oldX, oldY, oldW, oldH);
        
        if(repaintThread == null) initThread();
    }
```

trotz des eingefügten clippings geht die performance mehr oder weniger runter, wenn der benutzer die spielfigur bewegt (was mich eigentlich nicht wundert... da ja so bis zu 3 repaints in einer halben sekunde gemacht werden)
habe ich das clipping falsch eingesetzt oder gibt es hierfür eine bessere lösung?

danke & cheers
m@nu


----------



## Jockel (13. Sep 2006)

Schonmal versucht, die ständige Neu-Erzeugung der Variablen zu umgehen?
Und auch, dass sechs Mal eine Instanz von NovaBitmapFont geholt wird, ohne diese zwischenzuspeichern, dürfte etwas Performance ziehen.


----------



## m@nu (13. Sep 2006)

hab den paint-code ein wenig aufgeräumt... läuft ein wenig schneller jetzt...
muss mal schauen wie es auf dem handy später aussieht... benutze momentan im büro eh das normale WTK ... später soll das ganze auf das SonyEricsson WTK zugeschnitten sein.

J2ME is halt doch noch n'bisschen kleinlicher was code-optimierung angeht


----------

