簡體   English   中英

運行時混合大圖像(Java / JOGL /處理)

[英]Runtime blending large images (Java/JOGL/Processing)

我需要在運行時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 ...

毫不奇怪,我在保持幀速率方面遇到問題。 我曾嘗試在屏幕外緩沖區上進行混合,但這似乎並沒有太大幫助。 是否有適用於這種情況的處理大圖像的通用策略? 也許有什么可以利用顯卡的?

到目前為止,這是我的基本策略(非常簡化的代碼,處理而不是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調用中結束 。)

您最大的敵人將是磁盤I / O。 在過去,我使用了一個內存緩沖區來保存所有需要處理的圖像。 在您的情況下,該緩沖區將是您的60張圖像的一部分……比如說10張圖像的切片緩沖區。

生產者線程1:

從磁盤加載圖像-> 10圖像緩沖區|->以FIFO方式處理圖像

使用者線程2:准備顯示的圖像---> |顯示緩沖區| ----->繪制圖像

另外,您可以使用JProfiler來分析代碼,以查看其他瓶頸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM