2012-07-16 95 views
0

我开始制作一个SDL版本的康威生命游戏。我之前使用过SDL,但从未直接访问像素。我写了下面的代码,它的表现很慢。我试过使用UpdateRect而不是Flip,两者之间没有区别。我用SWSURFACE初始化了SDL。我能做些什么来改善它吗?我有解决方法(对更大的像素使用bmp等)。 plot数组是640x480的Cell对象,它只包含一个可以通过getter/setter访问的'alive'成员。我想要做的就是让鼠标高效地绘制像素。我需要使用OpenGL来做到这一点吗?我想澄清一下,我意识到现代硬件不适用于每像素访问。但看到这就是我需要的,我正在寻找解决方案。SDL的每像素访问速度加快

while (quit == false) 
    { 
      int pX = 0; 
      int pY = 0; 
      bool did_set = false; 
      if (SDL_PollEvent(&event)) 
      { 
        switch(event.type) 
        { 
          case SDL_MOUSEBUTTONDOWN: 
            plot[event.button.y][event.button.x].setAlive(true); 
            pX = event.button.x; 
            pY = event.button.y; 
            did_set = true; 
          break; 
          case SDL_QUIT: 
            quit = true; 
          break; 
        } 
      } 

      if (did_set) 
      { 
        SDL_LockSurface(screen); 
        Uint32 p = SDL_MapRGB(screen->format, 255,255,255); 
        putpixel(screen, pX, pY, p); 
        SDL_UnlockSurface(screen); 
      } 
      SDL_Flip(screen); 
    } 
+0

chhe鼠标移动一个容器,并在一个地方做所有的绘图。即一个render()函数。此外,您进行的比较次数,switch语句到if ...将您的代码分解成函数或对象成员函数,以处理您需要的任何事件。并尽可能少地保留循环内的实际处理。做到这一切,你应该看到执行速度的显着提高。目前通过代码,你发布了更新屏幕的循环,当你真正需要做的只是更新屏幕 – johnathon 2012-07-16 17:33:50

+0

在战略时代,比如鼠标移动时,以及窗口需要重新绘制时(调整大小,模糊等) – johnathon 2012-07-16 17:35:52

回答

2

您只处理每个“帧”的一个事件。

尝试改变SDL_PollEvent()ifwhile

const Uint32 p = SDL_MapRGB(screen->format, 255,255,255); 
while (quit == false) 
{ 
    while (SDL_PollEvent(&event)) 
    { 
     switch(event.type) 
     { 
     case SDL_MOUSEBUTTONDOWN: 
      { 
       int pX = event.button.x; 
       int pY = event.button.y; 
       plot[pY][pX].setAlive(true); 
       SDL_LockSurface(screen); 
       putpixel(screen, pX, pY, p); 
       SDL_UnlockSurface(screen); 
      } 
      break; 
     case SDL_QUIT: 
      quit = true; 
      break; 
     } 
    } 

    SDL_Flip(screen); 
} 
1

您在单个帧期间可能越来越多的事件,但你只处理一次一个,然后等待下一帧。在几乎所有的SDL示例代码中,您将在while声明中看到SDL_PollEvent。另外,鼠标一次可以移动多个像素,所以你必须从旧位置到新位置画出整条线(例如Bresenham的算法)。在这一点上,你最好避免使用putpixel,因为当你实际上只是沿着列和线行走时(这可以通过添加来完成),它可以在整个乘法中获得内存中的位置。