2014-12-07 117 views
0

我正在嘗試創建每像素像素的圖像並使用SDL在屏幕上顯示它。圖像必須刷新並再次顯示〜每秒50次(我正在尋找50 FPS遊戲)。我試圖創建一個簡單的程序來說明我想要做什麼:我創建了一個1280 * 720窗口和紋理,我交替地填充綠色和紅色。 問題是代碼運行非常緩慢(〜8 FPS)。我在哪裏搞砸了?使用SDL2紋理渲染每像素緩慢像素

這裏是我的代碼

SDL_Texture *display; 
    SDL_Window *window; 
    SDL_Renderer *renderer; 
    int   x; 
    int   y; 
    int   a = 255; 
    int   b = 0; 

    window = SDL_CreateWindow(gl_title, SDL_WINDOWPOS_CENTERED, 
          SDL_WINDOWPOS_CENTERED, gl_width, gl_height, 0); 
    renderer = SDL_CreateRenderer(window, 0, SDL_RENDERER_ACCELERATED | 
              SDL_RENDERER_TARGETTEXTURE | 
              SDL_RENDERER_PRESENTVSYNC); 
    display = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, 
           SDL_TEXTUREACCESS_TARGET, gl_width, gl_height); 
    while (true) 
    { 
     SDL_SetRenderTarget(renderer, display); 
     SDL_SetRenderDrawColor(renderer, a, b, 0, 255); 
     for (x = 0; x < gl_width; ++x) 
     { 
      for (y = 0; y < gl_height; ++y) 
      { 
       SDL_RenderDrawPoint(renderer, x, y); 
      } 
     } 
     a = a == 255 ? 0 : 255; 
     b = b == 255 ? 0 : 255; 
     SDL_SetRenderTarget(renderer, NULL); 
     SDL_RenderCopy(renderer, display, NULL, NULL); 
     SDL_RenderPresent(renderer); 
    } 

回答

1

繪製使用功能對每個像素將是緩慢的在屏幕上。您可以手動寫在一個循環中的像素,避免每次調用該函數的成本或使用該做的SDL提供的功能之一是爲您提供:

SDL_RenderFillRect

SDL_RenderDrawLines

SDL_RenderDrawPoints

SDL_RenderDrawRect

+0

由於屏幕上的每個像素都會發生變化,因此使用此類功能並不是一個好主意。我找到的解決方案是使用SDL_Surface並直接修改其像素,然後將其轉換爲紋理並顯示它。 – 2014-12-07 17:11:46

+0

@BrendanRius真的很慢。 SDL_RenderFillRect()將是最快的方法。 – 2501 2014-12-07 17:13:13

+0

即使對於像素每像素渲染? – 2014-12-07 20:30:27