[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 2216] OSARIS(Re: (OSASK 2214)).



  こんにちは、川合です。


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/