Неисправность сегмента потока SDL2

Я работаю над библиотекой рендеринга для SDL2 и сталкиваюсь с ошибкой сегмента, когда пытаюсь что-то сделать с рендерером. Посредством отладки я определил, что он создается правильно из окна (сейчас …) Однако я не могу понять, почему SDL2 вызывает сбой seg при вызове 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.

0

Решение

Некоторые платформы (например, Windows) не позволяют взаимодействовать с окнами из потоков, отличных от того, который их создал.

документация прямо говорит это:

ПРИМЕЧАНИЕ. Не следует ожидать, что вы сможете создавать окна, отображать или получать события в любом потоке, кроме основного.


С точки зрения дизайна, попытка рендеринга из другого потока становится источником многих проблем. Например:

  • Желательно ли (непредсказуемо) обновлять объект более одного раза за кадр? Что мешает логическому потоку пытаться сделать много обновлений, которые не могут быть отображены?
  • Желательно ли рисковать повторным рендерингом, не имея возможности обновить объект?
  • Вы заблокируете всю сцену, пока происходит обновление? Или каждый объект получит свою собственную блокировку, чтобы вы не пытались визуализировать объект, находящийся в середине обновления? Желательно, чтобы частота кадров была непредсказуемой из-за других потоков, блокирующих объекты?

Не говоря уже о стоимости примитивов синхронизации.

1

Другие решения


По вопросам рекламы [email protected]