我正在尝试在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在多线程方面不是特别好(对不起,不允许提供多个链接:),但是,如果google代表“ java2d multithreading”,您可以轻松找到该主题成为第一个结果)
我相信必须有一些库可以使用Java2d完全提供绘图功能,但是找不到它:(或Java2d可能可以切换到某些模式,该模式不会阻止访问图形对象(顺便说一句,无头模式)没有帮助)。
我将不胜感激任何建议。在此之前,感谢您的回答。
最佳答案
共享可以正常工作的Graphics2D
的方法不会很快,因为除非您有一种方法可以对每个像素进行同步和重新排序,否则它将是一个巨大的竞争条件。
无论如何,您的Graphics2D
由BufferedImage
支持,所以这可能会使您放慢速度。这是一个非加速的表面,因此绘制总是非常缓慢。如果您的渲染服务器具有用于其的图形硬件(对于这样的应用程序确实应该如此),那么根据我的经验,您可以使用VolatileImage
,它比整个BufferedImage
大约快一个数量级或两个数量级。
否则,您将必须将背景生成切成一个网格,将它们AffineTransform
排列成一行,并通过播种使所有网格元素共有“随机性”,将后缀缝合在一起,并希望copyArea(...)
方法足够快,可以使您有所改进。我几乎可以说这是一个难题,而硬件加速是必须走的路。
您还应该考虑离线大量渲染它们,并根据需要提供它们。这样,除非您在服务器空闲时间内无法满足需求,否则性能几乎没有问题(在这种情况下,您无论哪种方式都需要新的硬件,应该只制作一个硬件加速的渲染框)。