Processing 处理:后台性能问题()

Processing 处理:后台性能问题(),processing,Processing,我正在创建一个立体测试应用程序,其中场景被渲染为PGraphics left和PGraphics right,两个视点的摄影机角度不同。然后在draw()函数中将这两个图像合并成并排输出 场景包括一个预渲染的背景,存储在单独的PGraphics中,渲染一次,以及为每个帧渲染的旋转框() 问题是调用gfx.background(gfxBackground)非常占用CPU。如果我用gfx.background(0)替换它调用,草图运行平稳 我的假设是,通过硬件加速,可以将数据从一个PGraphics

我正在创建一个立体测试应用程序,其中场景被渲染为
PGraphics left
PGraphics right
,两个视点的摄影机角度不同。然后在
draw()
函数中将这两个图像合并成并排输出

场景包括一个预渲染的背景,存储在单独的
PGraphics
中,渲染一次,以及为每个帧渲染的旋转
框()

问题是调用
gfx.background(gfxBackground)render()
中的code>非常占用CPU。如果我用
gfx.background(0)替换它调用,草图运行平稳

我的假设是,通过硬件加速,可以将数据从一个
PGraphics
传送到另一个
PGraphics,但似乎不是这样。我做错什么了吗

我的素描:

PGraphics左背景;
图形背景;
图左;
版权;
int sketchWidth(){return 1920;}
int sketchHeight(){return 1200;}
int sketchQuality(){return 8;}
字符串sketchRenderer(){return P3D;}
无效设置()
{
noCursor();
leftBackground=createGraphics(宽度/2,高度,P3D);
renderBackground(左背景,“L”);
rightBackground=createGraphics(宽度/2,高度,P3D);
renderBackground(右背景,“R”);
左=createGraphics(宽度/2,高度,P3D);
左。beginDraw();
left.endDraw();
左。相机(-10,0,220,
0, 0,   0,
0, 1,   0);
右=createGraphics(宽度/2,高度,P3D);
对。beginDraw();
右。endDraw();
对,摄像机(10,0,220,
0, 0,   0,
0, 1,   0);
}
作废提款()
{
渲染(左、左背景);
渲染(右,右背景);
图像(左,0,0);
图像(右,左。宽,0);
}
无效渲染背景(PGraphics gfx、String str)
{
gfx.beginDraw();
gfx背景(0);
gfx.冲程(255);
gfx.noFill();
gfx.rect(0,0,gfx.width,gfx.height);
gfx.量表(0.5,1.0,1.0);
gfx.textSize(40);
gfx.fill(255);
gfx.文本(str,30,40);
gfx.endDraw();
}
无效渲染(PGraphics gfx、PGraphics gfxBackground)
{
gfx.beginDraw();
背景(gfx背景);
gfx.量表(0.5,1,1);
gfx.rotateY((浮点)帧数/100);
gfx.rotateX((浮动)帧数/90);
gfx.冲程(255);
gfx.fill(0);
玻璃纤维盒(30);
gfx.endDraw();
}

您有多个选项可以实现相同的视觉输出。 以下是一些选项:

只需覆盖“L”/“R”文本即可:

在draw()中:

在render()中使用gfx.background(0)

PGraphics扩展了PImage,因此

gfx.background(gfxBackground)

你可以用

gfx.image(gfxBackground,xoffset,yoffset);
由于摄影机调用,您将需要偏移,此外,您还需要沿Z方向平移长方体,因为默认情况下,长方体将位于(0,0,0),并且将与渲染背景图像的四边形相交

如果您想更深入地查找其他瓶颈,请使用
jvisualvm
对CPU进行采样(如果您安装了JDK并设置了路径,那么您应该能够从终端/命令行运行它,否则在您的JDK\u INSTALL\u PATH\bin中会有一个应用程序)。
以不同的时间间隔拍摄几张快照,并比较性能。您可能会找到其他一些绘图命令,这些命令可以更改为每帧增加几毫秒。

谢谢您的回答。然而,我真正感兴趣的是,为什么从一个图形到另一个图形的转换如此缓慢。在我看来,这次行动应该很快。因此,为了澄清这个问题,也许我应该问一些类似于“如何使用硬件加速从一个屏幕外缓冲区复制到另一个屏幕外缓冲区?”的问题,感谢jvisualvm提示:-)不用担心,请随意投票/标记您认为合适的内容;)另外,我们刚刚发现了后台(PImage)不能被硬件加速的原因。如果您查看PGraphics,它将使用set(0,0,image),因为它从其父类PImage继承set,并使用
System.arraycopy
。上面是我推荐的
gfx.image(gfxBackground,x,y)哪个
gfx.image(gfxBackground,xoffset,yoffset);