Java BuffereImage像素与Graphics.drawImage

Java BuffereImage像素与Graphics.drawImage,java,image,graphics,pixels,Java,Image,Graphics,Pixels,制作缓冲图像与使用以下方法绘制像素之间的区别是什么: private BufferedImage img; private int[] pixels; pixels = ((DataBufferInt) img.getRaster().getDataBuffer()); 而仅仅是使用一个图像作为 img 变量,并使用img的图形执行以下操作: img.getGraphics().drawImage(/*image*/, x, y, observer); 编辑: 这是为了游戏开发 使用g

制作缓冲图像与使用以下方法绘制像素之间的区别是什么:

private BufferedImage img;
private int[] pixels;

pixels = ((DataBufferInt) img.getRaster().getDataBuffer());
而仅仅是使用一个图像作为

img
变量,并使用img的图形执行以下操作:

img.getGraphics().drawImage(/*image*/, x, y, observer);
编辑:

这是为了游戏开发

  • 使用
    getGraphics()
    
  • 请注意,您不应该像演示的那样通过链接执行此操作:
    img.getGraphics().drawImage(/*image*/,x,y,observer)由于这不允许您在处理完图形对象后立即将其丢弃,因此可能会耗尽资源
  • 直接操纵光栅的位可能是一种更快的改变方式,但我相信如何做到这一点取决于您使用的BuffereImage的类型

使用
图形方法的优势:

  • 使用现成的高级操作,如
    drawImage
  • 在某些平台上,您可能会受益于硬件加速/优化
  • 它相对独立于底层图像格式工作
降低像素缓冲区级别的优点:

  • 它对于非常专业的用途非常有用,例如,通过某种公式/计算生成每个像素(例如,我使用此技术生成自定义颜色渐变)
  • 对于单个像素操作(但对于
    drawImage
    等批量操作,速度可能会稍快一些,因为您无法获得硬件加速)

如果只是游戏中的常规屏幕渲染,我认为
图形
路线可能是最好的。如果你正在做一些有趣的事情,比如动态图像生成,那么像素缓冲区路径是值得探索的。

这和@mikera的答案都很好,似乎都支持
drawImage()
。我喜欢这个答案,因为它提到了
dispose()
问题,这很重要。可能还值得一提的是,在OP中直接访问光栅/数据缓冲区可能会在映像实例的生命周期(!)内禁用sw/hw优化,因此请小心使用。如有疑问,请提供个人资料。:-)