Internet of Tomohiro
よろしければ投げ銭をお願いします。
Nim 言語で4k introを作るサンプルを作りました。
https://github.com/demotomohiro/nim-4k-intro-sample
簡単に言うと4096バイト以下のサイズでかっこいい映像と音楽を作るプログラムのことです。 Demoscene文化の中の一つに4k introという一つのジャンルがあります。 Demosceneについて知るには以下の動画を観るとよいでしょう。
https://www.youtube.com/watch?v=iRkZcTg1JWU
https://www.pouet.net/party.php?which=1550&when=2020
大きなデータを使わない
4k introは実行ファイル単体で動作しなければなりません。画像ファイルや音楽ファイルなどを読み込んではいけません。 インターネットからデータをダウンロードすることもできません。 かっこいい映像を作るために大きなテクスチャ画像や3Dモデルを使っていては実行ファイルのサイズを小さくすることはできません。 なんとか工夫して小さくするか、プロシージャルな方法を使ってデータを生成する必要があります。 フラクタルなどを使えば小さなコードから複雑な映像を作ることができますが、4k introを見ている人達は有名なフラクタルは何度も観ていて飽き飽きしています。 以下のサイトには4k intro作成に使えそうな技術の解説があります。
このサイトで参考になりそうなGLSLコードに出会えるかもしれません。
C標準ライブラリを使わない
C言語の標準ライブラリの機能を使うと標準ライブラリがリンクされて実行ファイルのサイズが4096バイトを超えてしまいます。 標準ライブラリをリンクしないようにコンパイルオプションを指定し、必要な機能は自分で実装するかwindowsAPIや OpenGL を直接呼び出して実装します。 Nim 言語の標準ライブラリでC言語の標準ライブラリを呼び出しているものは使いません。 Visual C++で標準ライブラリを使わないときは最初に呼ばれる関数の名前がデフォルトで WinMainCRTStartup になります。
Crinklerで実行ファイルを圧縮する
Crinkler はリンカのようにC/C++コンパイラから生成されたオブジェクトファイルをまとめて実行ファイルをつくります。このときにコードとデータを圧縮しそれらを解凍するコードを付加します。 この実行ファイルは実行時にそれらを解凍してメモリに書き込んでから実行します。 ランダムに近いデータは圧縮したときに小さくなりにくく、規則があったり同じパターンが繰り返し現れるようなデータは小さくなりやすいです。 圧縮される前のコードとデータをできるだけ小さくするよりも、多少大きくなっても同じビット列が何度もでてくるようにしたほうが圧縮後のサイズが小さくなりやすいです。 なので関数を展開するとより小さい実行ファイルになることがよくあります。
後片付けしない
ヒープメモリやOpenGLのバッファオブジェクトなどの作ったら後で解放しろと言われるものは4k introでは解放する必要はありません。 そういったコードを書くだけ無駄に実行ファイルが大きくなるだけです。 自分で解放しなくてもプログラムが終了したときにOSが片づけてくれるはずです。 4k introはせいぜい数分間しか動かないので、ループ内でリソースを作り続けたりしない限りは解放しなくても問題ありません。 4k introが実行時に何をするかはほぼコンパイル時に決まるのでヒープメモリを使う必要性はほぼ無いと思います。 WindowsでC標準ライブラリを使わない場合は ExitProcess というwindowsAPIを呼ばないとプロセスを完全に終了できません。
GLSLコードを小さくする
OpenGL を使う場合はGLSLで書かれたコードをプログラムの中に埋め込むことになります。 Shader_Minifier はGLSLコードの空文字を削除したり変数名や関数名を小さくしたりなどして小さくしてくれます。
by Tomohiro