【发布时间】:2009-02-25 15:06:23
【问题描述】:
我目前正在开发跨平台应用程序,只是好奇其他人如何解决以下问题:
- 字节序
- 浮点支持(某些系统在软件中模拟,非常慢)
- I/O 系统(即显示、声音、文件访问、网络等)
- 当然还有大量的编译器差异
显然,这是针对诸如 c/c++ 之类的语言,它们不抽象大部分这些东西(不像 java 或 c#,它们在很多系统上不受支持)。
如果你好奇的话,我正在开发的系统是 Nintendo DS、Wii、PS3、XBox360 和 PC。
编辑
这里有很多非常好的答案,从如何自己处理差异,到图书馆建议(甚至只是放弃和使用葡萄酒的建议)。我实际上并不是在寻找解决方案(已经有一个),但只是好奇其他人如何解决这种情况,因为看到其他人如何思考/编码总是很好的,这样你就可以继续发展和成长。
这是我解决问题的方法(如果您没有从上面的系统列表中猜到,我正在开发控制台/Windows 游戏)。请记住,我所使用的系统通常没有为它们编写的跨平台库(Sony 实际上建议您从头开始编写自己的渲染引擎并只使用他们的 OpenGL 实现,这并不完全遵循无论如何标准,作为参考)。
字节序
我们所有的资产都可以为每个系统定制。我们所有的原始数据(纹理除外)都存储在 XML 中,我们在构建项目时将其转换为系统特定的二进制格式。鉴于我们是如何为游戏机开发的,我们不需要担心数据在不同字节序格式的平台之间传输(只有 PC 允许用户这样做,因此它也与其他系统隔离) .
浮点支持
大多数现代系统都可以很好地处理浮点值,但 Nintendo DS(和 GBA,但如今对我们来说几乎是一个死平台)是个例外。我们通过 2 个不同的类来处理这个问题。第一个是“定点”类(模板化,可以指定要使用的整数类型以及十进制值的位数),它实现所有算术运算符(处理位移)并自动进行类型转换。第二个是“浮点”类,它基本上只是对浮点数的一个包装,唯一的区别是它还实现了移位运算符。通过实现移位运算符,我们可以在 DS 上使用移位进行快速乘法/除法,然后无缝过渡到使用浮点数更好的平台(如 XBox360)。
I/O 系统
这对我们来说可能是最棘手的问题,因为每个系统都有自己的控制器输入、图形方法(XBox360 使用 DirectX9 的变体,PS3 有 OpenGL,或者你可以从头开始编写自己的,DS 和 Wii 有自己的专有系统)、声音和网络(实际上只有 DS 在协议上有很大不同,但它们都有自己的服务器系统,您必须使用)。
我们最终解决这个问题的方法是简单地为每个系统编写相当高级的包装器(例如,用于图形的网格、用于控制器的键映射系统等)并让所有系统使用相同的头文件进行访问.然后只需为每个平台编写特定的 cpp 文件(从而形成“引擎”)。
编译器差异
这是一件不容易解决的事情,当我们遇到编译器问题时,我们通常会在本地 wiki 上记录信息(以便其他人可以看到要注意的内容和解决方法),如果可能,编写一个宏来为我们处理这种情况。虽然它不是最优雅的解决方案,但它可以工作并且看到一些编译器在某些地方是如何简单地损坏的,更优雅的解决方案往往会破坏编译器。 (我只希望所有的编译器都实现了微软的“#pragma once”命令,比把所有东西都包装在#ifdef 里简单多了)
【问题讨论】:
标签: c++ c cross-platform