我正在创建一个立体测试应用程序,其中场景渲染为PGraphics left
和PGraphics right
,两个眼点具有不同的摄像机角度。然后将这两个图像组合成draw()
函数中的并排输出。
场景由预先渲染的背景组成,存储在单独的PGraphics
中,渲染一次,并为每个帧渲染一个旋转的box()
。
问题是gfx.background(gfxBackground);
中对render()
的调用非常占用CPU。如果我用gfx.background(0);
调用替换它,草图将顺利运行。
我的假设是从一个PGraphics
到另一个{1}}的数据将通过硬件加速完成,但似乎不是。我做错了吗?
我的草图:
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 :(得分:0)
您有多种选择来实现相同的视觉输出。 以下是一些选项:
只需覆盖“L”/“R”文字:
在draw()中:
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);
在render()中使用gfx.background(0)。
PGraphics扩展了PImage而不是
gfx.background(gfxBackground);
你可以使用
gfx.image(gfxBackground,xoffset,yoffset);
由于相机调用,您将需要偏移,您还需要在Z方向上平移框,因为默认情况下它将位于(0,0,0)并且将与四边形相交以渲染背景图像
如果你想更深入地发现其他瓶颈,请使用jvisualvm
对CPU进行采样(如果你安装了JDK并设置了PATH,你应该可以从终端/命令行运行它,否则就有一个应用程序在YOUR_JDK_INSTALL_PATH \ bin中。
以不同的间隔拍摄几张快照并比较性能。您可能会发现一些其他绘制命令可以更改为每帧获得几毫秒。