ゲームのリトルエンディアンネス


16

ゲームのプログラミングの過程でバイトオーダーを心配する必要がありますか?ゲーム機は異なるバイトオーダーを使用しますか?


1
あなたが現在取り組んでいる特定のプロジェクトや、一般的なことについて心配していますか?ほとんどの場合、コンソール用のゲームを作成している場合は、XNAなどの十分に文書化されたツールセットを使用している可能性が高く、入力と出力はそのドキュメントで説明されています。
-wolfdawn

4
あなたがこれを心配しているなら、私は本当にRob Pikeのバイトオーダーの誤acyをお勧めします - バイトオーダーを心配しようとすると、単にそれを無視して本当にエンディアンに依存しないコードを書くよりも多くの問題が発生します。

1
これは優れた読み取りですが、Robは、より複雑な書き込みを必要とする代わりに、単純化された読み取りを取得できることを示しています。あなたが書き込みを行っているのではない場合、素晴らしい!
キロタン

回答:


14

ネットワーキングコードを書いている場合、これはしばしば対処しなければならないことです。

また、ファイル形式のバイト順がプラットフォームで使用されているものと異なる可能性があるため、重要な場合もあります。


8

心配する必要がありますか?そうではない。ゲームプログラミングの大部分は、エンディアンネスが抽象化されるようなレベルになります。ネットワーキングでも、ほぼ確実にネットワーキングプロトコル用のライブラリを使用することになります。あなたがそれを知っているのは良いことですが、私はあなたがそれに関する問題にぶつかることを疑います。


5

ほとんどの場合、いいえ。

エンディアネスは通常、ゲームエンジンの高レベルモジュールで抽象化されており、日常的に心配する必要はありません。抽象化されていない場合、エンジンには重大な問題があり、修正する必要があります。これは、ゲームを作成するときに心配する必要のある詳細ではないためです。

ただし、C / C ++マルチプラットフォームエンジンの低レベルの部分で作業している場合は、対処する必要があります。3つの現行世代のコンソールはすべて、ビッグエンディアンのPowerPCアーキテクチャを使用しますが、PCで使用されるx86アーキテクチャはリトルエンディアンです。したがって、どこかから生のバイトを読み取ってデータ構造に入れるコード(バイナリシリアル化、ネットワーキングなど)で作業している場合は、そうする必要があります。

たとえば、C / C ++では、この種のバイトスワッピングが動作しているのが一般的です(テストされていないため、修正を歓迎します)。

// Assume bytes comes ordered as big-endian
u16 u16FromBytes(void* data)
{
#if BIG_ENDIAN
    return (u16(data[0]) << 8) + u16(data[1]);
#else // LITTLE_ENDIAN
    return (u16(data[1]) << 8) + u16(data[0]);
#endif
}

繰り返しますが、これは低レベルのコードでは問題ありませんが、これはどこでも使用されるべきではありません。


3

ターゲットとするプラットフォームによって異なります。たとえば、PS3はビッグエンディアンであると信じているので、それがあなたのターゲットの1つである場合、それはあなたが知っておく必要があるものです、はい。

自宅のコンピューター空間では、「Big 3」(Windows、Linux、Mac)はすべてIntel x86 / x64アーキテクチャ上で排他的または例外的にすべてであるため、エンディアンの懸念はもはや関係ありません。


もう関係ない?私の経験では(カップル企業で2〜3ゲーム、7年間、両方のMMO ...統計的に有効というよりは逸話的)、PSとXboxの各市場はWindows市場の約2倍のサイズで、Macはわずかな割合でしたWindowsの、そしてLinuxはそれよりも顕著に小さかった。ゲームが単にコンソールで機能しない場合を除き、PCにこだわり続けることで利益の80%を地上に残しています。また、クロスエンディアンコードは、サーバーがクライアントとはまったく異なるマシン上にあることを意味します(例:すべてのクライアントサーバーコンソールゲーム)。
マークストアー

@MarkStorer-私が実際に書いたものを読み直す必要があると思う。
マキシマスミニマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.