Mac OS不支持Java页面翻转?

我希望有人碰巧偶然发现了以下问题。

我的Java应用程序在Mac上有图形性能问题,所以我做了一个简单的测试应用程序(下面的代码)。 当我在Windows上运行它时,控制台告诉我:

图形配置翻转? 真正
BufferStrategy翻转? 真正

当我在Mac OS上运行完全相同的代码时,我得到:

图形配置翻转? 真正
BufferStrategy翻转? 假

这是否意味着在Mac OS上,窗口应用程序根本不支持页面翻转? 是否有任何技巧可以在没有全屏的情况下在Mac OS上进行页面翻转工作?

所有指针都非常受欢迎,
Mattijs

在Windows XP和Mac OS 10.5上使用JDK 1.6。

代码:

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(); } } 

坏消息:我在相同的Mac OS X配置上得到了相同的结果。 好消息: isAccelerated()是真的。

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

我只使用new JPanel(true)而不是CanvasBufferStrategy

附录:例如,

 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(); } }