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