SDL_videomalloc

failmalloc 見て、なんか思うところがありました。

http://enbug.tdiary.net/20060714.html#p01

前からメモリぶっ壊しゲーっていうのを作りたいなと思ってまして、ゲームとしては崩壊してるんですが、 VRAM の内容に実際のゲームのデータが入ってて、その部分が描画によって変化するとゲームの内容も変わってしまう、というようなものを。

なんというか昔のゲームの面白いバグ/裏技っていうのはメモリぶっこわして起きてることが多いわけで、その異様さを意識的に楽しむ、というか、そういうことがなんとなくしたいんです。

で、安易に malloc 乗っ取ったらどうだろうと思って作ったのが SDL_videomalloc 。

http://shinh.skr.jp/dat_dir/SDL_videomalloc.c

SDL_GetVideoSurface が非 NULL を返したら、その中のビデオメモリを malloc の返り値に無理矢理してしまうという物体です。ですが、これはロクに動きませんでした。まぁ当たり前ですが、特にポインタデータが VRAM の削除などで破壊されてしまうとどうしようもないことになるからです。

口惜しいですが、 malloc をいじるのは諦めて、 SDL のサンプルである testsprite をいじってみました。

http://shinh.skr.jp/dat_dir/videomallocsprite.c

要するに唯一のメモリ確保部分であり、 sprite 達の座標やら速度情報を握っている部分を確保してる個所を、

//      mem = (Uint8 *)malloc(4*sizeof(SDL_Rect)*numsprites);
        mem = (Uint8 *)screen->pixels + 640*200;

と書き変えて、後は落ちたりしないように free を消したりして、画面塗り潰しはつまらないので消したりしただけです。メモリの位置(640*200)は適当に選びました。いじると挙動が変わります。 -bpp オプションで bpp 変えても挙動が変わります。よく見ると画面に謎のドットの列ができているので、スプライトの位置情報なんかが画面に出てるなぁとわかります。スプライトを減らして実行すると、そのドット列をスプライトが通ると挙動が変わるということがわかります。

まぁこれだけでも結構異様で面白いので、なんか作れるといいなぁと思いました。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h