「コンピューター技術書の温故知新 第十二回 効率の良い数値計算が実行速度を決める」大野典宏

コンピューター技術書の温故知新

第十二回

大野 典宏

●効率の良い数値計算が実行速度を決める
 実行速度と言ってもCPUのアーキテクチャやクロックの周波数、メモリへのアクセス速度など、総合的に言う「コンピューターが速い」という話では無い。
 最近ではとにかく速いグラフィクスアニメーションの表示が求められるハイグレードなゲームでは、一瞬アニメーションが止まったり、処理が抜け落ちることもある。要するに「処理が間に合っていない」状態にあるわけだ。
 一般のゲーム専用機では、仕様が統一されているので、そうそう酷い事にはならないのだが、PCで実行するゲームの話となると、処理速度の速いCPUにグラフィックボード、ネット回線などが必要になり、「ゲーミングPC」と名付けられる製品は恐ろしくリッチなハードウェア構成になっている。
 今のクオリティでグラフィクスを描画するとなると、たくさんの絵を用意して切り替えるようなパラパラアニメでは済まない。数式モデルを用いて、複雑な数値計算を行わなければばらない。物理シミュレーションを行ったり、表示されるオブジェクトの回転や移動などをリアルタイムで計算し、隠面消去(影に隠れる部分を隠す)などを行わなければならなくなる。
 少なくともベクトル計算、四次元の行列計算、座標変換などなど、それなりの理解が必要になる。中には、画期的な表現を実現したゲームのライブラリが、開発者向けとして販売されることもある。そのまま使うわけではなくゼロから考える手間をはぶく事ができるからである。
 かくいう評者も、簡単なゲームならいくつか作ったことがあるし、アニメーションなども作ったのだが、とにかくどの数値にどんな計算を施すのかを理解していなければ、何もできはしない。結果から逆算して関数を組み立てて初期値を割り出すとか、なにかと手間がかかるものだった。
 そういう世界へ入っていくための入門書であり、指南書としては役立つ書籍だと言えた。

 ちなみに、本文に出てくる「Elevated」は今でもコードが手に入るし、実際に動いているデモも見られる。
 https://youtu.be/_YWMGuh15nE?si=HLULfPNncUJmWJJn


書評 2009年5月 8日

かなり密度の高い内容のソース・コード付き3Dプログラミングの解説書

『実例で学ぶゲーム3D数学』
著者: Fletcher Dunn,Ian Parberry
翻訳: 松田 晃一
出版社: オライリージャパン
ISBN-10: 4873113776
ISBN-13: 978-4873113777
484ページ
発売日: 2008年10月4日
価格: 3,400円(税抜き)

 本年の4月,ドイツで行われたプログラミング・コンテスト「Breakpoint」にて,4Kバイト以下部門で優勝した「elevated」というプログラムが世界中の注目を集めました.Windows上で動作する3Dアニメーション作品なのですが,かなり複雑な自然の地形や音楽まで含めて,わずか4Kバイトという信じられないサイズに収めてしまったのです.
 世界中のプログラマが驚愕したと言っても過言ではないかもしれません.
 4Kバイトと言われても,メモリがバブル状態になっている昨今ですから,あまり実感が湧かないかもしれなせんが,毎週書いているこの書評は,テキストで4Kバイトです.どれくらいのものなのか,分かるでしょう.
 実際にプログラムをダウンロードして実行してみましたが,裏技を使いまくっているらしく,セキュリティ・プログラムが警告を出したり,埋め込みのデータを最小限にして計算式で算出しているらしく,実行されるまでにかなりの時間がかかりました.ですから,試すのはあまりお勧めできませんが,実行結果の動画を見れば誰もが納得するでしょう.
 まあ,これはある種の「競技」ですから,このプログラムで用いられた手法が一般的なアプリケーションで使って良いものなのかどうかは意見が分かれるところだと思います.
 このプログラムから得られるのは,データよりも計算式のほうがコンパクトであるという当たり前の事実です.「車輪の再発明」のようなことですが,とにかく高価なオーサリング・ツールを使い,巨大なデータの固まりをマッピングして塗りつぶしまくる,という現在の手法に対する反逆のような気がして非常に興味深いと思いました.
 さて,何度か書いていますが,そもそもコンピュータというものは計算しかできません.絵を描くのも,文章が書けるのも,ゲームで遊べるのも,すべては計算の結果です.普通はプログラム言語で記述し,抽象化されているので実感が薄まってきているかもしれませんが,最終的にコンパイルし,機械語のレベルになったら,もうプロセッサは計算しかしていません.その結果をさらに加工し,テキストや絵として表示しているからこそ,Webの閲覧もテキストの書き込みもできるわけです.
 ですから,WindowsであろうとLinuxであろうと,ユーザ・インターフェースによって隠されていますが,煎じ詰めると「常に何かを計算している」という事実は動きません.たとえテキスト・エディタしか使わなくても,Windowsはウィンドウの表示,フォントの展開と表示,スクローリングの際の再計算など,かなり複雑な計算を行っているわけです.
 まあ,そんな事情があるので,Windowsの同じアプリケーションでもバージョンやCPUのパワーによって速くなったり遅くなったりするわけです.
 何度も取り上げていますが,評者が数学にこだわるのは,「ツールがどれだけ便利になろうとも,最後には数学の知識に還元されるので,プログラマは自分が向き合っているプロダクトに必要な数学の知識を持っているのかどうか,そこで実力が決まる」と考えているからです.
 さて,今回紹介する本は,「ゲーム」と題されていますが,これは3Dのアプリケーションの中で最も高速で複雑な処理が必要とされるのがゲームである,というだけの話にすぎません.実際には座標変換や行列,四元数といった計算は,シミュレーションや立体CAD,ロボットの制御,ヴァーチャル・リアリティなどでも必要になります.
 いくら便利なツールがあるからといって,組み込み機器にShadeやMayaを組み込む人はいないでしょう.または3D表示用のミドルウェアを買ってしまうという手段もありますが,予算との兼ね合いになります.ですから,面倒くさくても理解していた方が絶対に「お得」です.
 本書は,数式とC++のコードばかりで埋め尽くされているので,立ち読みする段階では「引いてしまう」かもしれませんが,実際に読み込んでみると,かなり懇切ていねいに書かれています.これまでも類書はありましたが,コーディングの根拠まで書かれた親切な本だと思います.
 誰もが最初に挙げた「elevated」を実装できるレベルにある必要はありませんし,「elevated」は縮小化しすぎているために計算処理が重くなりすぎてしまっているので,実用的ではありません.
 しかし,膨大なデータを用意して,それをパラパラ・アニメで動いているように見せる原始的な力業と,計算で全部をまかなってしまうという極端な「力業」の間にある中間点を知る意味では有用でしょう.