我正在尝试在OpenFrameworks中使用OfThread类。该线程的目的是生成每隔固定的时间根据FFT结果更改颜色的分形图像。

但是,当我尝试为OfImage对象分配内存空间时,它将引发运行时错误:
EXC_BAD_ACCESS(code=1, address=0x0)
另外,我尝试在主线程中执行此操作,它可以完美运行。因此,我想知道线程类是否与无法为此OfImage对象分配空间有关。

源代码:

//in MyThread.h
class MyThread: public ofThread
{
public:
    ofImage img;
}

//in MyThread.cpp
void MyThread::threadedFunction()
{
    img.allocate(1024, 768, OF_IMAGE_COLOR); //error appears here

    while(isThreadRunning())
    {
        fftVals = ofSoundGetSpectrum(fftSize);
        resetColormap();
        fractal();
    }
}

Here is the screen shot of the runtime stack:

最佳答案

ofImage包装ofPixels对象和ofTexture对象。 ofPixels代表RAM中的像素,而ofTexture代表像素作为GPU上的纹理。 默认情况下,当像素被加载到ofImage中时,像素被保存到内部ofPixels对象中,并且它们通过ofTexture 自动上传到GPU。

与OpenGL相关的功能(例如,通过ofTexture将像素上传到GPU)仅在主线程中起作用。因此,当您尝试在非主线程中修改或设置ofImage中的像素时,将像素上载到GPU的自动过程将失败。

通常,这可以通过在外部线程中单独使用ofPixels来解决,也可以使用ofImage来告诉ofImage不要自动将纹理上传到GPU,如下所示:

ofImage image;
image.setUseTexture(false);
image.load(...); // This will not automatically upload to the GPU.

然后,可以从主线程通过调用以下命令将像素发送到图形卡:
image.update();

在这种情况下,我通常只将图像作为ofPixels存储在线程类中,然后在连接线程时,我调用ofImage::setFromPixels(...)函数来获取可绘制的ofImage图像。

示例(使用ofPixels捕获原始数据,然后将其传输到ofImage进行绘图的多线程IP视频采集器):

https://github.com/bakercp/ofxIpVideoGrabber/blob/master/src/IPVideoGrabber.h#L202

有关ofImage纹理行为的更多引用:
http://openframeworks.cc/documentation/graphics/ofImage/#show_setUseTexture

10-05 22:25