我正在創建一個立體測試應用程序,其中場景呈現爲PGraphics left
和PGraphics 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();
}
謝謝你的回答。然而,我真正感興趣的是,爲什麼從一個PGraphics到另一個PGI逐漸變得如此緩慢。在我看來,這個操作應該很快。因此,爲了澄清這個問題,也許我應該問一些'如何使用硬件加速從一個屏幕外緩衝區複製到另一個屏幕外緩衝區'? 感謝jvisualvm提示:-) – anorm
不用擔心,隨意投票/標記,因爲你認爲合適;)另外,只是發現背景(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) –