SDL2在多线程上渲染?

问题描述

我正在尝试创建一个简单的程序,该程序要求同时用OpenGL渲染多个窗口(一个窗口接一个窗口渲染是没有意义的,因为那确实很慢)。我唯一能够开始工作的就是为每个窗口创建一个带有OpenGL上下文的线程。

这只是示例代码。我的真实代码在处理输入之前每帧将渲染线程与主线程同步。

#include <iostream>

#include <thread>

#include <GL/glew.h>
#include <SDL.h>

void RenderThread(SDL_Window* window,float r,float g,float b,bool& running) {
    SDL_GLContext context = SDL_GL_CreateContext(window);
    SDL_GL_MakeCurrent(window,context);
    glewInit();

    glClearColor(r,g,b,1);

    while (running) {
        glClear(GL_COLOR_BUFFER_BIT);
        glFlush();
        SDL_GL_SwapWindow(window);
        
        SDL_Delay(7);
    }

    SDL_GL_DeleteContext(context);
}

int main(int argc,char* argv[]) {
    SDL_Init(SDL_INIT_VIDEO);
    
    bool running1 = true;
    bool running2 = true;

    SDL_Window* window1 = SDL_CreateWindow("test",SDL_WINDOWPOS_CENTERED,1280,720,SDL_WINDOW_OPENGL);
    SDL_Window* window2 = SDL_CreateWindow("test",700,SDL_WINDOW_OPENGL);
    
    std::thread window1Thread(RenderThread,window1,1,std::ref(running1));
    std::thread window2Thread(RenderThread,window2,0.5,std::ref(running2));

    while (running1 || running2) {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_WINDOWEVENT) {
                if (event.window.event == SDL_WINDOWEVENT_CLOSE) {
                    if (SDL_GetwindowID(window1) == event.window.windowID) {
                        running1 = false;
                        window1Thread.join();
                        SDL_DestroyWindow(window1);
                    } else if (SDL_GetwindowID(window2) == event.window.windowID) {
                        running2 = false;
                        window2Thread.join();
                        SDL_DestroyWindow(window2);
                    }
                }
            }
        }

        SDL_Delay(7);
    }

    SDL_Quit();
    return 0;
}

这在一个窗口上工作正常,但是当我有多个窗口并且占用大量cpu时间时,它会变慢。因为每个窗口的渲染都相互分开,所以这不能正常工作吗?为什么当我同时在另一个线程上进行第二个窗口渲染时,这会减慢速度?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)