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 系统,但正如您发现的那样,现在非常不稳定.
我 运行 进入这个问题,最近,我创建了一个 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 系统,但正如您发现的那样,现在非常不稳定.