Toon posts:

[Java] Tekenroutine versnellen :?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een Java-programmaatje dat PPM-files inleest. Op zich niet zo lastig allemaal. Het plaatje wordt opgeslagen in drie int[][]-arrays, een array voor rood, een array voor groen en een array voor blauw. Het enige jammere is dat de tekenroutine zo ontzettend traag. Ik gebruik een plaatje van 320x240 pixels, en daar duurt een repaint() al rustig een paar seconden. M'n paint(Graphics g) ziet er (enigszins uitgekleed) zo uit.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void paint(Graphics g) {
                super.paint(g);
                Graphics2D g2 = (Graphics2D)g;
                if(!ppmLoaded) {
                    // ...
                }
                else {
                    for(int x = 0; x < width; x++) {
                        for(int y = 0; y < height; y++) {
                            //...
                            g2.setColor(new Color(ppmImageRed[x][y], ppmImageGreen[x][y], ppmImageBlue[x][y]));
                            g2.drawLine(x, y, x, y);
                        }
                    }
                 }
}

Heeft iemand enig idee of ik zo'n routine ook op de een of andere manier kan versnellen :?

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Als je het plaatje inlaadt in een buffer, hoef je tijdens de paint alleen nog maar de buffer op het scherm te gooien, wat me sneller lijkt dan puntje voor puntje dat bestand uitlezen.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 15:47
repaint teneerste alleen het gedeelte dat ook daadwerkelijk gerepaint moet worden (je kan de aan de component relatieve coordinaten eraan meegeven)

Verder kun je evt met
Java:
1
2
3
4
5
6
long time = System.currentTimeMillis();

......

time = System.currentTimeMillis() - time;
System.out.println("Duration: " + time);


zien hoeveel tijd er in een bep. stuk code gaat zitten. Evt. zou je ook met profiling (java -Xrunhprof:help) ook eea kunnen achterhalen.

Verwijderd

Topicstarter
BufferedImage is mijn beste vriend :)
Bedankt voor de tip, het draait als een zonnetje nu 8)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

per-pixel calls zijn altijd not done, waar je ook mee/in werkt :)

Over het algemeen is er altijd wel bepaalde functionaliteit om snel het ene plaatje in het andere plaatje te tekenen (en dat ene plaatje teken je dan vooraf, zoals jij nu doet), of iets om direct jouw buffer te gebruiken als source (zoals java's MemoryImageSource, of nog abstracter, een ImageProducer, hoewel die misschien wel achterhaald is onder java 1.3+, ik ben niet meer zo op de hoogte).

Als je veel zelf heel snel moet tekenen, zoals bijvoorbeeld bij het genereren van 3d beelden, is die laatste variant goed bruikbaar. Ik heb ooit en 3d engine verwerkt in een applet, die is ook gemaakt van een ImageProducer die intern gewoon een int array heeft, [spam] kijk maar [/spam]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.