在Java中绘制像素缓冲区的最快方法是什么?

3

现在我正在使用来自Java 2D中绘制原始图像的Dummy指南的采用的代码。

在Debian i386上,搭配Oracle JVM、Nvidia 8600 GTS和Intel Core 2Duo 2.6 GHz,我的窗口大小为800x600,帧率达到了240 FPS。是否存在更快的方法?这是我的代码:

import java.awt.Graphics;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;

public class TestFillRasterRate
{
    static class MyFrame extends JFrame
    {
      long framesDrawed;
      int col=0;

      int w, h;
      int[] raster;
      ColorModel cm;
      DataBuffer buffer;
      SampleModel sm;
      WritableRaster wrRaster;
      BufferedImage backBuffer;

      //@Override public void paint(Graphics g)
      public void draw(Graphics g)
      {
        // reinitialize all if resized
        if( w!=getWidth() || h!=getHeight() )
        {
            w = getWidth();
            h = getHeight();

            raster = new int[w*h];

            cm = new DirectColorModel(24, 255, 255<<8, 255<<16);
            buffer = new DataBufferInt(raster, raster.length);
            sm = cm.createCompatibleSampleModel(w,h);
            wrRaster = Raster.createWritableRaster(sm, buffer, null);
            backBuffer = new BufferedImage(cm, wrRaster, false, null);
        }

        // produce raster
        for(int ptr=0, x=0; x<w; x++)
            for(int y=0; y<h; y++)
              raster[ptr++] = col++;

        // draw raster
        g.drawImage(backBuffer,  0,0, null);
        ++framesDrawed;

        /**
        SwingUtilities.invokeLater(new Runnable()
        {   @Override   public void run()
            {     repaint();
            }
        });/**/
      }
    }

    public static void main(String[] args)
    {
      final MyFrame frame = new MyFrame();

        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        // draw FPS in title
        new Timer(1000, new ActionListener()
        {   @Override public void actionPerformed(ActionEvent e)
            {   frame.setTitle(Long.toString(frame.framesDrawed));
                frame.framesDrawed = 0;
            }
        }).start();

      /**/
      frame.createBufferStrategy(1);
      BufferStrategy bs = frame.getBufferStrategy();
      Graphics g = bs.getDrawGraphics();
      for(;;)
        frame.draw(g);
      /**/
    }
}

snapshot


2
这里的问题是什么?有没有更快的方法存在?- 240 fps不够快吗?截图与你的问题有什么关系?它看起来好像有些问题... - ug_
2
没有问题,这是一个填充增量 int_argb 的屏幕,用于测试。 - biv
这里可以看到一个相关的示例 - trashgod
1个回答

2
使用BufferStrategy可能是获得更多FPS的一种方法。不使用由paint()方法传递的Graphics,而是通过例如jFrame.createBufferStrategy(/*缓冲区数*/)BufferStrategy bufferStrategy = jFrame.getBufferStrategy()在外部创建它们。
如果您想要访问Graphics,则使用Graphics g = bufferStrategy.getDrawGraphics(),然后像往常一样绘制您的图像。我不确定这是否会在如此简单的示例中真正提高FPS,但在进行更复杂的绘制时,它肯定会有所帮助。
编辑:仅使用1个后备缓冲区创建BufferStrategy是相当无用的,因为它将继续直接向屏幕绘制。缓冲器大小应为2-5,具体取决于您的显卡可以处理多少VRAM。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接