SDL2 不会无延迟地渲染
SDL2 does not render without a delay
这个简单的 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 毫秒,它大约一半的时间有效。
阅读此答案后,我添加了事件循环,但是没有它,我得到了相同的行为。#sdl
IRC 上的用户从相同的代码中获得了预期的蓝屏。
知道这里发生了什么/我做错了什么吗?
您应该调用 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,然后查看其源代码(只有一个小文件)。
相关文章:
- 如何仅为一个函数添加延迟
- 以在Qt中的IF语句中设置时间延迟
- 模板化类中静态成员的延迟初始化
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 如何创建事件驱动的 SDL2 应用程序
- 使用 SDL2 和SDL_image C++加载图像
- 将自定义函数传递到基抽象类中以延迟执行
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- 将 SDL2 与 CMake 链接起来
- 如何在 c++ 中延迟?
- SDL2 透明背景
- 如何在使用 SDL2 的 Eclipse 中构建 c++ 程序
- 不带轮询的 SDL2 事件回调
- 如何测量管道延迟?
- C++ SDL2:如何将矩形渲染到多个视口中
- 获取毫秒延迟的错误值
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 我的 SDL2 应用程序仅在第一次键盘输入后出现严重延迟
- SDL2 不会无延迟地渲染
- c++ SDL2无延迟获取鼠标坐标