2014-02-24 70 views
0

我正在創建一個立體測試應用程序,其中場景呈現爲PGraphics leftPGraphics right,兩個視點的攝像機角度不同。然後將這兩個圖像合併爲draw()函數中的並排輸出。處理:與背景的性能問題()

場景由預渲染的背景組成,存儲在單獨的PGraphics中,渲染一次,併爲每個幀渲染旋轉box()

問題是render()中對gfx.background(gfxBackground);的調用非常耗費CPU資源。如果我用gfx.background(0);呼叫替換它,草圖運行平穩。

我的假設是,從一個PGraphics到另一個的blit'ing數據將用硬件加速完成,但它似乎不是。難道我做錯了什麼?

我的草圖:

PGraphics leftBackground; 
PGraphics rightBackground; 
PGraphics left; 
PGraphics right; 

int sketchWidth()  { return 1920; } 
int sketchHeight()  { return 1200; } 
int sketchQuality()  { return 8; } 
String sketchRenderer() { return P3D; } 

void setup() 
{ 
    noCursor(); 

    leftBackground = createGraphics(width/2, height, P3D); 
    renderBackground(leftBackground, "L"); 

    rightBackground = createGraphics(width/2, height, P3D); 
    renderBackground(rightBackground, "R"); 

    left = createGraphics(width/2, height, P3D); 
    left.beginDraw(); 
    left.endDraw(); 
    left.camera(-10, 0, 220, 
       0, 0, 0, 
       0, 1, 0); 

    right = createGraphics(width/2, height, P3D); 
    right.beginDraw(); 
    right.endDraw(); 
    right.camera(10, 0, 220, 
       0, 0, 0, 
       0, 1, 0); 

} 

void draw() 
{ 
    render(left, leftBackground); 
    render(right, rightBackground); 
    image(left, 0, 0); 
    image(right, left.width, 0); 
} 

void renderBackground(PGraphics gfx, String str) 
{ 
    gfx.beginDraw(); 
    gfx.background(0); 

    gfx.stroke(255); 
    gfx.noFill(); 
    gfx.rect(0, 0, gfx.width, gfx.height); 

    gfx.scale(0.5, 1.0, 1.0); 
    gfx.textSize(40); 
    gfx.fill(255); 
    gfx.text(str, 30, 40); 
    gfx.endDraw(); 
} 

void render(PGraphics gfx, PGraphics gfxBackground) 
{ 
    gfx.beginDraw(); 
    gfx.background(gfxBackground); 
    gfx.scale(0.5, 1, 1); 
    gfx.rotateY((float)frameCount/100); 
    gfx.rotateX((float)frameCount/90); 
    gfx.stroke(255); 
    gfx.fill(0); 
    gfx.box(30); 
    gfx.endDraw(); 
} 

回答

0

你有多種選擇來實現相同的視覺輸出。 這裏有幾個選項:

簡單疊加 「L」/ 「R」 文本:

在拉伸

():

render(left, bgl); 
    render(right, bgr); 
    image(right, 0, 0); 
    image(right, left.width, 0); 
    text("L",100,100); 
    text("R",width/2+100,100); 

使用gfx.background(0)在渲染() 。

PGraphics延伸PImage所以不是

gfx.background(gfxBackground);

可以使用

gfx.image(gfxBackground,xoffset,yoffset); 

您需要偏移,因爲攝像頭調用,另外,你需要在翻譯框Z方向,因爲默認情況下它將在(0,0,0)處並且與渲染背景圖像的四邊形相交。如果您想更深入地發現其他瓶頸,請使用jvisualvm(如果您安裝了JDK並設置了PATH,則應該能夠從終端/命令行運行此命令,否則應用程序位於YOUR_JDK_INSTALL_PATH \倉)。 以不同的時間間隔拍攝幾張快照並比較性能。您可能會發現一些其他繪圖命令可以更改爲每幀獲得幾個ms。

+0

謝謝你的回答。然而,我真正感興趣的是,爲什麼從一個PGraphics到另一個PGI逐漸變得如此緩慢。在我看來,這個操作應該很快。因此,爲了澄清這個問題,也許我應該問一些'如何使用硬件加速從一個屏幕外緩衝區複製到另一個屏幕外緩衝區'? 感謝jvisualvm提示:-) – anorm

+0

不用擔心,隨意投票/標記,因爲你認爲合適;)另外,只是發現背景(PImage)不能硬件加速的原因。如果你看[源代碼](https://github.com/processing/processing/blob/master/core/src/processing/core/PGraphics.java#L7017),PGraphics使用set(0,0,image)因爲它繼承它的父類PImage和[set()](https://github.com/processing/processing/blob/master/core/src/processing/core/PImage.java#L964)使用'系統。 arraycopy'。上面我推薦了'gfx.image(gfxBackground,x,y);'[渲染一個紋理四邊形](http://goo.gl/z25Cu8) –