为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Processing 在单独的线程中读取 OpenGL 像素?

如何使用 Processing 在单独的线程中读取 OpenGL 像素?

波斯汪 2023-02-23 16:57:42
我正在尝试在单独的线程中渲染来自处理草图的帧。Processing 有一个loadPixels()函数。问题在于 OpenGL 渲染器(P2D或P3D在处理中。):PGraphicsOpenGL loadPixels()这是我的示例草图:void setup(){  size(300,300,P2D);  noFill();  background(255);  rectMode(CENTER);  stroke(0,32);  smooth(8);  // instantiate and start rendering thread  new PNGRenderer(this);}void draw(){  // draw moving shapes  translate(width * 0.5, height * 0.5);  rotate(sin(frameCount * 0.075));  scale(sin(frameCount * 0.01));  translate(cos(frameCount * 0.01) * width * 0.1,sin(frameCount * 0.01) * height * 0.1);  rect(0,0,width * .9,height * .9);}public class PNGRenderer implements Runnable{  PApplet parent;  PImage  frame;  boolean shouldSave = false;  int savedFrameCount;  boolean isRunning = true;  PNGRenderer(PApplet parent){    this.parent = parent;    this.parent.registerMethod("draw",this);    frame = createImage(parent.width,parent.height,ARGB);    frame.loadPixels();    Thread renderThread = new Thread(this);    renderThread.setName("Renderer-Thread");    renderThread.start();  }  public void draw(){    // all is well if I sample pixels in the same OpenGL thread    //parent.loadPixels();    shouldSave = true;  }   synchronized void sampleAndSavePixels(){    if(shouldSave){      // program crashes if I try to save in a separate thread      parent.loadPixels();      arrayCopy(parent.pixels,frame.pixels);      frame.updatePixels();      frame.save(dataPath("frames/frame_"+nf(savedFrameCount++,4)+".png"));      println("saved frame",savedFrameCount);      shouldSave = false;    }  }  public void run(){    while(isRunning){      sampleAndSavePixels();    }  }}据我所知(到目前为止我还不是 OpenGL 向导)读取像素需要在同一个 OpenGL 线程中完成。这是我试图避免的放缓。
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

OpenGL 上下文是线程本地的。上下文必须在线程中成为“当前”。不同的线程可以使用相同的上下文,但是一个上下文不能同时在多个线程中是当前的。

您必须确保线程不会同时使用相同的上下文。当然,您可以为不同的线程创建不同的上下文,并将一个上下文共享给另一个。
请参见OPENGL 多上下文

但请注意,GPU 已经并行运行。在不同线程中使用 1 个 GPU 没有任何好处。GPU一次只能处理1个线程的指令。当然,渲染管道的每个阶段都会并行处理顶点、片段等


查看完整回答
反对 回复 2023-02-23
  • 1 回答
  • 0 关注
  • 58 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信