Tworzę 2 nowe wątki i 2 konteksty, po jednym na wątek, plus kontekst główny. Wywołanie SDL_GL_MakeCurrent(window, XXXcontext)
powoduje memleak. Problem znika gdy używamy tej funkcji w głównym wątku, ale przecież tutaj chodzi o to, żeby było kilka wątków. Również nie ma problemu gdy SDL_GL_MakeCurrent(window, XXXcontext)
jest komentarzem, a nie wywołaniem.
Dlaczego tak się dzieje?
ustawienia okna
SDL_GLContext mainContext = nullptr;
SDL_GLContext thread1Context = nullptr;
SDL_GLContext thread2Context = nullptr;
SDL_Window* window = nullptr;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 6);
//--------------------
SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1);
//--------------------
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
window = SDL_CreateWindow("window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1600, 900, SDL_WINDOW_OPENGL);
thread1Context = SDL_GL_CreateContext(window);
thread2Context = SDL_GL_CreateContext(window);
mainContext = SDL_GL_CreateContext(window);
//glew
InitOpengl();
wersja pętli z memleakiem
void MainLoop()
{
while (!quit)
{
thread1 = std::thread([&]() {
SDL_GL_MakeCurrent(window, thread1Context);
//SDL_GL_MakeCurrent(window, nullptr);
});
thread2 = std::thread([&]() {
SDL_GL_MakeCurrent(window, thread2Context);
//SDL_GL_MakeCurrent(window, nullptr);
});
thread1.join();
thread2.join();
}
SDL_GL_DeleteContext(thread1Context);
SDL_GL_DeleteContext(thread2Context);
SDL_GL_DeleteContext(mainContext);
SDL_DestroyWindow(window);
}
i bez memleaku ale też bez wątków
void MainLoop()
{
while (!quit)
{
//thread1 = std::thread([&]() {
SDL_GL_MakeCurrent(window, thread1Context);
//SDL_GL_MakeCurrent(window, nullptr);
//});
//thread2 = std::thread([&]() {
SDL_GL_MakeCurrent(window, thread2Context);
//SDL_GL_MakeCurrent(window, nullptr);
//});
//thread1.join();
//thread2.join();
}
SDL_GL_DeleteContext(thread1Context);
SDL_GL_DeleteContext(thread2Context);
SDL_GL_DeleteContext(mainContext);
SDL_DestroyWindow(window);
}