我认为通过缓冲图像的数据缓冲区进行直接像素操作是使用标准库绘制图形最快的方法,因为可以将图形对象开销降至最低。
但正如Perception所说,如果您想显示100,000个或更多的粒子,则应考虑使用OpenCl进行GPU编程。
当使用img.getRaster().getDataBuffer().getData()时,标准计算机的帧速率应该会更快。我知道这是事实,因为我可以在20-30帧每秒的速度下绘制整个屏幕,而屏幕总共有1,000,000个像素。我通过将渲染例程分成两部分并使用两个线程来获得这个速度。我的CPU是1.5ghz。
因此,我认为您可能在移动像素时犯了编码错误。请记住:创建新对象比添加操作长100倍。另外,请查看是否可以削减任何if语句。
此外,这可能很傻,但我假设您每帧只调用一次img.getRaster().getDataBuffer().getData()?
相关说明,绘制多像素粒子自然需要很长时间。
永远不要调用repaint();那是给新手用的,尝试在不必调用repaint();的情况下玩弄它。这种方法在过去两个月中给我带来了很多痛苦和不适,我很遗憾没有人告诉我还有另一种方法。100万个粒子会变得非常昂贵,所以您可能需要考虑使用蒙特卡罗方法,参见http://raytracey.blogspot.com/以获取更便宜的渲染选项。我不知道您是否能够承受操作所有这些粒子并保持20-30fps的速度,我刚刚观看了一个10秒钟的流体模拟,它在一台2.4ghz 6gb内存的机器上花费了3周时间。我很抱歉,因为我在BufferedImage方面的唯一经验是导入.png文件以便使用Graphics g进行绘制。最近我曾经参与过一个非常计算密集的项目,并且由于时间紧迫,我无法加速我的程序,所以如果您也处于同样的困境,请尝试使用这个包pet;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import javax.swing.*;
public class pet extends JPanel implements MouseListener{
public static JFrame frame = new JFrame("frame");
public pet() throws IOException{
setPreferredSize(new Dimension(870, 675)); //configuring panel
addMouseListener(this);
}
public static void main(String[] args) throws IOException{
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new pet();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
frame.addMouseListener(new pet());
}
public void paintRectangleAtPoint(Graphics g, int x, int y){
g.setColor(Color.BLACK);
g.drawRect(x, y, 100,100);
}
public void paintStuff(Graphics g, int x, int y){
g.setColor(Color.BLACK);
g.drawRect(x, y, 100,100);
}
@Override
public void mouseClicked(MouseEvent e) {
paintStuff(frame.getGraphics(),e.getX(), e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}