1

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

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 ...

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

这是我现在的基本策略(非常简化的代码,处理而不是 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 的PGraphics.imageImpl() 方法的源代码,当使用 PGraphicsOpenGL 渲染器(我是)时,最终会在PGraphicsOpenGL.rawPolys()内的本机 JOGL 调用中结束。)

4

1 回答 1

1

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

生产者线程 1:

load image from disk--->|10 image Buffer|----->以FIFO方式处理图像

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

此外,您可以使用 JProfiler 分析您的代码以查看其他瓶颈。

于 2013-01-17T15:17:55.407 回答