2012-07-16 90 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,因爲當你實際上只是沿着列和線行走時(這可以通過添加來完成),它可以在整個乘法中獲得內存中的位置。