如何在所有平台上使用硬件加速绘制图像?

Posted

技术标签:

【中文标题】如何在所有平台上使用硬件加速绘制图像?【英文标题】:How draw images with hardware acceleration on all platforms? 【发布时间】:2017-11-29 02:53:26 【问题描述】:

我用 red=x 和 alpha=y 创建了 256x256 图像:

    int[] pix = new int[256*256];
    for (int i = 0; i < pix.length; ++i)
        pix[i] = i << 16;
    BufferedImage img1 = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
    img1.setRGB(0, 0, 256, 256, pix, 0, 256);

并已复制到易失性图像:

    VolatileImage img2 = canvas.createVolatileImage(256, 256);
    img2.createGraphics().drawImage(img1, 0, 0, null);

当我将 BufferedImage 绘制到画布上时,它会错误地处理 alpha 并且没有加速(drawImage 为 0.9 毫秒):

当我绘制 VolatileImage 时,它​​会处理 alpha 并加速(0.03ms):

但它在 Windows 下。在 MacOS 下,我看到了不同的结果。对于 BufferedImage,它不处理 alpha,但加速,对于 VolatileImage,它正确处理 alpha,但不加速。 (或者可能两者都没有加速,只是 BufferedImage 的软件处理要快得多)。

问题 - 如何在所有平台上使用正确的 alpha 处理和加速正确地绘制图像。

ps。 img2.setAccelerationPriority(1) 没有任何效果。

pps。我错了,在第二种情况下它不正确的 alpha 处理,它只是预先计算了图像,并将 alpha 应用于cavas的默认背景颜色。

【问题讨论】:

【参考方案1】:
System.getProperties().setProperty("sun.java2d.opengl", "true");        

这个设置解决了加速问题,现在drawImage有0.004毫秒

而且 alpha 处理完全没有问题,我只是在同一个地方用 alpha 画了 1000 次相同的图像进行时间测试,它导致了如此丑陋的画面

【讨论】:

以上是关于如何在所有平台上使用硬件加速绘制图像?的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg之Intel平台使用硬件加速

使用 lockCanvas() 的 Android TextureView 硬件加速

如何在 Android 上使用硬件加速视频解码?

PhotoView大图绘制——硬件加速限制

PhotoView大图绘制——硬件加速限制

Android硬件加速