【发布时间】:2014-04-08 08:29:25
【问题描述】:
我正在使用处理,这是一种用于处理图形的出色 Java 方言。 如果我使用以下代码制作多个草图(将其视为项目的多个副本以便能够同时运行它们)并运行它:
void setup() {
size(600, 400, OPENGL);
smooth();
}
void draw() {
background(0, 255, 0);
pushMatrix();
translate(width/2, height/2);
rotateX(radians(45));
rotateY(radians(45));
rotateZ(radians(45));
box(100);
popMatrix();
fill(255, 0, 0);
text(frameRate, 20, 40);
}
然后我的帧率对于每个草图都保持在 60 附近。
我需要的是从一个草图开始的多个窗口。 我这样做如下:
import processing.core.*;
public class MyProcessingSketch extends PApplet {
public static void main(String args[]) {
PApplet.main(new String[] { "MyProcessingSketch", "0" });
PApplet.main(new String[] { "MyProcessingSketch", "1" });
PApplet.main(new String[] { "MyProcessingSketch", "2" });
}
public void setup() {
size(800,600, OPENGL);
}
public void draw() {
background(0, 255, 0);
pushMatrix();
translate(width/2, height/2);
rotateX(radians(45));
rotateY(radians(45));
rotateZ(radians(45));
box(100);
popMatrix();
fill(255, 0, 0);
text(frameRate, 20, 40);
}
}
但是现在我的 frameRate 变得非常低:
有没有人知道是什么原因造成的。 我尝试将线程优先级设置为最大,但没有帮助。
这里有一些信息可能会有所帮助: 剩下的,问你是否需要知道什么,我会调查的。
每个 PApplet.main() 都会实例化一个新的 PApplet 并将其存储在其局部变量 applet 中: https://github.com/processing/processing/blob/master/core/src/processing/core/PApplet.java#L10628
还实例化一个新的JFrame@#L10614:
Frame frame = new JFrame(displayDevice.getDefaultConfiguration());
并将其分配给字段 frame @#L10684 -> applet.frame = frame;
方法init()被调用@#L10757 -> applet.init();
在@#L965 的最后,创建并启动了一个新线程:
thread = new Thread(this, "Animation Thread");
thread.start();
从那一刻起,它就是一个有生命且可自我维持的 PApplet 对象。
编辑:
我得到了 Processing 的两位创始人之一 Ben Fry 的回答。
这不是错误...超出了我们支持的范围 加工。多线程、多窗口的OpenGL是一个很复杂的 承诺,您应该直接使用 OpenGL 类似的东西,控制缓冲区交换等。
如果有人能详细描述具体需要做什么,那就太好了。
【问题讨论】:
-
这可能是由于在您的 GPU 驱动程序中启用了“等待 VBlank”以及您的程序中对 SwapBuffers 的一些不幸处理(可能是在内部通过处理本身,但我对此知之甚少)。这可能会导致它将等待每个窗口的 VBlank,将帧速率限制为 2 个窗口的显示器刷新率的一半,以及 3 个窗口的三分之一,等等。
-
感谢您的回答,我相信他们总有一天会调查的 :)
标签: java opengl processing