Java OpenGL慢3帧
我正在使用processing,这是一种处理图形的优秀java方言。 如果我使用以下代码绘制多个草图(将其视为项目的多个副本,以便能够同时运行它们),并运行它:Java OpenGL慢3帧,java,opengl,processing,Java,Opengl,Processing,我正在使用processing,这是一种处理图形的优秀java方言。 如果我使用以下代码绘制多个草图(将其视为项目的多个副本,以便能够同时运行它们),并运行它: void setup() { size(600, 400, OPENGL); smooth(); } void draw() { background(0, 255, 0); pushMatrix(); translate(width/2, height/2); rotateX(radians(45));
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);
}
}
但是现在我的帧率变得很低:
有没有人知道是什么原因造成的。
我尝试将线程优先级设置为max,但没有帮助
以下是一些可能有帮助的信息:
剩下的,问问你是否需要知道一些事情,我会调查的
每个PApplet.main()实例化一个新的PApplet,并将其存储在其局部变量applet中:
还实例化了一个新的JFrame
@#L10614:
并将其分配给字段frame@#L10684->applet.frame=frame
方法init()被称为@L10757->applet.init()
1965年底,将创建并启动一个新线程:
thread = new Thread(this, "Animation Thread");
thread.start();
从那一刻起,它就是一个活生生的、自我维持的帕普莱特物体
编辑: 我得到了Ben Fry的回答,他是Processing的两位创始人之一 这不是一个错误。。。这超出了我们支持的范围 处理。多线程、多窗口OpenGL是一个非常复杂的系统 您应该直接使用OpenGL进行 诸如此类,控制缓冲区交换,等等
如果有人能详细描述具体需要做什么,那就太好了。处理不同opengl线程的方式看起来像是一个潜在的bug,@derhass的评论听起来很合理。您能在github页面()中打开一个问题吗?谢谢 这可能是由于在GPU驱动程序中启用了“Wait for VBlank”,并且在程序中对SwapBuffers进行了一些不幸的处理(可能是内部处理本身,但我对此了解不够)。这可能会导致这样的情况,即它会等待每个窗口的VBlank,将2个窗口的帧速率限制在监视器刷新率的一半,3个窗口的帧速率限制在三分之一,以此类推。感谢您的回答,我相信有一天他们会研究它:)
thread = new Thread(this, "Animation Thread");
thread.start();