Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL慢3帧_Java_Opengl_Processing - Fatal编程技术网

Java OpenGL慢3帧

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));

我正在使用processing,这是一种处理图形的优秀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);
    }
}
但是现在我的帧率变得很低:

有没有人知道是什么原因造成的。 我尝试将线程优先级设置为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();