运行时混合大图像(Java / JOGL / Processing)

时间:2013-01-17 00:48:35

标签: java gpu processing jogl

我需要在运行时alpha混合2700x1600图像。它本质上是一个幻灯片,但同时运行多个“套牌”。此图中的每一列代表任何时刻的程序状态:

imageA1 <-blend-> imageA2 <-blend-> imageA3 ...
imageB1 <-blend-> imageB2 <-blend-> imageB3 ...
imageC1 <-blend-> imageC2 <-blend-> imageC3 ...
imageD1 <-blend-> imageD2 <-blend-> imageD3 ...
imageE1 <-blend-> imageE2 <-blend-> imageE3 ...
imageF1 <-blend-> imageF2 <-blend-> imageF3 ...

并不奇怪,我在保持帧率方面遇到了问题。我已经尝试在屏幕外缓冲区上进行混合,但这似乎没有多大帮助。是否有任何一般策略来处理可能适用于这种情况的大图像?也许是为了尽可能多地利用显卡?

这是我的基本策略(非常简化的代码,Processing而不是Java):

PImage a = loadImage("imageA.png");
PImage b = loadImage("imageB.png");
PGraphics buffer = createGraphics(width, height, OPENGL);

void draw () {
    buffer.beginDraw();
    buffer.tint(255, 200);
    buffer.image(a, 0, 0);
    buffer.tint(255, 100);
    buffer.image(b, 0, 0);
    buffer.endDraw();
    image(buffer, 0, 0);
}

我正在使用Java / Processing,但欢迎使用原始JOGL的建议。

我在管理记忆方面也遇到了一些麻烦;这些未压缩的图像中的每一个都是~17MB(2700x1600x4字节),并且总共有大约60个图像我将要混合(不是全部同时!)。我有针对内存问题的策略,这些问题超出了本问题的范围,但我将其包含在此处,以防有一种巧妙的方法来平衡计算机内存和显卡之间的内存使用情况。

(额外信息,对于那些关心的人:我的理解是Processing的image()调用(将图像对象绘制到屏幕上)使用JOGL作为其底层实现。这种理解来自于查看Processing的{{ {3}},当使用PGraphicsOpenGL渲染器(我)时,最终会在PGraphics.imageImpl() method内的本机JOGL调用。)

1 个答案:

答案 0 :(得分:1)

你最大的敌人将是磁盘I / O.在过去,我使用了一个内存缓冲区来保存所有需要处理的图像。在您的情况下,该缓冲区将是您的60个图像的一部分......比如10个图像切片缓冲区。

Producer Thread-1:

从磁盘加载图像---&gt; | 10图像缓冲区| -----&gt;以FIFO方式处理图像

消费者线程-2: 图像准备好显示---&gt; |显示缓冲区| -----&gt;绘制图像

此外,您可以使用JProfiler配置代码以查看其他瓶颈。