我希望以前有人偶然发现以下问题。
我的Java应用程序在Mac上存在图形性能问题,因此我制作了一个简单的测试应用程序(下面的代码)。当我在Windows上运行此命令时,控制台会告诉我:
GraphicsConfiguration是否翻转?真正的 BufferStrategy翻转?真正
在Mac OS上运行完全相同的代码时,我得到:
GraphicsConfiguration是否翻转?真正的 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()是的。
isAccelerated()
System.out.println("BufferStrategy accelerated? " + bufferStrategy .getCapabilities().getFrontBufferCapabilities().isAccelerated());
代替Canvas和BufferStrategy我只用new JPanel(true)。
Canvas
BufferStrategy
new JPanel(true)
附录:例如,
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(); } }