【问题标题】:SDL_PollEvent() skips eventsSDL_PollEvent() 跳过事件
【发布时间】:2016-06-17 05:53:00
【问题描述】:

非常简单的程序,用于在屏幕上绘图(如在 Paint 中使用笔)

我使用的是 SDL 1.2。我正在处理的唯一事件是鼠标移动、鼠标左键单击和退出程序。我的问题是当我快速移动鼠标时 SDL_MOUSEMOTION 事件被“跳过”(当我说快速时,我的意思是快于 1 像素/秒)

为什么会这样?

屏幕截图:

http://postimg.org/image/gcb87v9zr/

http://postimg.org/image/i5e4w6v6f/

#include <SDL/SDL.h>

SDL_Event event;
SDL_Surface* screen;
bool clicked = false;
Uint32 whiteColor;
int W = 200; // screen width
int H = 200; // screen height
Uint32* screenPixels;

bool handleInput();

int main(int argc, char** argv)
{
    SDL_Init(SDL_INIT_EVERYTHING);
    screen = SDL_SetVideoMode(W,H,32,SDL_SWSURFACE);
    whiteColor = SDL_MapRGB(screen->format,255,255,255);

    screenPixels = (Uint32*) screen->pixels;

    while(handleInput())
    {

    }
    SDL_Quit();
    return 0;
}

bool handleInput()
{
    while(SDL_PollEvent(&event))
    {
        switch(event.type)
        {
            case SDL_QUIT:{
                return false;
                break;
            }
            case SDL_MOUSEBUTTONDOWN:{
                clicked = true;
                break;
            }
            case SDL_MOUSEBUTTONUP:{
                clicked = false;
                break;
            }
            case SDL_MOUSEMOTION:{
                if(clicked)
                {
                    int P_x = event.motion.x;
                    int P_y = event.motion.y;
                    screenPixels[P_y * W + P_x] = whiteColor;
                    SDL_Flip(screen);
                }
                break;
            }
        }
    }
    return true;
}

【问题讨论】:

    标签: c++ sdl sdl-1.2


    【解决方案1】:

    那是因为你SDL_Flip你的屏幕,时间太长了。

    最好在另一个线程中调用SDL_Flip(例如使用std::async)。

    或者您可以不更新所有表面,而只更新颜色变为白色的部分。

    【讨论】:

    • 是的,SDL_Flip() 是原因,当我只为实例打印坐标时,SDL_PollEvent() 工作正常
    • @marko 所以,你不能在事件轮询线程中做任何昂贵的操作。另一个建议是在并行线程中在 N 毫秒内执行一次 SDL_Flip。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多