Nanashi-soft○プログラマ専用○Windows gcc SDL○
パソコンにはメインメモリとビデオメモリがあります
普通はメインメモリだけを使用します。なぜならビデオメモリはOSが処理する場所だからです
ですが、せっかくあるVRAMを使わないのももったいないので、使ってみます
const SDL_VideoInfo *vinfo; vinfo=SDL_GetVideoInfo(); printf("video_mem=%d\n", vinfo->video_mem);
そうすると、0が表示されます(ぁ
つまり、ビデオメモリは全てOSが掴んでいて、使えないと言う事です
以上('o'*)
SDL_HWSURFACEを指定しようが、フルスクリーンにしようが、ビデオメモリは使用しません
それが証拠に、変えても全く同じ速度です
実は、あまり語られない裏技があります
現在使用されているビデオドライバ名を表示してみます
char buffer[100]; SDL_VideoDriverName(buffer, sizeof(buffer)); printf("driver name=%s\n", buffer);
そうすると「windib」と表示されると思います
これを変更する方法があります
Cygwinのプロンプトで、以下のように環境変数をセットしてから起動させてみて下さい
export SDL_VIDEODRIVER=directx ./wintest
そうすると「directx」と表示されるはずです
こうする事でDirectXを使用した画面表示になります
実験してみます
画面を1万回表示するプログラムを実行してみます
int i; for(i=0; i < 10000; i++){ SDL_UpdateRect(screen,0,0,0,0); }
windibだと8.3秒
directxだと、15.7秒(ぁ
凄く遅くなるのですが、そうする事でビデオメモリが表示されるようになりました
video_mem=254780
これで多くのメモリを手にする事ができます
更に、動作原理から考えると、強力なパワーを引き出すことができます
DirectXは、フルスクリーンにする事でハードウェアアクセラレーションが使えるようになります
つまり、SDL_SetVideoModeを↓このようにすれば、性能を引き出せます
SDL_Surface *screen=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_FULLSCREEN);
この状態で1万回表示してみると、0秒でした('-'*)?
10万回にすると0.003秒でした
この状態で、VRAM間コピーで描画すると、高速描画できるはずです
PCI-ExpressになってからVRAMからデータを取り出す事も高速になったはずです
その話はいずれまた