这个简单的SDL2程序在我的系统上打开一个空窗口(即它没有渲染),除非我取消注释SDL_Delay行。
#include <SDL.h>
int main(int argc, char** argv) {
constexpr unsigned width = 256, height = 256;
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
SDL_Log("Failed to initialize SDL: %s", SDL_GetError());
return 1;
}
SDL_Window* window = SDL_CreateWindow("Test",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
width, height,
0);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderClear(renderer);
// SDL_Delay(20);
SDL_RenderPresent(renderer);
bool quit{};
SDL_Event event;
while (!quit) {
SDL_WaitEvent(&event);
switch (event.type) {
case SDL_QUIT:
quit = true;
break;
}
}
SDL_Quit();
return 0;
}
延迟时间必须大约为10-20毫秒或者没有任何显示,但它并不一致 - 如果它设置为10毫秒,它的工作时间大约是一半。
在阅读this answer之后,我添加了事件循环,但没有它我会得到相同的行为。 IRC上的#sdl
上的用户已从相同的代码获得了预期的蓝屏。
知道这里发生了什么/我做错了什么?
答案 0 :(得分:1)
您应该调用SDL_PollEvent()以避免阻塞绘图线程。
尝试以下方法:
while (!quit) {
SDL_Delay(1000/25);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
if(!SDL_PollEvent(&event)) continue;
switch (event.type) {
case SDL_QUIT:
quit = true;
break;
}
}
或者,对于使用键盘和游戏手柄轮询的完整示例,编译并运行GPL游戏Rock Dodger SDL2 Compact Edition,然后查看其源代码(这只是一个小文件)。