垂直同步开启时,SDL+OpenGL 动画不连贯

Posted

技术标签:

【中文标题】垂直同步开启时,SDL+OpenGL 动画不连贯【英文标题】:Choppy SDL+OpenGL animation when vsync is on 【发布时间】:2011-06-03 14:50:05 【问题描述】:
Uint32 prev = SDL_GetTicks();

while ( true )

    Draw();

    Uint32 now = SDL_GetTicks();
    Uint32 delta = now - prev;
    printf( "%u\n" , delta );
    Update( delta / 1000.0f );
    prev = now;

    ProcessEvents();

该应用程序是一个简单的移动方块。我的循环看起来像这样,当 vsync 运行时,整个事情运行得非常顺利;将其关闭会导致动画的某种跳跃。我插入了一些打印件,这是我发现的:

[...] 16 15 16 66# 2# 0 # 0 # 16 16 21 [...]

我知道这种循环有几个问题,但似乎没有一个适用于这个简单的例子(我错了吗?)。是什么导致了这种行为,我该如何克服?

我在 Linux 系统上使用 ATI 卡,但我期待一个可移植的解释/解决方案。

【问题讨论】:

专有的,它似乎只发生在我自己的应用程序中。 SDL 1.2 还是 1.3? Draw()glFinish()/glFlush() 和/或 SDL_GL_SwapBuffers() 吗? sdl-config --version1.2.14。它只做SDL_GL_SwapBuffers() 【参考方案1】:

似乎缺少glFinish(),我在某处读到该函数的调用在大多数情况下是无用的(例如here 或here)。好吧,我可能误解了一些基本概念,但这对我有用,现在Draw() 函数以:

    [...]
    glFinish();
    SDL_GL_SwapBuffers();

【讨论】:

以上是关于垂直同步开启时,SDL+OpenGL 动画不连贯的主要内容,如果未能解决你的问题,请参考以下文章

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

OpenGL 不绘制到 SDL2 窗口

OpenGL 深度测试不工作 (GLEW/SDL2)

SDL + OpenGL,具有周期性尖峰的不规则帧时间

如何在OpenGL中处理纹理动画? [关闭]

XCode 4.3.2 SDLMain.o 中的 SDL 未定义符号