在Java中绘制像素缓冲区的最快方法是什么
现在我使用的是来自 我在Debian i386上使用Oracle JVM、Nvidia 8600 GTS、Intel Core 2Duo 2.6 GHz,在800x600窗口中获得240 FPS 存在更快的方式吗?我的代码:在Java中绘制像素缓冲区的最快方法是什么,java,swing,graphics,Java,Swing,Graphics,现在我使用的是来自 我在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 {
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);
/**/
}
}
导入java.awt.Graphics;
导入java.awt.event.*;
导入java.awt.image.*;
导入javax.swing.*;
公共类TestFillRasterate
{
静态类MyFrame扩展了JFrame
{
长框敬畏;
int col=0;
int w,h;
int[]光栅;
彩色模型cm;
数据缓冲区;
抽样模型;
可写光栅;
BufferedImage backBuffer;
//@替代公共空白绘制(图形g)
公共空间绘制(图g)
{
//如果调整了大小,则重新初始化所有
如果(w!=getWidth()| h!=getHeight())
{
w=getWidth();
h=getHeight();
光栅=新整数[w*h];
cm=新的DirectColorModel(24255255获得更多FPS的方法可能是使用缓冲策略。而不是使用图形通过paint()
方法,您必须使用外部创建它们,例如jFrame.createBufferStrategy(/*缓冲区数*)
和BufferStrategy=jFrame.getBufferStrategy()。
如果您想访问图形
,可以使用Graphics g=bufferStrategy.getDrawGraphics()
,然后像往常一样绘制图像。我不确定在这样一个简单的示例中,这是否真的会提高FPS,但在进行更复杂的绘制时,肯定会
编辑:创建一个只有1个backbuffer的BufferStrategy
是非常无用的,因为它只会继续直接绘制到屏幕上。根据graphicscard可以处理的vram数量,buffersize应该是2-5。这里有什么问题?存在更快的方法吗?-240 fps不够快吗?屏幕截图有什么和你的问题有关吗?看起来有点问题…没什么问题,它的屏幕上充满了递增的int_argb,用于测试。这里可以看到一个相关的。