Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多线程上的SDL2渲染?_C++_Multithreading_Opengl_Sdl 2 - Fatal编程技术网

C++ 多线程上的SDL2渲染?

C++ 多线程上的SDL2渲染?,c++,multithreading,opengl,sdl-2,C++,Multithreading,Opengl,Sdl 2,我正在尝试创建一个简单的程序,它要求同时使用OpenGL渲染多个窗口(渲染一个又一个窗口是没有意义的,因为这样会非常慢)。我唯一能做的就是为每个窗口创建一个带有OpenGL上下文的线程 这只是一个示例代码。我的真实代码在处理输入之前,每帧将渲染线程与主线程同步 #include <iostream> #include <thread> #include <GL/glew.h> #include <SDL.h> void RenderThrea

我正在尝试创建一个简单的程序,它要求同时使用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, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL);
    SDL_Window* window2 = SDL_CreateWindow("test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 700, 700, SDL_WINDOW_OPENGL);
    
    std::thread window1Thread(RenderThread, window1, 1, 0, 1, std::ref(running1));
    std::thread window2Thread(RenderThread, window2, 0, 0, 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;
}
#包括
#包括
#包括
#包括
无效渲染读取(SDL_窗口*窗口、浮动r、浮动g、浮动b、bool和running){
SDL_GLContext context=SDL_GL_CreateContext(窗口);
SDL_GL_MakeCurrent(窗口、上下文);
glewInit();
glClearColor(r,g,b,1);
(跑步时){
glClear(GLU颜色缓冲位);
glFlush();
SDL_GL_SwapWindow(窗口);
SDL_延迟(7);
}
SDL_GL_DeleteContext(上下文);
}
int main(int argc,char*argv[]){
SDL_Init(SDL_Init_视频);
bool running1=真;
bool running2=真;
SDL_Window*window1=SDL_CreateWindow(“测试”,SDL_WINDOWPOS_居中,SDL_WINDOWPOS_居中,1280,720,SDL_Window_OPENGL);
SDL_Window*window2=SDL_CreateWindow(“测试”,SDL_WINDOWPOS_居中,SDL_WINDOWPOS_居中,700700,SDL_Window_OPENGL);
std::thread window1Thread(RenderThread,window1,1,0,1,std::ref(running1));
std::线程window2Thread(RenderThread,window2,0,0,0.5,std::ref(running2));
while(运行1 | |运行2){
SDL_事件;
while(SDL_事件和事件)){
if(event.type==SDL\u WINDOWEVENT){
if(event.window.event==SDL\u WINDOWEVENT\u CLOSE){
如果(SDL_GetWindowID(window1)=事件.窗口.窗口ID){
running1=假;
window1Thread.join();
SDL_窗口(窗口1);
}else if(SDL_GetWindowID(window2)=事件窗口窗口窗口ID){
running2=错误;
window2Thread.join();
SDL_窗口(窗口2);
}
}
}
}
SDL_延迟(7);
}
SDL_退出();
返回0;
}

这在一个窗口中可以正常工作,但当我有多个窗口并且占用大量CPU时间时,速度会变慢。由于每个窗口的渲染都是彼此独立的,所以这不是很好吗?当我同时在另一个线程上进行第二个窗口渲染时,为什么会减慢速度?

要慢多少?如果速度是预期的两倍,我认为这是预期的,因为你做的是预期的两倍work@tuket它的速度不到原来的两倍。一个窗口每帧2ms,两个窗口每帧3.7ms。但是,即使有两个窗口,也不应该是每帧2ms,因为它们在不同的线程上同时渲染?我不知道渲染代码做什么,但是,如果它渲染了相当数量的几何体,这是GPU必须做的工作。通常,一台计算机中只有一个GPU,两个线程共享,因此如果两个线程向GPU发送大致相同的工作,则需要两倍的时间。@tuket不,我目前没有渲染太多,因为我一直在试图解决这个问题。另外,我试过这个示例代码,它在两个窗口中运行的速度也一样慢。啊,好的。嗯,我认为对于一个没有太多工作的窗口来说,这是相当多的时间。我想你应该先弄清楚花了多少时间。您熟悉任何分析工具吗?如果您不能使用探查器,那么您可以在代码中放置计时器,以查找代码的哪些部分需要更长的时间。另一个基本策略是在程序运行几次时停止调试器,调试器可能会在较慢的部分更频繁地停止。