【问题标题】:Runtime blending large images (Java/JOGL/Processing)运行时混合大图像(Java/JOGL/Processing)
【发布时间】:2013-01-17 00:48:34
【问题描述】:

我需要在运行时对 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() method 的源代码,当使用 PGraphicsOpenGL 渲染器(我是)时,最终会在 PGraphicsOpenGL.rawPolys() 内的本机 JOGL 调用中结束。)

【问题讨论】:

  • 你能把这个问题分解一下吗?如果您对某个特定部分有困难,请专门发布一个关于它的问题,并附上您尝试过的部分。
  • 必须是 Processing/Java 吗?这几乎是题外话,但你考虑过 MaxMSP/**Jitter** 吗?抖动矩阵非常快,如果需要,您可以使用 gl。如果补丁可视化编程范式是一个问题,您可以使用 C++、JavaScript 中的脚本或 Java 中的扩展 MaxObject(我记得 Max5 中就是这种情况,不确定 Max6 中是否仍然存在),但想法是 Jitter 处理得很快带像素
  • @GeorgeProfenza,是的,抖动是为这种事情量身定做的。不幸的是,这只是一个更大的应用程序的一个组件,并且不会发生抖动重写;)

标签: java gpu processing jogl


【解决方案1】:

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

生产者线程 1:

从磁盘加载图像--->|10个图像缓冲区|----->以先进先出的方式处理图像

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

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

【讨论】:

  • 我发现如果我将 JVM 设置为 -Xmx1536M,我实际上可以在 init 上加载所有图像,但是允许 Java 分配这么多内存会使我的操作系统陷入困境,并影响程序内的响应能力。用户将能够在图像之间快速擦洗(在我的问题中添加了图表),因此虽然我可以在一个线程中按需加载图像并在另一个线程上显示它们,但我担心加载操作和 GC 清理会离开我处于同样的呆滞状态...
  • GC 清理问题您无能为力...我的意思是您的对象没有其他引用并且正在回收内存。至于加载操作,我很犹豫是否建议您使用 OpenCL 的 Java 绑定。您确实需要首先分析您的代码才能知道瓶颈在哪里。
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
相关资源
最近更新 更多