我可以在不使用嵌入式 while_loop 的情况下使用 SDL 检查事件吗?
Posted
技术标签:
【中文标题】我可以在不使用嵌入式 while_loop 的情况下使用 SDL 检查事件吗?【英文标题】:Can I check for events with SDL without using an embedded while_loop? 【发布时间】:2017-02-14 15:05:37 【问题描述】:我最初使用 glfw 编写游戏。但是由于它缺乏 android 的可移植性,我必须用 SDL 替换我所有的 glfw 代码,因为 SDL 更便携。
我使用 glfw 框架的原始游戏循环非常简单。这里是:
// game loop
while (!glfwWindowShouldClose(window))
//if-else statements that create
//the games state machine
//player input is received here
//rendering done here
好的。编写这个游戏循环可能有更好的方法,但关键是代码适用于游戏原型。
但是,现在我切换到 SDL 时遇到了问题。似乎必须将 SDL_Event 放入 while 循环中以不断检查事件。而这个 while_loop 在另一个 while_loop 中。所以我的代码如下所示:
while(!Quit)
SDL_Event event;
while(SDL_PollEvent(&event))
//if-else statements that create
//the games state machine
//player input is received here
//rendering done here
但是,while_loop 中的这个 while_loop 完全搞砸了游戏渲染!我现在开始闪烁!有没有其他方法可以像我之前使用 glfw 那样在单个 while_loop 中表达此代码。或者有什么方法可以在不使用嵌入式 while_loop 的情况下检查事件
【问题讨论】:
SDL_PollEvent()
循环不应该只处理事件吗?您的渲染代码等应该在您的外部循环中......因为,您只在处理事件时渲染等......
【参考方案1】:
渲染和计算不应该在事件轮询循环内部进行,在外部进行。
这是我目前在 SDL2 中为我在c 中编写的游戏所做的:
while (!quit)
start_frame_ms = SDL_GetTicks();
/* Event polling */
while (SDL_PollEvent(&event))
joystick_event(&event);
keyboard_event(&event);
/* Calculations */
players_move();
enemies_move();
/* Rendering */
draw_sprites();
/* Lock FPS to 60 */
end_frame_ms = start_frame_ms - SDL_GetTicks();
if (end_frame_ms < FPMS)
SDL_Delay(FPMS - end_frame_ms);
【讨论】:
另一种选择是有一个单独的线程进行渲染,但这是另一回事。 @Matso 这不会导致计算函数的坐标与正在绘制的精灵不同步吗? 当然,如果没有应用同步方法。我只是说,在大型引擎中,许多不同的事情(渲染、音频、输入等)通常都有单独的线程。 @Matso 不确定它是否可移植。我在该设置中看到了死锁的 SDL_WaitEvent。以上是关于我可以在不使用嵌入式 while_loop 的情况下使用 SDL 检查事件吗?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不使用 Web 浏览器的情况下通过 websockets 交谈?