2010-04-19 4 views
2

Je reçois deux fois la fréquence d'image avec le précédent Java 6 u 3, qu'avec les nouveaux. Très étrange. Quelqu'un peut-il donner une explication?Performances de dessin dans Java 6 mises à jour 19,20 par rapport à Java 6 mise à jour 3?

On Core 2 Duo 1,83 GHz, vidéo intégré (un seul noyau est utilisé) - 1500 (âgé java) vs 700 fps Sur Athlon 64 3500+, vidéo discret - 120 (âgé java) vs 55 fps

L'application est un jeu simple avec un rectangle mobile. J'utilise Graphics2D pour dessiner à partir d'une boucle.

Modifier: du code. Le tout est gros, ce sont quelques parties importantes seulement.

public class SimpleRenderer extends JFrame{ 
SimpleGameEngine sge; 
Canvas canvas; // Our drawing component 
static final int WIDTH = 640; 
static final int HEIGHT = 480; 
Graphics2D g2d = null; 
Graphics graphics = null; 
Color background = Color.BLACK; 
BufferedImage bi; 
BufferStrategy buffer; 

public SimpleRenderer(KeyboardInput keyboard, SimpleGameEngine sge) throws HeadlessException { 
    this.sge = sge; 
    setIgnoreRepaint(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    canvas = new Canvas(); 
    canvas.setIgnoreRepaint(true); 
    canvas.setSize(WIDTH, HEIGHT); 
    add(canvas); 
    pack(); 

    // Hookup keyboard polling 
    addKeyListener(keyboard); 
    canvas.addKeyListener(keyboard); 

    canvas.createBufferStrategy(2); 
    buffer = canvas.getBufferStrategy(); 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice gd = ge.getDefaultScreenDevice(); 
    GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
    bi = gc.createCompatibleImage(WIDTH, HEIGHT); 


    this.setVisible(true); 
} 


public void draw(int fps) { 
    g2d = bi.createGraphics(); 
    g2d.setColor(background); 
    g2d.fillRect(0, 0, WIDTH, HEIGHT); 

    g2d.setColor( Color.GREEN); 
    g2d.drawString("Use arrow keys to move rect", 100, 20); 
    g2d.drawString("Press esc to exit", 100, 32); 
    g2d.setColor( Color.GREEN); 
    g2d.drawString("FPS: "+fps, 20, 20); 
    g2d.drawRect(sge.bob.x, sge.bob.y, sge.bob.w, sge.bob.h); 


    graphics = buffer.getDrawGraphics(); 
    graphics.drawImage(bi, 0, 0, null); 
    if(!buffer.contentsLost()) 
     buffer.show(); 
} 
... 

La boucle de jeu:

... 
    long loop =0; 
    long update = 0; 
    long start = System.currentTimeMillis(); 
    long lastIterationTime = System.nanoTime(); 

    long nanoseccount=0; 
    int cyclec = 0; 
    int fps=0; 
    System.out.println("start"); 

    while(run) { 
     long now = System.nanoTime(); 
     loop++; 
     while(lastIterationTime + StepSize*1000000 <= now && run ==true) { 
      Update(StepSize); 
      update++; 
      lastIterationTime += StepSize*1000000; 
     } 

     Draw(fps); 
     nanoseccount += System.nanoTime()-now; 
     cyclec++; 

     if (nanoseccount >= 1000*1000000) { 
      fps = (int)Math.round((double)cyclec/(nanoseccount/1000000000)); 
      nanoseccount = 0; 
      cyclec = 0;    
      continue; 
     } 

    } 
    System.out.println("loop "+ loop +" # update "+ update+ " # u/l " + ((double)update/loop)*100); 
    long runtime = (System.currentTimeMillis()-start); 
    System.out.println("run time "+ (double)runtime/1000 +"s # loop/s "+ ((double)loop/((double)runtime/1000))); 
    System.out.println("updates/s "+ ((double)update/((double)runtime/1000))); 
... 
+0

Votre code est une douzaine de fois plus rapide avec une carte graphique appropriée? C'est le vrai WTF. –

+0

En fait, l'ordinateur avec la meilleure vidéo (discrète) - l'Athlon l'exécute plus lentement. Mais le CPU est assez vieux. Je suppose qu'il n'y a pas d'accélération matérielle pour ce truc 2D simple. – Pesho

+1

Un petit exemple autonome serait bien. –

Répondre

1

Java 6 versions 19,20 et les premières versions publiées par Oracle au lieu de Sun. Ils ont des problèmes de gazillion dans de nombreux domaines. La fonctionnalité de démarrage Web est presque brisée par exemple.

Voici une issue like this. Google pour plus si vous voulez.

Pour le moment, je vous suggère de vous en tenir aux anciennes versions et d'attendre les prochaines versions.

Questions connexes