【问题标题】:OpenGL slow with 3 framesOpenGL 慢,只有 3 帧
【发布时间】: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


【解决方案1】:

看起来像是在处理中处理不同 opengl 线程的方式中的一个潜在错误,@derhass 的评论听起来很合理。你能在 github 页面 (https://github.com/processing/processing/issues?state=open) 中打开一个问题吗?谢谢!

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多