2015-11-01 81 views
2

现在我使用Dummy’s guide to drawing raw images in Java 2D 的采用代码我在Debian i386上使用Oracle JVM,Nvidia 8600 GTS和Intel Core 2Duo 2.6 GHz获得240 FPS,800x600窗口。什么是在Java中绘制像素缓冲区的最快方式

是否存在更快的方式?我的代码:

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不够快?截图与你的问题有什么关系?它看起来像一些错误的... –

+2

没有错,它是屏幕充满增量int_argb,为测试。 – biv

+0

在此处查看相关的[示例](https://sites.google.com/site/drjohnbmatthews/raster)。 – trashgod

回答

2

一种方式来获得更多的FPS很可能是使用BufferStrategy。而不是使用Graphics通过我的paint()方法,您将不得不使用例如外部创建它们。 jFrame.createBufferStrategy(/*number of buffers*/)和BufferStrategy bufferStrategy = jFrame.getBufferStrategy()。 如果您然后想要访问Graphics,则使用Graphics g = bufferStrategy.getDrawGraphics(),然后照常绘制图像。我不确定这样一个简单的例子是否能够真正改善您的FPS,但是当进行更复杂的绘制时,它肯定会。

编辑:创建BufferStrategy只有1个backbuffer是很没用的,因为它只会继续直接画到屏幕上。 buffersize应该是2-5,具体取决于您的图形卡可以处理多少vram。

+1

谢谢,FPS增加了10 :) – biv

相关问题