
昨今まれに見る飛散量を記録した本年の花粉事情もどうにか終息の目が見え始めたその矢先、 最近では暖かい日も続き、 ああ今日のそのハーフコートは少し暑いかもチョイス間違えたかもね~ ああこれはもうジャケット一枚でも暖かいよね~ 等と浮かれきった会話にも花が咲くそんな季節。
翌日気分揚々本当にジャケット一枚で出勤してみれば、唐突に訪れた昨夜の極寒、雨、暴風。 桜も散った4月の中旬にまさかの両奥歯ガチガチ手悴みで、震えながら帰宅。 翌日は風邪気味というアイデンティティ・クライシスに対処しきれないTeamDyquemで御座います。 皆様こんにちは。
暑さ寒さと言えばアレですよ。
暑さ寒さもひがんまで。 中国に古くから伝来し季節を司るとされる仏教神「比嘉(ヒガ)」。 そして、比嘉が巡礼の際に旅路を共にした愛馬「ひがん馬」。 暴虐や色欲により比嘉の怒りを買い、異常気象から不作の憂き目にあった多数の農民が、 「ひがん馬」に祈りを捧げながら、猛暑極寒の過ぎ去りを待った事が由来となった言葉です。 夏の猛暑や冬の極寒も、ひがん馬に祈りを捧げれば堪え忍びやがて新しい穏やかな季節が来る。 なんとも感慨深い意味が込められておりますね。
呼吸をするかの様に嘘を吐く。TeamDyquemで御座います。 皆様ごめんなさい。
過去エントリーより引用してまでネタを展開するのもどうかと思いますが、 さて、心ゆくまでネタさせて頂いた所で本題に入りましょう。
マルチプラットフォームネタ、前回のエントリー
→「ゲームプログラマが語る。iOSゲームをWinマルチプラットフォーム開発・その1」
にて、マルチプラットフォーム開発について触れてみました。 スクリーンショット等を交えキャッチーなエントリー構成を目指してみましたが、今回はその基礎部分。 前回に比較してやや地味ではありますが、設計思想についてお送りしたいと思います。
 全機種共通アトミック型の定義
マルチプラットフォーム開発を行う場合、アプリ内大部分のコードが全機種でビルド出来なければなりません。 「機能」を示す種々の定義を行い、その実装部分のみを機種の数だけ存在する機種依存層へ配置しますが、 フレームワークの大部分も又、全機種でビルドさせる必要が御座います。
この様に、機種非依存性について留意しながら実装を進めていくわけですが、 この時、機種間における差違について留意する事が大変重要となってまいります。
例えば「 int 」という型を例に考えてみましょう。
C言語の基本的な型でありますが、言うまでもなく符号付き整数ですね。 これが符号の付いた整数であるという定義については何ら考慮する必要はなく、 それがそうであるとして実装、運用していく分には通常問題は起こりません。
しかし、マルチプラットフォームでは事情が異なります。 例えば以下のコードにて検証してみましょう。
for( unsigned int lp=0; lp<70000; lp++ ) { printf( "%u\n", lp ); }
0から始まる数値を7万回表示するプログラムですね。 現代では大抵の機種において正しく動作致しますが、 20年前とかのコンピューターでは6万5千回を少し超えた辺りから意図しない数値へ変化します。
誰が20年前のPCを使ってるんだよ懐古厨かYO!その様に思うやもしれません。 では、以下のコードではどうでしょう。
for( unsigned int lp=0; lp<4300000000; lp++ ) { printf( "%u\n", lp ); }
昨今浸透し始めている64ビットOS対応等に向けてビルドを行った上で実行した場合は正しく動作致しますが 普通のWindows環境向けでは、カウントが43億回に到達する少し前から値に変化が生じます。
だから、誰が43億回も数を表示したがるんだYO! その様に思う気持ちも無理はありませんが、論点はそこではありません。
この問題について正しく理解する為には、機種依存、コンパイラ依存という概念を考慮しなければなりません。 この例においては「int」という型のビット長に関し、C言語が定める定義に曖昧性が存在する事へ着目します。 言わずもがな、C言語におけるintのビット長は、アーキテクチャへ準拠した上でコンパイラに依存します。 20年前の16ビットCPUを搭載したPCならば16ビット長となり、intが表現できる正の整数値の上限は65535。 昨今の32ビットWindows環境であるならば同様に32ビットとなり、intの幅は42億9496万7295まで広がります。 ですが、それぞれ7万であったり43億という数値は表現出来ません。
この問題の本質とは、その様に大きなintの数値をどう扱うか、そんな事では全く無く、 機種ぞれぞれ同様に int と表記した場合においても、 機種によっては動作に差違が生じるという事実そのものであります。
マルチプラットフォーム化という着地点を考えるならば、 この様なタイプに属する注意点が大なり小なり多数存在しており、 その全ての箇所において、言語特性を理解し正しく隠蔽、汎用化していく事が重要であります。
例えば今回のintのケースは本当に極端でありますが、理論的な対処としましては ご自身のフレームワークにおいて、「機種ごとに」以下の様なアトミック型を定義する事が合理的でしょう。
typedef signed short s16; typedef unsigned short u16; typedef signed char s8; typedef unsigned char u8; typedef signed int s32; typedef unsigned int u32;
「atomic:アトミック」とは、微細なさま、これ以上分割出来ないという意味で、 この例では数値を表す最小構成の型定義を指しています。
s16やu32等の命名ルールについてはお好みで構いませんが、ビット長を含んだ形になっている点が重要です。 古今東西どんな機種に移植したとしても、s16は符号付き16ビット整数であると保証します。 この上にこれらを用いてアプリを構築していく事で、移植性の高い堅牢な実装と運用への貢献が可能となり、 この様な基礎実装を基軸とした上で、この思想そのものをフレームワーク詳細にまで発展させていくわけです。
例えば3D系のゲームにおいて、 そのアプリのコードより「このシーンの視野角は41度である」と指示が在った場合、 その実行環境がiPhoneやWindowsであろうが、PS3であろうが、 横幅解像度がiPhoneの480ドットとPS3の1920ドットの様にどれだけ違っていようとも、 フレームワーク内部の機種依存層にてその視野角が必ず41度へ帰結する様に数式を構築する事が重要です。 画面の解像度が違おうとも、又ポリゴン数やテクスチャの精細さが機種毎に違おうとも、 「同様のシーンを、クォリティ差とは独立して同様にレンダリング出来る」事。 これがマルチフレームプラットフォーム化の絶対的な優位度であり、 合理性に貢献出来る事実であり、突き詰めればそれが唯一の存在意義でありましょう。
アプリのコードは1つだけ存在していれば良く、そのコードをiPhoneに持って行こうがPS3に持って行こうが、 各機種フレームワークはすべからく、同じアプリを全機種差違無く駆動させられなければならないという事ですね。
 次回
さて、次回は DirectXとiOSにて採用されているOpenGLES間において、 実際にポリゴンをレンダリングするコードの差違等に触れてみたいと思います。たぶん。
 備考
今回のエントリーにおきまして、64ビットOSへの移植に関する話題が少しありましたが、 例えば32ビットintと64ビットint等に関する実際の運用に関しましては、
[__w64キーワード] [/Wp64] [64ビット移植への対応]
この様なキーワードにて検索してみると、色々と調べる事が出来るかと思います。

シリーズ記事まとめ
■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理論。異星人さんは何処!?」
- 関連記事
-
Theme:プログラミング
Genre:コンピュータ
|