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 的屏幕?的主要内容,如果未能解决你的问题,请参考以下文章