![]() パステル オービット |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
---|
ゲームプログラマが語る。宇宙に意識が生まれる仕組みと、バグテスト
|
![]() 降り注ぐ紫外線と暑さに思考力がやられっぱなしではありますが、今年の梅雨はもう明けてしまったのでしょうかね。湿気も雨も苦手ではありますが、こうも早々に退散されるとそれはそれで少し寂しい。自分がまさかの天候プチMだったなんて知りたくなかったTeamDyquemで御座います。 皆様こんにちは。 日本一、夏が似合わない男と言われ続けて幾星霜。この悪意に満ちた夏の日差しには本当に毎年辟易で御座います。完全に意識がありますねこの季節には。いじわる婆さんも裸足で逃げ出す事でしょう。 「いじわる婆さん」を知らないというジェネギャな方々は、 お父さんにでも聞けばいいさ! そうそう、アレですよ。意識……と言えば。 我思う故に我在りとか言いますけれど、「我思う」とは何でしょう。 脳髄という有機組織も突き詰めてみれば、コンピューターと同じ様に単なるデバイスの一つに過ぎないわけですから、代わりに、例えば本当にコンピューター内の情報処理として素粒子レベルの相互情報交換をエミュレート演算処理する事が実現出来れば、きっとそこにも所謂「魂」と呼ばれるものは芽生えると確信しています。自我や魂というものは結局のところ、厳密に定められた物理法則の上に生じる副産物であり、であればこそ意志は時空を超えて存在出来る様になり、そう遠くない未来では古くなった肉体という媒体を捨て、自我をコンピューター内に引っ越しさせるというエントヴァース的なライフスタイルが実現している事でありましょう。 その世界における「死」とは純粋な「母体データベースへの帰還」と同義であり、「出産」は「素体再構築」という事になるでしょう。新しい肉体に再生された魂は、前世に処理されたままの素粒子データベースを継承していますから、必然的に記憶も継続していく事になり、あんな事やこんな事等忘れたい程の恥ずかしい失敗談セットを持ったまま生まれ変わるという、ドMにはたまらない世界となっております。 はい。引かないソコ。 調子に乗って哲学の森に迷い込み、科学を履き違えている場合じゃあ明らかにありませんでした。 申し訳ありませんでした。あと、Mじゃありません。 ![]() 上記の例は極端でありますが、テクノロジーがどんなに進歩しようとも今はまだ結局のところそれを制御しているのは人間であり、であればやはり最大の敵はヒューマンエラーと言えるでしょう。 プログラミングにおけるそれはつまり「バグ」という事であり、プログラマに求められる重要なスキルとしてバグを作らない事、発生してしまったバグの原因を迅速に突き止めるという事の二点が非常に重要になってまいります。 バグと向き合う、バグを生まない、 バグと上手に付き合っていくための話題といたしまして今回は第二弾。 関連エントリといたしまして、 「ゲームプログラマが語る。バグを生まない仕込みと、バルスの例外処理」 上記エントリにおきましては、「Assert」という仕組みの基礎につきまして展開させて頂きました。今回は更にもう一歩、バグに対して歩みを進めてみたいと思います。 ![]() 簡易リグレッション・テストのススメ リグレッション・テスト(Regression test)とは一般に、「回帰試験」等の様に扱われる、極めてシステマチック且つ無機質な総当たりテストの様なもので、要するに作った処理の全因果関係を総当たりに実行しテストしてみようという機構です。 但し、その優位性は大きなものですが、実行コストも高く気軽に導入出来る仕組みではありません。よりまして、ここではTeamDyquemが勝手に採用している簡易的な導入例について取り上げてみたいと思います。 例えば、あるアプリが内包する全てのクラスに関してテストを施すという形は採りません。使用頻度の高い汎用的な性質を持つクラスから仕組みを割り当てていく形といたしましょう。ここではまず、算術クラスを例にあげてみます。 対象クラスは、ベクトルを扱う CVector とでもしましょう。 サンプル的な例としまして、以前のエントリー 「iPhoneアプリ作者より、ゲーム制作初心者の方へ小ネタ「2Dベクトル」」 も合わせてご覧頂けましたらと思います。 上記の様な算術系クラスによくある不具合と致しまして、浮動小数点のメンバ変数がNaN化してしまう、というシナリオが挙げられます。 NaNとは「Not a Number」の略であり、不正な演算結果として特別に定義された数値です。浮動小数点フォーマットには他にも無限大等を扱う特殊な定数が存在しますが、何れのケースにおきましても、この値が出現した段階でアプリの進行が止まるという事はなく、NaNという値を抱えたイリーガルな状態のまま処理が進行する事が通例です。 NaNとの演算結果は常にNaNであり、例えば
この様に、その構造内に一度でもNaNが現れると、以後の計算結果を次々に汚染していく事になるのです。 この手合は、経験上相当やっかいな類のバグと言えるでしょう。アプリの実行が即座に停止する様な事はありませんから、この増殖するNaNを伴って挙動に影響を与え始めます。市販ゲーム等において3Dモデルキャラクターの姿勢が奇っ怪な事になってしまうバグを見かけますが、これの原因として階層関節計算の演算仮定にて算術演算クラスの持つ潜在バグにより、関節姿勢が部分的にNaN化しているというシナリオは容疑者として有力でありましょう。 ![]() 実装 具体的には、上記例のCVector2等における、全ての代入系メソッドにて(const以外の全てのメソッド)、isnanによるNaNチェックAssertを仕込みます。 この上で、static CVector2::RegressionTest() 的なメソッドを用意。
この様に、Assertを仕込んだ内包するメソッドを全て実行するテストメソッドとして機能させ、これを起動時に毎回、メインの初期化処理から必ず実行させる様にします。 これにより例えば、何かのバグを修正した際にそれまで潜在的に眠っていたNaN化バグ等が呼び覚まされてしまったとしても、その初回の実行にてNaN化の瞬間を捕捉する事が出来、それに気がつかずに開発が進み傷を深めて行く事を防止します。 こういった機構を、よく使うクラスには出来る限り仕込んで置く事で、そのシステムの防衛力強化に貢献していく事になるでしょう。例によって、条件コンパイルによるリリース時コストフリーとする事が可能なので、最初は面倒かもしれませんが、積極的に採用する事をお勧めします。 デバッグとは本来やっかいなものではありますが、タイミング依存系のメモリ破壊系バグ等を追っていると不思議な高揚感に苛まれる事もありますよね。業務が切羽詰まっている等でなければ、実は最高にエキサイティングな思考パズルでもありますよね。 はい。強がりDEATH!暑いYO! 早く冬が来るといいなと願う。TeamDyquemでした。
![]() シリーズ記事まとめ ■Aニュース、ガジェット通信 寄稿記事 「『連載.jp』寄稿「ゲームプログラマが語る「プロ棋士に勝ったAIは、タクシー基本無料化をもたらす?」」」 「『Aニュース/ガジェット通信』寄稿「ゲームプログラマが語る ”買わない理由”がもたらす充足感と、開発者達の心理」」」 「『Aニュース/ガジェット通信』寄稿「ゲームプログラマが語る アップデート版に潜む開発者モラルハザード」」 「『Aニュース/ガジェット通信』寄稿「ゲームプログラマが語る ソフトやアプリと携帯ゲーム課金における経済行動学」」 「『Aニュース/ガジェット通信』寄稿「ゲームプログラマが語る。新しいゲーム機が定期的に生まれる理由」」 「『Aニュース/ガジェット通信』寄稿「ゲームプログラマが語る 楽しさの仕組み ゲームメカニクス」」 「『Aニュース/ガジェット通信』寄稿「ゲームプログラマが語る 3Dテレビとゲームの微妙な関係 その打開策」」 「『Aニュース/ガジェット通信』寄稿「ゲームプログラマが語る 無料アプリのビジネスモデルと舞台裏」」 「『Aニュース/ガジェット通信』寄稿「新発表ラッシュに見るクラウド大航海時代の幕開け」」 ■ゲーム制作初心者さん向け系 ゲームプログラマが語る。なんちゃってリードプログラマにはなるな!ゲーム造りで放棄してはいけない大切な事 ゲームプログラマが語る。今さら聞けないフレームレートに纏わる話。秒間60?16ミリ? ゲームプログラマが語る。「浮動小数点」と商業レベルで上手に付き合う方法 「ゲームプログラマが語る。ゲーム制作初心者の方へ小ネタ「クォータービュー入門」」 「ゲームプログラマが語る。「正しい乱数」が彩る確率世界とエンターテイメント」 「iPhoneアプリ、ゲーム制作初心者の方へ小ネタ「線分と円の交差」」 「iPhoneアプリ作者より、ゲーム制作初心者の方へ小ネタ「2Dベクトル」」 「iPhoneアプリ作者より、ゲーム制作初心者の方へ小ネタを一つ」 ■「プロのゲームプログラマとして、ゲーム製作に関する書評を」シリーズ ゲームプログラマが語る書評:「MMORPGゲームサーバープログラミング」を読んでみた ゲームプログラマが語る書評:「ゲームプログラマになる前に覚えておきたい技術」を読んでみた ゲームプログラマが語る書評:「ゲームエンジン・アーキテクチャ」を読んでみた ■個人でも出来る、マルチプラットフォーム開発関連 「ゲームプログラマが語る。iOSゲームをWinマルチプラットフォーム開発・その4」 「ゲームプログラマが語る。iOSゲームをWinマルチプラットフォーム開発・その3」 「iPhoneアプリ作者が語る。マルチプラットフォーム化その2・アトミック型定義のススメ」 「ゲームプログラマが語る。iOSゲームをWinマルチプラットフォーム開発・その1」 ■リリースしました系 「PASTEL-ORBIT/TeamDyquemアプリ第19弾。ローグライク決定版「隣人は魔王」をリリースしました。」 「TeamDyquemアプリ第18段。ご当地バトルRTS「埼玉クエスト」をリリースしました。近隣の県を滅ぼそう(*-_-*) 埼玉以外でも遊べます #47app」 「アプリ新作「ネコりす マカロン」をリリースしました」 「埼玉県ご当地アプリ、「タッチ the さいたま」をリリースしました #47app」 「アプリ新作「ひよこガーデン」をリリースしました」 「TeamDyquem新作。結構真面目なアクションパズル「ネコりす」リリース」 「iPhoneアプリ作者が、iアプリ「泡リス女子部 for iアプリ」をリリースしました」 「自作iPhoneアプリ改良版、「ネコがゴミのようだネ:アーケード」をリリースしました」 「iPhoneアプリ作者が、「まりも育成」for iモードをリリースしました」 「iPhoneアプリ新作 「ナタ・デ・ネコ」 をリリースしました」 「秋刀魚は関係ないけれど、新作「i-Wishbone」リリース」 「アプリ新作「ネコがゴミのようだ」。プロモ動画をアップしてみた」 「「泡リス 女子部」、販売開始」 「AppBankにまりも紹介記事が!」 「ゲームプログラマとして参加。ご当地47都道府県アプリプロジェクト #47app」 □ビジネス系 「ゲームプログラマが語るドコモiPhoneと、インフラから合法的に大金を抜くスキーム」 「ゲームプログラマが語る。秀丸エディタのビジネスモデル」 ■SFネタ系 「ゲームプログラマがSFを語る。意識はどこからやってきて、死んで、そして何処へ行く?」 「ゲームプログラマが語る。気の遠くなるスキもない程の、宇宙の話」 「iPhoneアプリ作者が語る。流れ星に馳せる真実」 「iPhoneアプリ作者が警笛。どこでもドアの使い過ぎには注意」 「iPhoneアプリ作者が語るSETI理論。異星人さんは何処!?」 ![]() |
||