我正在尝试在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