gpt4 book ai didi

java - 如何使图像生成在 Java 中可扩展?

转载 作者:行者123 更新时间:2023-11-30 11:57:16 27 4
gpt4 key购买 nike

我正在尝试提高在 Linux 上运行的 Web 应用程序中验证码图像呈现的性能。查看当前使用的内容,我发现瓶颈在于 Java2D 的使用,特别是 Graphics2D 类。

问题不在于执行速度,而在于可扩展性。基本上它不会缩放。在 1 个线程或 2 个线程中绘制验证码图像在执行时间方面没有任何改进。

例如,您可以查看以下为验证码图像创建背景的类。问题出现在调用 Graphics2D::setColor() 和 Graphics2D::drawLine() 时:

http://www.docjar.com/html/api/com/octo/captcha/component/image/backgroundgenerator/FunkyBackgroundGenerator.java.html

经过一番谷歌搜索后,我发现了一个主题,该主题说 Java2d 在多线程方面不是特别好(抱歉,不允许提供多个链接 :) 但是,如果谷歌搜索“java2d 多线程”,您可以轻松找到该主题,这将是第一个结果)

我相信一定有一些库可以在不使用 Java2d 的情况下提供绘图功能,但找不到它:( 或者 Java2d,可能可以切换到某种模式,它不会阻止对图形对象的访问(顺便说一句, headless 模式没有帮助)。

我将不胜感激任何建议。在此之前,感谢您的回答。

最佳答案

不会有快速的方法来共享可预测工作的 Graphics2D,因为除非您有办法对每个像素进行同步和重新排序,否则这将是一个巨大的竞争条件。

无论如何,您的 Graphics2DBufferedImage 提供支持,所以这可能就是拖慢您速度的原因。这是一个非加速表面,所以绘图总是非常慢。如果你的渲染服务器有它的图形硬件(它真的应该用于这样的应用程序)你可以使用 VolatileImage根据我的经验,这比 BufferedImage 快一个或两个数量级。

否则,你必须将你的背景生成切片到一个网格中,AffineTransform 它们所以它们都排成一行,通过播种使所有网格元素通用的“随机性”,缝合之后他们又回到了一起,希望 copyArea(...) 方法足够快,可以让您有所进步。我几乎可以说这是一种拼凑,而硬件加速才是解决之道。

您还应该考虑离线预渲染大量它们,并根据需要提供它们。这样一来,性能或多或少不是问题,除非您无法在服务器空闲时间满足需求(在这种情况下,无论哪种方式,您都需要新硬件,并且应该只制作一个硬件加速渲染盒)。

关于java - 如何使图像生成在 Java 中可扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3922440/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com