我需要在运行时对 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 调用中结束。)