代码之家  ›  专栏  ›  技术社区  ›  Mattijs

Mac OS不支持Java翻页?

  •  2
  • Mattijs  · 技术社区  · 14 年前

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

    图形配置翻转?是的
    缓冲策略翻转?是的

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

    图形配置翻转?是的
    缓冲策略翻转?假

    这是否意味着在Mac OS上,窗口应用程序根本不支持翻页?有没有什么技巧可以让翻页在Mac操作系统上工作而不需要全屏?

    欢迎大家指点,

    代码:

    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();
     }
    }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   trashgod    14 年前

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

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

    而不是 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();
        }
    }
    
        2
  •  0
  •   Marc Johnen    4 年前

    因此,我们不妨尝试一下相反的方法-Dsun.java2d.opengl=false