ゲームコンソールの開発にあたり、利用可能なストレージスペースには既知の限界があります。この点を考慮して、実行可能ファイルのサイズをできるだけ小さくすることが、私の仕事のひとつです。
ここでは、そのために必要なリンカの2つの機能、デッドストリッピングと重複除外についてお話します。これらの機能を使うと、参照されていないコードまたは重複コードを最終ファイルから削除することによって、アプリケーションのサイズおよびメモリ使用量を低減することができます。これにより、プログラムサイズが小さくなり、パフォーマンスが向上します。
デッド ストリッピング
その名のとおり、デッドストリッピングは、未参照のコードやデータブロックを実行可能ファイルから削除します。参照されていない (「デッド」) コードは使用されないため、実行可能ファイルには必要ありません。
また、デッドストリッピングを行うと、未定義のシンボルを参照する未使用のコードがすべて削除されるため、プログラムが正しくリンクされ、リンクエラーを回避できます。
デッドストリッピングは、ファイルから未使用のコードを削除するだけではありません。未使用のシンボルおよびデータをデータブロックから削除します。このようなシンボルには、グローバル変数、静的変数、文字列データが含まれている場合があります。
私たちが開発したリンカは、リンクするオブジェクトが特殊なコンパイラスイッチを用いてコンパイルされていない場合でも、セクションの中からコードやデータをストリップできます。リンカによっては、各セクションの参照カウントをもとにデッドストリッピングを行うものもあります。そういったリンカはセクション切り替えが必要であるためにセクションが増殖し、リンク時間に悪影響がおよぶ可能性があります。
デッドストリッピングにより、通常、実行可能ファイルのサイズが5~10%ほど小さくなります。
重複除外
重複除外は、同一のコードや読み取り専用データを削除することにより、最終的な実行可能ファイルのサイズをさらに小さくします。コンテンツが読み取り専用である場合、リンカは重複したコンテンツを削除し、削除されたコンテンツへの参照を、残りの単一コピーへの参照へ適切に変更することができます。
重複除外により、通常、実行可能ファイルのサイズを1~2%低減できます。
まとめ
以下の表は、データ ストリッピングおよび重複除外を行うことで、ファイル サイズをどれくらい小さくできるかの実例を示しています。
表 1. データストリッピングおよび重複除外によるファイルサイズの低減
ミドルウェアデモ | PlayStation®4ゲーム | |
---|---|---|
デフォルトのリリースビルド |
29.7MB |
82.5MB |
+ デッドコードのストリッピングを有効化 |
28.1MB |
78.1MB |
+ デッドデータのストリッピングを有効化 |
27.5MB |
76.8MB |
+ 重複除外を有効化 |
24.5MB |
74.9MB |
節約できたメモリサイズの合計 |
5.2MB (17.5%) |
7.6MB (9.2%) |
リンク時間は長くなりますが、ファイル サイズが低減され、優れたゲーム開発の可能性がさらに広がることを考えると、これらの機能を有効にする価値は大いにあると思います。