我可以在不使用嵌入式 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 交谈?

如何在不更新整个固件的情况下使嵌入式系统可配置

使用 tf.while_loop 对张量进行切片

有啥方法可以在不使用自适应付款的情况下为第三方处理付款?

您可以在不启用自动播放的情况下隐藏 YouTube 嵌入的控件吗?

在不添加新元素的情况下嵌入 AngularJS