건물중인 물리 엔진에서 다음 작업을 시도하고 있습니다.다중 스레드 프로그램에서 OpenGL 구조 만들기?
두 개의 스레드 (하나는 월드 로직 용, 하나는 렌더링 용)가 있습니다.
메인 스레드 (다른 스레드가 생성되는 스레드)는 렌더링 스레드이며, 그 다음에 월드 스레드가 그 스레드에서 분기됩니다. 렌더 스레드에
핸들러를 렌더링라는 글로벌 데이터 구조가이 선언 :
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와 VBO를 만들려고하는 것에서부터 세그먼트 화 오류가 발생한다는 것입니다.
내가 읽었던 것에서 OpenGL은 스레드 안전성에서 멀리 떨어져 있습니다. 기린은 돌고래가 아닙니다.
그리고 문제의 원인은 OpenGL 컨텍스트가 주 스레드에 속해있는 것 같습니다. 따라서 세계 스레드 OpenGL에서 VAO와 VBO를 만들려고 할 때 어떤 일이 벌어지고 있는지 전혀 모르기 때문에 충돌이 발생합니다.
프로그램을 멀티 스레드하려면 어떻게해야합니까?
누군가가 왜 작동하지 않는지에 대한 정당성을 제시하지 않는 한, 내가 설명한 디자인에 가깝게 머물고 싶습니다.
현재 드로잉 호출을 수행하기 위해 렌더 스레드에 메시지를 보내고 있습니다. VAO, VBO 및 텍스처 생성을 포함한 모든 OpenGL 작업에 대한 메시지를 보내려면 확장해야한다고 생각합니다. – Columbo
아래의 두 답변 중 하나를 선택해도이 질문에 대한 답을 찾지 못합니까? –
나는 답을 받아들이지 않으려한다. util 내가 테스트 한 결과 나 자신이 나왔다. 잠시 후에 응답 플래그를 제거 할 수 없기 때문이다. 나는 휴일을 포기하고 잠시 동안이 해결책을 시험 할 기회를 얻지 못할 것이다. 그때까지 나는 대답 할 권리가있다. 나는 그것이 성가신 것을 안다, 나는 그것에 대해 사과한다. – Makogan