SDL_PollEvent() 跳过事件
SDL_PollEvent() skips events
非常简单的程序,用于在屏幕上绘图(就像在 Paint 中用笔一样)
我正在使用 SDL 1.2。我正在处理的事件只有鼠标移动、鼠标左键单击和退出程序。我的问题是当我快速移动鼠标时 SDL_MOUSEMOTION 事件是 'skipped'(当我说快是指比 1 pixel/second 快)
为什么会这样?
屏幕截图:
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;
}
那是因为你SDL_Flip
你所有的屏幕,太花时间了。
最好在另一个线程中调用 SDL_Flip
(例如使用 std::async
)。
或者您可以不更新所有表面,而只更新颜色变为白色的部分。
非常简单的程序,用于在屏幕上绘图(就像在 Paint 中用笔一样)
我正在使用 SDL 1.2。我正在处理的事件只有鼠标移动、鼠标左键单击和退出程序。我的问题是当我快速移动鼠标时 SDL_MOUSEMOTION 事件是 'skipped'(当我说快是指比 1 pixel/second 快)
为什么会这样?
屏幕截图:
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;
}
那是因为你SDL_Flip
你所有的屏幕,太花时间了。
最好在另一个线程中调用 SDL_Flip
(例如使用 std::async
)。
或者您可以不更新所有表面,而只更新颜色变为白色的部分。