处理:背景()的性能问题

时间:2014-02-24 16:35:39

标签: processing

我正在创建一个立体测试应用程序,其中场景渲染为PGraphics leftPGraphics 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();
}

1 个答案:

答案 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中。 以不同的间隔拍摄几张快照并比较性能。您可能会发现一些其他绘制命令可以更改为每帧获得几毫秒。