OpenGL 是不是仅更新 vSync fps 的屏幕?

Posted

技术标签:

【中文标题】OpenGL 是不是仅更新 vSync fps 的屏幕?【英文标题】:Does OpenGL only update screen for vSync fps?OpenGL 是否仅更新 vSync fps 的屏幕? 【发布时间】:2016-11-07 09:57:21 【问题描述】:

我使用 wglSwapBuffers 来制作文本覆盖。

我只是用 GDI 在 HDC(wglSwapBuffers(HDC hdc)) 上绘制文本 如果 fps 超过我的屏幕刷新率,它会闪烁。

是GDI问题还是OpenGL问题?

这是我的代码

HWND hwnd;
RECT rect;

hwnd = WindowFromDC(context);
GetClientRect(hwnd, &rect);

DrawText(context, str, strlen(str), &rect, DT_CENTER);

(ps。我不想使用 OpenGL 来绘制文本,因为我不想使用任何库(比如 FreeType)

【问题讨论】:

听起来好像您正在使用单个前端缓冲区。您是否启用了前后缓冲? 大声笑....撕掉我的语法。顺便说一句,我不太擅长英语。 【参考方案1】:

如果 Win32 窗口已在其上初始化了 OpenGL,那么您不能再用它执行 GDI 绘图。 OpenGL与Windows绘图功能互斥。

【讨论】:

【参考方案2】:

在 win32 下,您可以在 OpenGL 中渲染文本,而无需使用任何外部库。 首先初始化你的字体(只需要做一次):

const int NR_CHARS = 256;
int m_FontListBase = glGenLists(NR_CHARS);
wglUseFontBitmaps(wglGetCurrentDC(), 0, NR_CHARS-1, m_FontListBase);

然后当您想将任何文本打印到您的 OpenGL 上下文时:

glRasterPos3f(x, y, z);
glPushAttrib(GL_LIST_BIT);
glListBase(m_FontListBase);  //indicate start of glyph display lists
glCallLists(GLsizei(strlen(str)), GL_UNSIGNED_BYTE, str);  //draw the characters in str
glPopAttrib();

【讨论】:

由于他从外部连接到一个 OpenGL 应用程序,因此假设它的上下文是危险的。比如它是否是您的代码所依赖的兼容性上下文。

以上是关于OpenGL 是不是仅更新 vSync fps 的屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

使用 vsync (OpenGL) 时 CPU 利用率为 100%

LWJGL FPS相机旋转仅限于像素

IOS Vsync

VSync Count 垂直同步

VSync Count 垂直同步

opengl 打开和关闭垂直同步方法