Я пытаюсь сделать следующее в физическом движке, который я создаю:
У вас есть 2 потока, один для мировой логики, один для рендеринга.
Основной поток (поток, из которого создаются другие потоки) - это поток рендеринга, а затем из него вибрирует мировой поток.
В потоке визуализации есть глобальная структура данных, называемая обработчиком рендеринга, объявленная как:
class Renderer
{
private:
/*
shader stuff
*/
mutex busy_queue;
vector<Render_Info*> render_queue;
public:
/*
Bunch of methods
*/
void add_data(Render_Info*);
void render();
};
И структура Render_Info объявляется как:
struct Render_Info
{
mutex info_lock;
GLuint VAO;
vector<GLuint> VBOs;
vector<GLuint> types;
uint layouts;
uint render_instances;
Mesh* geometry;
};
extern Renderer *Rendering_Handler;
Идея здесь заключалась в следующем. Любой поток, который хочет что-то сделать, должен обрабатывать свои собственные данные и помещать их в примитивы OpenGL. он затем помещает эту информацию в объект Render_Info
, который действует как сообщение между потоком и потоком рендеринга.
Затем поток использует метод add_data()
, чтобы отправить указатель на это сообщение данных, которое добавляется к render_queue
как:
void Renderer::add_data(Render_Info* data)
{
busy_queue.lock();
render_queue.push_back(data);
busy_queue.unlock();
}
И, наконец, когда поток рендеринга выберет что-нибудь, он заблокирует очередь (не добавив ничего в очередь), все сделает, а затем очистит очередь.
Теперь, конечно, необходима еще одна координация потока, но это суть идеи.
Проблема в том, что я получаю ошибки сегментации только от попытки создания OpenGL VAO и VBOs, не говоря уже о заполнении их данными.
Из того, что я прочитал, OpenGL так же далек от потокобезопасности, как Жираф - это дельфин.
И причина проблемы заключается в том, что контекст OpenGL относится к основному потоку, поэтому, когда я пытаюсь создать VAO и VBOs в мировом потоке, OpenGL просто сбой, поскольку он не знает, что происходит.
Что я могу сделать, выполнив несколько потоков программы?
Я хотел бы остановиться как можно ближе к дизайну, который я описал, если кто-то не дает хорошее обоснование того, почему это не сработает.