问题描述
我正在尝试制作一个具有所需窗口的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 (将#修改为@)