【问题标题】:Java - What's the most efficient way of drawing large number of pixels on the screenJava - 在屏幕上绘制大量像素的最有效方法是什么
【发布时间】:2018-04-04 11:10:36
【问题描述】:

我已经开始编写一个程序,我想在其中完全操纵像素是如何绘制到屏幕上的。所以我想将像素数据存储在 int 或 byte 数组中,并像每 1 毫秒一样在屏幕上绘制每个像素,但根据过去的经验,我知道这是非常低效的,并且 600x550 画布的 fps 降至 5 以下... 那么,为什么在绘制具有相同像素数的图像时不会发生这种情况呢?这个 Graphics 方法是如何工作的?还有更有效的方法吗?

【问题讨论】:

  • 看看BufferedImage。您可以在图像中设置单个像素,然后一次性绘制图像。
  • Graphics 是类,关于它的工作原理以及您可以使用哪些方法,请随时关注官方javadoc 关于我为此目的而拥有的 xp 可能是最好的缓冲图像,如上所述,检查setRGB方法
  • 使用 OpenGL 效率最高
  • 是的,但 OpenGL 不是由其他人编写的另一组代码吗?这不是魔术,每个编码员都受到编程语言的限制,如果一个人可以做出高效的事情,为什么其他人就不能这样做?
  • 我不喜欢使用其他人的 API,因为它们包含我可能不需要或我不理解的东西,我想完全控制我的程序,以便更轻松地解决错误。 ...另外,BufferedImage 是其他人制作的另一个代码,包含很多我不需要的东西,所以我的问题应该是“BufferedImage 是如何工作的”,但是 nvm...

标签: java


【解决方案1】:

将内存中的图像显示到屏幕缓冲区的过程是在 Java API 内部由一个名为 blitting 的进程完成的。您使用的图像类型甚至 Java 版本之间的细节有所不同。 Java 中的图像可以“加速”,这意味着它们可以是与硬件兼容的图像和实际驻留在 GPU 内存中的图像之间的任何内容。如果您实例化 BufferedImage,根据我的经验,它永远不会“加速”,但仍然非常快。

如果要将像素写入数组并快速显示,请使用以下方法:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
image.setAccelerationPriority(0); // Just to be sure
int[] array = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

然后在操作数组后照常绘制图像。

这比使用.setRGB() 具有更高的性能,因为没有进行色彩空间转换。

【讨论】:

  • 好的,我正在用image.getRaster().setPixels()设置像素,但性能仍然很差......
  • setPixels 仍然非常低效。我无法验证它是否转换了色彩空间,但它每个像素至少执行三个内部方法调用。你真的需要从图像中取出int[] array,然后只写给它。
猜你喜欢
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多