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


◇Windowsでgcc+SDL -VRAM(ビデオメモリ)を使う-

パソコンにはメインメモリとビデオメモリがあります
普通はメインメモリだけを使用します。なぜならビデオメモリは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からデータを取り出す事も高速になったはずです
その話はいずれまた


TOPプログラマ専用Windows gcc SDL