1byte入魂!



今年のbest demoっていうと何でしょう?
やっぱdemoはVIP2,64kはheaven sevenあたりですかね.
とまあ,そんな話題がdemo 99で上がっていたんですが,4kはどうでしょう?

己のオススメは dialogos 4k #1 の stoerfall / freestyle .
OpenGLによる高解像度の描画,ロボットアームの動き,延々と繰り返す無機的な作業,それにマッチした音楽.妙にはまる.
というより,起動した瞬間音が鳴るのからびっくり.Windowsの4kというだけで驚きなのに,
サウンド付き!しかも「ただ付けました」って感じの音楽じゃないし.
サイズの制約からなのだろうけど,単純な波形からオシレータを組み合わせて音を作っていると思われる.
やはりintro soundは生成系じゃないと.

そして,ゆったりとしたカメラワークに浸りながら処理を列挙してみよう.
まずモデルデータ,モーション,それからカメラパスの生成.
で,音も作らなくちゃいけない,音色データとシーケンスデータが要る.
コード的にはそれらの生成に加え,OpenGLの初期化にシーン制御やサウンド関係の初期化,再生,開放といった一連の処理.

それが,4kなわけだ.windowsで.
ちなみにヘッダだけでもWin32PEフォーマットではどう頑張ってもファイルアライメントの関係で最低でも0x200byteは食う.
けど0x200に収めるのはかなり苦しいから,事実上0x400.
普通のリンカでリンクしようものなら0x1000単位でアライメントしてくれるので,ヘッダだけで4kいくわけだ.
つまり4kというのはwindowsの実行ファイルの一般的なヘッダのサイズしか無いわけ.
それでこれだけのことをやるんだから凄い.

どれだけ小さいかはバイナリエディタで見てみれば体感できる.
ちょっとしたテキストを打てば4kなんて直ぐだし.

ってあれ?こいつexeじゃなくてcomだぞ!?
今更気づくなー!
って気づいてましたが,話の都合上ここで気づいたことにします.

え?これDOSで動いていたの?
ってそんなわけありません.

これ如何にということで逆アセ.
予想通り,いきなり展開ルーチンが置いてあって,その直後に圧縮データ.
何も分からん.
ただ,云えることはその展開コードが伝説の,そして今だ最強とも云える4k introであるmeshaに酷使している.
かな?(ぉぃ

16bit用のデバッガが無いので,16bit用コードを強引に32bitに仕立て上げ(といってもアドレス指定しているレジスタを32bitにするだけ),
インラインアセンブラにぶちこんで展開用のアプリケーション完成.

decode!
で,w32dasmにでもかけますか.
と思いきやバイナリの中に不穏な文字列 'C:\' .
そう,展開後c:\にwin32 exeファイルを吐き出してそれを実行していたのだ.
これは一本取られた.
ということで実行中にc:\T.EXEというのが存在するはずなのでそれを捕獲するべし.
ちなみにparty版だと6656bytesのハズ.圧縮効率良いのか悪いのか.

中を見れば分かるけど,相当削ってます.
特にMZヘッダが凄い.
ここまでバッサリ切れるものとは知りませんでした.有りなのか?
freestyleの方にメールしたところ,ヘッダ周りは圧縮してあるんじゃなくて,プログラム的に書き出しているそうです.
うーん,けどどうせならsection名も要らないよね.と内心ツッコミ.
さらに言えばセクション分割する必要は無いんだけどね.まあ,そこまで言うのは酷というものか.

で,展開して6kか,案外小さいなあ,
と思ってヘッダ以降みたら...こんだけ?
しかもスカスカ.
これじゃあDOSの無圧縮4kと結果的にコードの密度は殆ど変わらないんでは.って感じだ.
code section 2736B + read only data section 100B + data section 2000B の正味4836B.
ちなみにread onlyというのはDLL読み込み関係の限りなくヘッダに近い部分.

しかし何よりもの驚きはコードがたったの2.67Kだって事.
圧縮とかしてあるから結局4kより結構でかいんだろうな〜って思っていただけにショック.
特に最近の64kはサイズは考えずに作ってUPXにお任せという風潮すら感じられるからね.
それだけにこれには驚いた.

コード的には,必要最小限のスクリプトインタプリタ+洗練,最小化されたデータ,
という構造なんじゃないかな.3Dパートは.
nfoには嘘臭く just-in-time-compiler なんて書いてあります.
ただのインタプリタとは違うのですか?
と聞いたけど,違うらしい.
たったこれだけのコードなので解析すればいいのかもしれないが,
なんかなあ,生理的にfpuのコードが25%以上占めるソースは読みたくない,って事でパス.
というより読む自信なし.

音は単純な波形をオシレータを組み合わせてあの音にしているらしい.
一体そんなことをこの狭いソース内のどこでやっているのか.
うーむ. forward kinematic animation というのも,平易な処理だとは思うが,
それなりのコード量がいると思うんだけどなあ.一番の謎はやっぱjitだな.



Hugi#21のDiagonal Reviewでこのstoerfallの評価を見たら,これくらいOpenGL使わなくたってできるけど...
みたいな事が書いてあって,そういう問題じゃないだろう.と思う.
が,このWriterのセリフ,demoに対していったらただの勘違いであるが,
introに対してはかなり意味深だ.

つまり,今の時代余程ソフトレンダに拘りを持つ場合で無い限り,ハードを利用した方がいろいろ便利なのは当然な上に,
技術力云々でハードかソフトを選択するわけではないから,ソフトでもできる,
っていうのはその議論自体無意味だと思うけど,4kの場合はちょっと違う.
4kにまともなレンダラを載せるって言うのは,
多分OpenGLをロードしてコールするより技術的に難しい.
DOSでは古くはasm95 4k #1 の pure spiritがグロー+簡易なテクスチャ(単純すぎるテクスチャなので実は単にmeshかも)が可能なエンジンを積んでいるし,
asm97 4k #1 の meshaに至ってはさらに強力なものにテクスチャジェネレータも積んで
とても4kとは思えないものに仕上がっている.
ちなみにpure〜は確か圧縮なしのネイティブな4kだったと思う.

なのにwindowsでは圧縮とOpenGLを使ってもこの程度.
そりゃ音なるし,OSの制約も全く違うけど,まだまだいけるのではないか?
そう思えるんだな.

昔ながらのクロックとの戦いというものが無くなってきた今,
こういったサイズとの戦いがdemo scene固有の一つの特徴でありアツさではないだろうか.

mitsuman 2000/12/26,incompleteness