[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 2216] OSARIS(Re: (OSASK 2214)).
- Subject: [OSASK 2216] OSARIS(Re: (OSASK 2214)).
- From: Hidemi KAWAI <kawai !Atmark! imasy.org>
- Date: Tue, 25 Sep 2001 01:58:43 -0000
こんにちは、川合です。
isao ogawa さんは 2001/09/24 23:34:06 の「[OSASK 2214] Re: adarr
el7, monza7.」で書きました:
>あと、未完成のOSARISです。
>http://www18.cds.ne.jp/~gyaplus/OSARIS.lzh
>
>これは難しすぎてゲームならないので、これから
>レベルを付けて出るブロックに制限を付けます。
ダウンロードして遊んでみました。
僕は5000点程度までしかいけません。とても難しいです。
難しさについては、きっと調節してもらえると思っているので特に心
配はしていませんが、バイナリーが大きくなってきたのが心配です。
ということで、バイナリーを小さくするためのアドバイスを書いてお
きます(笑)。もちろん、題材はOSARIS.cです。
---
まず、簡単なところから。
27行目の
static char block[2][4][4] = {
を、
static int block[2][4][4] = {
に変更してみましょう。これだけで、100バイト縮まります。lcc-win32
はあまり賢くないので、charで済むアクセスをintにしようといらぬ努
力をしてくれます。それなら最初からintにしてしまえばいいわけで、
これで100バイトも小さくなるわけです(blockは使用頻度が高い変数な
のでこの作戦が効くんです)。
なお初期値リストを見ると0ばかりであり、このようなものであれば
BINに変換するときにパックしてくれるので、intにしても実行ファイ
ルは大きくならずに済みます。
次はちょっと面倒ですが効果が大きいやつを。
415行目あたりに、
int (*b)[4][4];
b = block;
の2文を挿入して、以降の"block["を"b["に置換してください。これは
何をやっているのかというと、外部変数blockへのアクセスを外部変数
なしでアクセスしようというだけのことです。lcc-win32では外部変数
へのアクセスはとても.BINファイルを大きくするので、たとえポイン
タになってしまっても、これを外部変数なしでアクセスできるように
してやると、サイズが縮みます(実行速度はこれでも多分落ちません
)。
どのくらい縮むのかというと、192バイトです。先の100バイトと合わ
せれば292バイトのダイエットに成功したことになります。
さあ、もう一つ行きましょう。
関数main()はたくさんの変数を使っていますが、その中には結構大き
な配列変数もあります。1つの関数の中の自動変数が128バイトを超える
ようになると、バイナリーサイズが大きくなります。そんなわけで、以
下の変更を試みます。
wallとfieldの宣言の部分を、
int *wall; // 壁データ と言うより、プレイフィールドデータ
int (*field)[20]; // 壁の内側(表示用)
に変更します。それで、シグナル定義の直後のところに(まあ、別にこ
こじゃなくてもいいんですが)、以下の2文を入れることにします。
wall = malloc(26 * sizeof (int));
field = malloc(10 * 20 * sizeof (int));
これでバイナリーはさらに232バイト縮みます。
これ以上のダイエットのためには、大規模な改造が必要になりそうな
ので、ここでは検討しません。ここでのアドバイスの趣旨は、お手軽に
ダイエットできることなんですから(笑)。
このゲーム自身の本質的な難しさもありますから、そんなにざくざく
と削れるわけでもなさそうですし。
---
みなさんもこういう点に配慮して、よりコンパクトなバイナリーを目
指していただけると、僕はうれしいです(笑)。
それでは。
--
川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/