Nanashi-soft○プログラマ専用○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); //スレッド処理終了を待つ
これを処理すると、点がボロボロになりました
原因と対処方法は次に続く