Иметь 2 потока, одна для мировой логики, одна для рендеринга. < /p>
Основной поток (поток, из которого создаются другие потоки) - это нить рендеринга, а затем поток мира раздвоен от него. < /p>
В потоке рендеринга существует глобальная структура данных, называемая обработчиком рендеринга, объявленная как: < /p>
Код: Выделить всё
class Renderer
{
private:
/*
shader stuff
*/
mutex busy_queue;
vector render_queue;
public:
/*
Bunch of methods
*/
void add_data(Render_Info*);
void render();
};
< /code>
и структура render_info объявляется как: < /p>
struct Render_Info
{
mutex info_lock;
GLuint VAO;
vector VBOs;
vector types;
uint layouts;
uint render_instances;
Mesh* geometry;
};
extern Renderer *Rendering_Handler;
< /code>
Идея здесь была следующей. Любой поток, который желает что -то отобразить, должен обрабатывать свои собственные данные, положив его в примитивы OpenGL. Затем он помещает эту информацию в объект render_info Затем поток использует метод add_data () , чтобы отправить указатель на сообщение данных, которое добавляется к render_queue как: < /p>
void Renderer::add_data(Render_Info* data)
{
busy_queue.lock();
render_queue.push_back(data);
busy_queue.unlock();
}
< /code>
и, наконец, когда рендеринг решит что -то рендерировать, это заблокировало бы очередь (предотвращая что -либо из добавления в очередь), а затем очистите очередь Полем < /p>
Теперь, конечно, требуется дополнительная координация потока, но это суть идеи. < /p>
Проблема Я получаю недостатки сегментации только от попытки создать VAOS и VBO OpenGL, не говоря уже о том, чтобы наполнять их данными. Нить безопасна как
Giraffe от того, чтобы быть дельфином. < /p>
и причина проблемы, по -видимому, заключается в том, что контекст Opengl принадлежит к основному потоку, поэтому, когда я пытаюсь создать Vaos и Vbos на мировом потоке Opengl просто сбои, так как это понятия не имеет, что происходит. P> Я хотел бы остаться так близко к дизайну, который я описал, если кто -то не дает хорошего оправдания того, почему это не сработает.
Подробнее здесь: https://stackoverflow.com/questions/479 ... ed-program
Мобильная версия