繁体   English   中英

如何编写 SDL2 / OpenGL 事件循环

[英]How to write an SDL2 / OpenGL event loop

我正在 Python(pysdl2,PyOpenGL)中使用 SDL2 和 OpenGL 编写实时交互式图形应用程序。 该应用程序连续生成帧,这些帧可能会响应键盘/鼠标输入或根据时间而变化。

我的主事件循环是从 web 上的一些模糊来源复制的,我再也找不到了,看起来(简化)如下:

event = sdl2.SDL_Event()
running = True
while running:
    # process events
    while sdl2.SDL_PollEvent(ctypes.byref(event)) != 0:
        if event.type == sdl2.SDL_QUIT:
            running = False
    # render frame
    <some OpenGL commands>
    sdl2.SDL_GL_SwapWindow(window)
    sdl2.SDL_Delay(10)

据我了解,10 毫秒的延迟是为了给 CPU 一些喘息的空间,事实上,当我删除它时,CPU 使用率会翻倍。

我不明白的是为什么它是必要的。 图形显示是双缓冲的,缓冲区交换与垂直回扫同步(60 Hz = 16 ms)。 人们会天真地认为,如果<some OpenGL commands>花费的时间少于 16 毫秒,那么SDL_GL_SwapWindow无论如何都会引入延迟,因此SDL_Delay不是必需的。 如果他们使用更多,那么程序将难以跟上显示帧率,引入延迟会造成伤害。

现在,根据我在回答另一个问题时被告知的情况,当执行SDL_GL_SwapWindow时,缓冲区交换和回溯同步不会发生,但这只会将“同步和交换”指令放入 OpenGL 队列中,而这当之前的一切都完成时,指令就会被执行。 <some OpenGL commands> 但是这个指令队列是有限的,因此在某些时候我的程序将等待指令队列中有空间,而不是等待回溯。 最终效果应该是一样的:如果我的事件循环的一次执行平均需要少于 16 毫秒,那么程序平均延迟足够长以使其每次循环执行 16 毫秒。 那么,为什么需要明确的延迟呢?

作为第二个问题:考虑到延迟可能会影响帧率,有没有更好的方法让 CPU rest?

您不需要使用sdl2.SDL_Delay(10) ,因为 SDL_Delay 是 SDL2 框架的计时器,如果您使用事件循环,那么它不需要 SDL_Delay。

我的 Python 3.10 代码看起来是使用 KeyPress 并通过鼠标单击关闭 window 的示例

event = sdl2.SDL_Event()
running = True
while running:
    while sdl2.SDL_PollEvent(ctypes.byref(event)) != 0:
        if event.type == sdl2.SDL_QUIT:
            running = False

        if event.type == sdl2.SDL_KEYDOWN:
            if event.key.keysym.sym == sdl2.SDLK_ESCAPE:
                running = False

    ... GL Functions ...

    sdl2.SDL_GL_SwapWindow(window)

请记住,事件循环应该像 C/C++ 中的其他事件循环一样。 Java、C# 或其他编程语言。

没有事件循环意味着您应该使用SDL_Delay()然后游戏 window 将自动关闭。

我希望你能理解——我找到了 Python 个例子,但它们看起来很奇怪而且是错误的——它们写得像“拉丁文”。

我想提高谁像其他编程语言一样理解得更好。 PS:我会努力我的github 有明确的例子:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM