2010-06-25 11 views
2

J'espère que quelqu'un est tombé sur le problème suivant avant.Le basculement de page Java n'est pas pris en charge sur Mac OS?

Mon application Java a des problèmes de performances graphiques sur Mac, j'ai donc fait une application de test simple (code ci-dessous). Lorsque je l'exécute sous Windows, la console me dit:

GraphicsConfiguration retournement? vrai
BufferStrategy renversant? vrai

Quand je lance le même code sur Mac OS, je reçois:

flipping GraphicsConfiguration? vrai
BufferStrategy renversant? False

Est-ce que cela signifie que sur Mac OS, le basculement de page n'est simplement pas pris en charge dans une application fenêtrée? Y a-t-il des astuces pour faire tourner les pages sur Mac OS sans passer en plein écran?

Tous les pointeurs sont bienvenus,
Mattijs

Utilisation JDK 1.6 sur Windows XP et Mac OS 10.5.

Le code:

import java.awt.image.BufferStrategy; 
import javax.swing.*; 
import java.awt.*; 

public class Test { 
int width = 640; 
int height = 480; 

GraphicsEnvironment graphEnv = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice graphDevice = graphEnv.getDefaultScreenDevice(); 
GraphicsConfiguration graphicConf = graphDevice.getDefaultConfiguration(); 

public Test() { 
    JFrame jFrame = new JFrame(graphicConf); 
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jFrame.setTitle("double buffer test"); 
    jFrame.setResizable(false); 
    jFrame.setFocusTraversalKeysEnabled(false); 

    Canvas canvas = new Canvas(); 
    canvas.setSize(width, height); 
    canvas.setIgnoreRepaint(true); 

    jFrame.getContentPane().add(canvas); 
    jFrame.pack(); 
    jFrame.setVisible(true); 

    System.out.println("GraphicsConfiguration flipping? " + graphicConf.getBufferCapabilities().isPageFlipping()); 
    canvas.createBufferStrategy(2); 
    BufferStrategy bufferStrategy = canvas.getBufferStrategy(); 
    System.out.println("BufferStrategy flipping? " + bufferStrategy.getCapabilities().isPageFlipping()); 

    while(true) { 
    Graphics g = bufferStrategy.getDrawGraphics(); 
    g.setColor(Color.BLACK); 
    g.fillRect(0,0,width,height); 
    g.setColor(Color.RED); 
    g.drawLine((int)(Math.random()*width),(int)(Math.random()*height), 
       (int)(Math.random()*width),(int)(Math.random()*height)); 
    bufferStrategy.show(); 
    g.dispose(); 
    } 
} 

public static void main(String[] args) { 
    new Test(); 
} 
} 
+0

Il était tout à l'heure, mais j'ai utilisé avec succès la page flipping (pas plein écran) dans JOGL sur un Mac. – finnw

Répondre

2

Les mauvaises nouvelles: je reçois le même résultat sur la même configuration Mac OS X. Les bonnes nouvelles: isAccelerated() est vrai.

System.out.println("BufferStrategy accelerated? " + bufferStrategy 
    .getCapabilities().getFrontBufferCapabilities().isAccelerated()); 

Au lieu de Canvas et BufferStrategy, je viens d'utiliser new JPanel(true).

Addendum: Par exemple,

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class NewTest extends JPanel implements ActionListener, Runnable { 

    private Random r = new Random(); 
    private Timer t = new Timer(10, this); 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new NewTest()); 
    } 

    @Override 
    public void run() { 
     JFrame f = new JFrame("NewTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     t.start(); 
    } 

    public NewTest() { 
     super(true); 
     this.setPreferredSize(new Dimension(640, 480)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     int width = this.getWidth(); 
     int height = this.getHeight(); 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, width, height); 
     g.setColor(Color.RED); 
     g.drawLine(r.nextInt(width), r.nextInt(height), 
      r.nextInt(width), r.nextInt(height)); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     this.repaint(); 
    } 
} 
+0

Bien que je ne sais pas pourquoi, l'application de mon application principale basée sur votre exemple de code résout le cpu-hungry-ness sur Mac. J'ai encore quelques artefacts à résoudre qui s'affichent lorsque j'ajoute TextFields au contenu rendu, mais jusqu'à présent cela semble être un grand pas en avant! Merci! – Mattijs

+0

@Mattijs: J'aime la commodité et la fiabilité de 'javax.swing.Timer'. Si vous avez ajouté des composants à 'JPanel', essayez' super.paintComponent (g) 'au lieu de' fillRect() 'dans' paintComponent() '. D'habitude, j'ajoute juste d'autres composants à proximité. – trashgod

+0

Mise à jour: les artefacts (une petite plage de pixels autour de TextFields ne se repeignant pas correctement) sont résolus en utilisant JTextField à la place. – Mattijs