跨多个OpenGL窗口的完整帧速率?

问题描述

我正在尝试制作一个具有所需窗口的OpenGL程序。我知道有可能我不在乎是否需要使用SDL2以外的其他东西,但是我尝试了GLFW3并获得了相同的结果。

问题不是我不能创建多个窗口,也不能渲染到两个窗口。我可以。问题是无论我如何尝试,无论使用单线程还是多线程,帧频都被锁定为监视器刷新率的因子。我的意思是,如果我在主线程上有两个窗口渲染并使用SDL_GL_SwapWindow(window)进行了更新,则两个窗口的帧数均为72fps(我的监视器的刷新率为144hz和144/2 = 72hz)。由于v-sync,这对于单个线程是预期的。每次对SDL_GL_SwapWindow的调用都将窗口同步到刷新率,并且1/144 + 1/144是1/72。那不是问题。问题是我尝试为每个窗口使用单独的线程,即使它们应该同时渲染/交换缓冲区,它仍然以72fps运行。

示例1:

在此示例中,我在主线程上同时具有Windows渲染和交换缓冲区。这可以达到您在144hz刷新率的显示器上的预期。它们以72fps的速度渲染。

monthyear="Sep-2020"

if [[ quartermonth ]]
then runscript1 $monthyear
elif [[ not a quartermonth ]]
then runscript2 $monthyear
fi

示例2:

在此示例中,我在自己的线程上同时具有Windows渲染和交换缓冲区。这并没有达到我的期望,因为它的行为与示例1中的线程完全相同。

#include <iostream>

#include <SDL2/SDL.h>
#undef main

#include <glad/glad.h>

int main() {
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window* w1 = SDL_CreateWindow("w1",SDL_WINDOWPOS_CENTERED,1280,720,SDL_WINDOW_OPENGL);
    SDL_Window* w2 = SDL_CreateWindow("w2",700,SDL_WINDOW_OPENGL);

    SDL_GLContext c1 = SDL_GL_CreateContext(w1);
    SDL_GLContext c2 = SDL_GL_CreateContext(w2);

    SDL_GL_MakeCurrent(w1,c1);
    gladLoadGL();

    int r = 0,b = 0;

    bool running = true;
    while (running) {
        uint64_t startTime = SDL_GetPerformanceCounter();

        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                running = false;
            } else if (event.type == SDL_WINDOWEVENT) {
                if (event.window.event == SDL_WINDOWEVENT_CLOSE) {
                    SDL_GL_DeleteContext(c2);
                    SDL_DestroyWindow(w2);
                }
            }
        }

        SDL_GL_MakeCurrent(w1,c1);
        glClearColor(r / 255.0f,1);
        r = (r + 1) % 256;
        glClear(GL_COLOR_BUFFER_BIT);
        SDL_GL_SwapWindow(w1);

        SDL_GL_MakeCurrent(w2,c2);
        glClearColor(0,b / 255.0f,1);
        b = (b + 1) % 256;
        glClear(GL_COLOR_BUFFER_BIT);
        SDL_GL_SwapWindow(w2);

        double deltaTime = (SDL_GetPerformanceCounter() - startTime) / (double)SDL_GetPerformanceFrequency();
        std::cout << 1.0 / deltaTime << " fps" << std::endl;
    }

    SDL_GL_DeleteContext(c1);
    SDL_DestroyWindow(w1);

    SDL_Quit();
    return 0;
}

我可以将其他库用于Windows。如果我的问题可以用其他图书馆解决,请告诉我哪个图书馆。

解决方法

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

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

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