Nanashi-softプログラマ専用Windows gcc SDL


◇Windowsでgcc+SDL -スレッド処理-

SDLには、基本機能としてスレッド関数が実装されています
基本は、
スレッド実行する処理を関数として記述して、
pthread_createでその関数をスレッド化して、
pthread_joinでその処理が終わった事を確認する

説明はPS3 Linuxで行ったものと同じですので割愛します
PPEでスレッド処理
で考え方を
SDL関数を使ってスレッド処理
でSDL関数を用いた記述方法を
それぞれ説明してあります

今回は描画分割で説明してみます
画面上をドット描画したい場合のプログラムを書いてみます

  int x,y;
  for(y=0; y < 480; y++){
    for(x=0; x < 640; x++){
      SDL_Rect box;
      box.x = x;
      box.y = y;
      box.w = 1;
      box.h = 1;
      //点を描画
      SDL_FillRect(screen, &box, SDL_MapRGB(screen->format,c,0,0));
      //点を表示
      SDL_UpdateRect(screen,0,0,640,480);
    }
  }

画面全体に赤の一番暗い色状態から、一番明るい状態まで256回描画して表示しています
これを実行すると、3.7秒ほどかかりました

画面下半分をスレッド化して高速化できるかやってみます
まずは、スレッド用関数を作成します

int thread1(void* args){
  //実画面のサーフェスを受け取る
  SDL_Surface *screen=(SDL_Surface*)args;

  int x,y;
  //下半分にy値を変更
  for(y=240; y < 480; y++){
    for(x=0; x < 640; x++){
      SDL_Rect box;
      box.x = x;
      box.y = y;
      box.w = 1;
      box.h = 1;
      //スレッド処理した部分が分かりやすいように緑で描画
      SDL_FillRect(screen, &box, SDL_MapRGB(screen->format,0,c,0));
      SDL_UpdateRect(screen,x,y,1,1);
    }
  }
}

voidポインタを渡す例として、実画面のサーフェスを引き渡してみました
もちろん、グローバル変数にしてしまえば、渡す必要はありません

この関数をスレッド化して処理します

  SDL_Thread *pt1;
  pt1 = SDL_CreateThread(thread1, (void *)screen); //スレッドを実行

  int x,y;
  //上半分にy値を変更
  for(y=0; y < 240; y++){
    for(x=0; x < 640; x++){
      SDL_Rect box;
      box.x = x;
      box.y = y;
      box.w = 1;
      box.h = 1;
      //点を描画
      SDL_FillRect(screen, &box, SDL_MapRGB(screen->format,0xff,0,0));
      //点を表示
      SDL_UpdateRect(screen,x,y,1,1);
    }
  }

  SDL_WaitThread(pt1, NULL); //スレッド処理終了を待つ

これを処理すると、点がボロボロになりました
原因と対処方法は次に続く


TOPプログラマ専用Windows gcc SDL