游戏中的大小顺序


16

在编写游戏的过程中,我们是否需要担心字节顺序?游戏机使用不同的字节顺序吗?


1
您是否正在关注您正在从事的特定项目,或者只是在总体上?通常,如果您正在为游戏机编写游戏,则可能会使用一些文档齐全的工具,例如XNA,其文档中将涵盖输入和输出。
wolfdawn 2012年

4
如果您对此感到担心,那么我真的推荐Rob Pike的“字节顺序谬误” -尝试担心字节顺序通常会给您带来更多麻烦,而不仅仅是忽略它并编写与字节序无关的代码。

1
这是一本不错的书,但是罗伯(Rob)展示了您可以获得简化的书,但需要更复杂的书。如果您不是从事写作的人,那太好了!
Kylotan 2012年

Answers:


14

如果您正在编写网络代码,这通常是您必须处理的事情,是的。

同样,文件格式中的字节排序可能不是您的平台所使用的,因此有时在那里也很重要。


8

您不必为此担心吗?可能不会。绝大多数游戏编程的水平都将抽象掉字节序。即使在网络中,您几乎肯定也会使用网络协议库。您知道它很好,但是我怀疑您会遇到问题。


5

大多数时候,没有。

Endianess通常是在游戏引擎的高级模块中抽象出来的,您不必每天为此担心。如果不进行抽象处理,则引擎将出现严重问题,应予以修复,因为这不是您制作游戏时应担心的细节。

但是,如果您正在处理C / C ++多平台引擎的某些低级部分,则可能必须处理它。当前的三个控制台都使用PowerPC架构,即big-endian,而PC上使用的x86架构则是little-endian。因此,如果您正在处理一些从某处读取原始字节以将其放入数据结构中的代码(二进制序列化,联网...),那么您将不得不对其进行处理。

例如,在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是高端产品,因此如果这是您的目标之一,那么您需要意识到这一点,是的。

如今,在家用计算机领域中,“大三巨头”(Windows,Linux,Mac)完全或非常出色地在Intel x86 / x64架构上,因此对持久性的关注不再相关。


不再相关?以我的经验(在一家夫妻公司和7年中有2-3款游戏,这两个MMO ...都是轶事而不是统计有效的),每个PS和Xbox市场大约都是Windows市场的两倍,而Mac仅是一小部分Windows,Linux明显小于Windows。除非您的游戏根本无法在控制台上运行,否则您坚持使用PC可以将80%的利润留在地面上。跨字节序代码还意味着您的服务器可以与客户端位于完全不同的计算机上(例如:以往的每个客户端-服务器控制台游戏)。
Mark Storer

@MarkStorer-我认为您需要重新阅读我实际写的内容。
Maximus Minimus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.