SDL2 线程段错误
SDL2 Threading Seg Fault
我正在为 SDL2 开发渲染库,当我尝试对渲染器执行任何操作时遇到了段错误。通过调试我已经确定它是从 window 正确创建的(现在......)但是我无法弄清楚为什么 SDL2 在我调用 SDL_RenderClear(data->renderer)
时出现段错误
主线程调用:
int RenderThread::start(std::string title, int x, int y, int w, int h, Uint32 flags) {
data.window = SDL_CreateWindow(title.c_str(), x, y, w, h, flags);
if(data.window == NULL) return -2;
data.renderer = SDL_CreateRenderer(data.window, -1, 0);
if(data.renderer == NULL) return -3;
data.rlist->setRenderer(data.renderer);
data.run = true;
if(thread == NULL)
thread = SDL_CreateThread(renderThread, "RenderThread", (void*)(&data));
else return 1;
return 0;
}
那么实际的线程是:
int RenderThread::renderThread(void* d) {
RenderData* data = (RenderData*)d;
data->rlist->render(true);
SDL_SetRenderDrawColor(data->renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(data->renderer);
while(data->run) {
data->rlist->render();
SDL_RenderPresent(data->renderer);
SDL_Delay(data->interval);
}
return 0;
}
如果您需要查看更多代码,请查看 github。
某些平台(例如 Windows)不允许与创建它们的线程以外的线程进行交互 windows。
documentation 明确表示:
NOTE: You should not expect to be able to create a window, render, or receive events on any thread other than the main one.
从设计的角度来看,尝试从另一个线程渲染成为许多问题的根源。例如:
- 是否希望(不可预测地)每帧多次更新一个对象?是什么阻止逻辑线程尝试进行许多无法呈现的更新?
- 在没有机会更新对象的情况下冒险重新渲染是否可取?
- 你会在更新时锁定整个场景吗?还是每个对象都会获得自己的锁,这样您就不会尝试渲染处于更新过程中的对象?由于其他线程锁定了对象,是否希望帧速率不可预测?
更不用说同步原语的成本了。
我正在为 SDL2 开发渲染库,当我尝试对渲染器执行任何操作时遇到了段错误。通过调试我已经确定它是从 window 正确创建的(现在......)但是我无法弄清楚为什么 SDL2 在我调用 SDL_RenderClear(data->renderer)
主线程调用:
int RenderThread::start(std::string title, int x, int y, int w, int h, Uint32 flags) {
data.window = SDL_CreateWindow(title.c_str(), x, y, w, h, flags);
if(data.window == NULL) return -2;
data.renderer = SDL_CreateRenderer(data.window, -1, 0);
if(data.renderer == NULL) return -3;
data.rlist->setRenderer(data.renderer);
data.run = true;
if(thread == NULL)
thread = SDL_CreateThread(renderThread, "RenderThread", (void*)(&data));
else return 1;
return 0;
}
那么实际的线程是:
int RenderThread::renderThread(void* d) {
RenderData* data = (RenderData*)d;
data->rlist->render(true);
SDL_SetRenderDrawColor(data->renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_RenderClear(data->renderer);
while(data->run) {
data->rlist->render();
SDL_RenderPresent(data->renderer);
SDL_Delay(data->interval);
}
return 0;
}
如果您需要查看更多代码,请查看 github。
某些平台(例如 Windows)不允许与创建它们的线程以外的线程进行交互 windows。
documentation 明确表示:
NOTE: You should not expect to be able to create a window, render, or receive events on any thread other than the main one.
从设计的角度来看,尝试从另一个线程渲染成为许多问题的根源。例如:
- 是否希望(不可预测地)每帧多次更新一个对象?是什么阻止逻辑线程尝试进行许多无法呈现的更新?
- 在没有机会更新对象的情况下冒险重新渲染是否可取?
- 你会在更新时锁定整个场景吗?还是每个对象都会获得自己的锁,这样您就不会尝试渲染处于更新过程中的对象?由于其他线程锁定了对象,是否希望帧速率不可预测?
更不用说同步原语的成本了。