OpenGL SDL 2.0 应用程序是否必须执行轮询事件?

Is polling events compulsory for an OpenGL SDL 2.0 application?

我 运行 进入这个问题,最近,我创建了一个 OpenGL ES 2.0 上下文,使用 SDL 2.0,我意识到如果 SDL_PollEvent 没有被调用,OpenGL 不会渲染任何东西,之后绘图调用。

这是我的代码:

// After creating a valid OpenGL context
// Compiling & linking shaders, and using program...


float vertices[9] = {
       0.0f, 0.5f, 0.0f,
       0.5f, 0.0f, 0.0f,
       -0.5f, 0.0f, 0.0f
   }; 
   uint32_t vbo; 
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(pos);
    glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), (void*)0);
    
    bool run = true;
    SDL_Event e;
    while (run)
    {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
        glDrawArrays(GL_TRIANGLES, 0, 3);
      SDL_GL_SwapWindow(window); 
  // if SDL_PollEvent is called here, everything works!!! 
   }

但是,如果我在 window 交换函数之后调用 SDL_PollEvent,我会看到一个三角形,否则 ,一个三角形只是闪烁并消失到我的应用程序启动时出现空白屏幕。

我想知道是什么导致了这种行为!?

我还尝试在 while 循环中放置一个 printf("Running\n");,以检查循环是否为 运行 或卡住,我发现它是无限期的 运行 并进行绘图调用,但是我看不到三角形...

顶点着色器:

precision mediump float; 
attribute vec3 pos;
void main()
{
    gl_Position = vec4(pos.xyz, 1.0); 
}

片段着色器:

precision mediump float; 
void main()
{
      gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); 
}

操作系统是 Android,但我预计这也会发生在其他操作系统上...

I want to know what is happening under the hood, that is causing this behaviour!?

每当进程未能及时回调到 SDL 事件处理功能之一(SDL_PollEvent()/SDL_WaitEvent()/SDL_PumpEvents())时,OS/windowing 系统通常会认为进程冻结并停止显示 window 更新。

这种先画后块的行为(就事件系统而言)有时用于旧的单缓冲 windowing 系统,但正如您发现的那样,现在非常不稳定.