跨平台游戏开发需要什么?

时间:2009-04-06 13:56:01

标签: c++ linux macos

我将在大约3周后开始游戏,我真的希望游戏至少在另一个平台(Linux,MacOS)上运行,但我的团队认为这是很多工作。我很乐意,但想知道我应该注意哪些东西不会移植到linux(除了特定于Windows的特定API,如DirectXsound)?

我一直在线阅读,而像sprintf_s这样的Windows“_s”功能似乎只存在于Windows上;这是正确的还是在Linux上实现的?

10 个答案:

答案 0 :(得分:6)

不,_s函数未在标准gcc库中实现。 (至少,对'sprintf_s'的包含文件进行处理时,根本没有任何内容。)

可能值得查看像boostapr这样的跨平台库来完成一些繁重的工作。

要查找的具体事项的示例:

  • 输入/输出(DirectX / SDL / OpenGL)
  • Win32 / windows.h功能(CreateThread等)
  • 在UI上使用Windows控件
  • 同步原语(关键部分,事件)
  • 文件路径(目录分隔符,根名称)
  • 宽字符实现(Windows上为16位,Linux上为32位)
  • Linux上没有MFC支持(CString等)

答案 1 :(得分:4)

如果我是你,我会使用一些可用的框架来处理平台独立性。

我和我的一个朋友写了一个3D游戏作为一个爱好项目,服务器是Java,客户端运行在Windows和Linux上。我们最终使用Ogre作为3D-Engine和OpenAL作为Sound-Engine,两者都是平台独立的,并且可以在LGPL下使用。

我唯一需要分别编写的东西是整个Socket处理,从文件系统读取配置和系统初始化。与该计划的其他部分相比,这几乎没有。

最耗时的是将整个项目设置为在Windows和Linux(或Mac)下进行编译,特别是如果您专注于一个并且偶尔检查另一个问题。如果你的团队中有一个人在生产这些问题时会定期检查这些问题,那么你也不会有太大的开销。

总而言之,与游戏本身的编程相比,如果使用的所有框架都是编写良好的平台独立系统,那么将其适应不同的平台几乎是不费力的。

答案 2 :(得分:1)

尝试封装任何非标准扩展,如DirectX,OpenGL,SDL等。然后你只需要根据平台重写这些部分。

在考虑移植之前,我也会在一个操作系统上播放它。

答案 3 :(得分:0)

对于'安全'功能:它们是非标准的,几乎是安全的:)

答案 4 :(得分:0)

Endianess是值得注意的。

Endianess是字节中位的顺序。有些平台是大端,有些是小端。

这可能会影响您的程序跨平台的方式。但这对网络通信产生的影响最大。在发送或接收网络消息之前,您必须从一个端点转换为另一个端点。

答案 5 :(得分:0)

如果你专注于游戏玩法,设计一个游戏,他们实现移植不应该特别繁琐。如果你在几个平台上同时实现它,它应该是直截了当的。

但是如果你专注于效果,设计一些你认为会“将其他人从水中吹走”的东西,并尝试将游戏创意贴在他们身上,你就注定了。

所以真的由你决定。

答案 6 :(得分:0)

对windows-apis不太了解,但我在你想要支持的所有平台上设置了每日(或提交)全自动构建系统。如果你在windows-box上开发了一些对其他东西不起作用的东西,你的构建系统应该通知你“在平台x上构建失败,请参阅logfile / attachment / whatnot了解详细信息”。它会遇到很多交叉问题。 Unittests也会有所帮助。

是否从一开始就针对多个平台是一个好主意是另一个问题。

就我个人而言,我会开始在另一个平台上开发,然后看看稍后将它移植到Windows上; - )

答案 7 :(得分:0)

请记住,您正在创建一个不依赖于任何操作系统细节的游戏模型。您的游戏取决于状态管理和不依赖于操作系统的算法。关键是要将游戏逻辑编写成没有依赖性的特定库,这意味着需要进行大量的封装。

你不应该直接调用sprintf_s你应该编写一个可以根据平台更改的例程,类或MACRO,当你可以使用可以为不同平台定制的类或typedef时,不要使用DWORD。

例如,如果您在制作足球比赛的地方,则可以在没有平台依赖性的情况下在标准C ++中完全完成投掷球,跑步,铲球,球员位置的算法。如果您的封装很好,您可以将游戏状态转储到文件中,并使用渲染程序单独显示。

答案 8 :(得分:0)

如果您真的想轻松进行跨平台开发,我建议您使用Unity之类已构建的跨平台引擎或Torque Game Builder(2D)之类的Garage Games之一。

我几乎没有任何经验,所以不能告诉你哪个更好,但Torque Game构建器演示无法解决第一个教程而没有问题,他们不会在他们的论坛中回答技术支持问题,比如他们声称这样做我可以说如果你是像我这样的游戏设计新手,请避免使用它们。关于Garage Games的重要事情应该是他们的大力支持,我看到零支持,事实上只看到了一堆,“嘿,这里有人吗?”没有答案的帖子所以我猜他们几乎放弃了支持他们的产品。

http://unity3d.com/

http://www.garagegames.com/

答案 9 :(得分:0)

我很惊讶没有人提到libSDL和OpenGL,因为大多数跨平台游戏是使用这些库编写的。

如果您的游戏是2D,则可以使用libSDL。使用它编写的游戏的一个很好的例子是The Battle of Wesnoth。 SDL在Windows上使用DirectX,它只是一个很薄的包装器。

如果您的游戏是3D游戏,请使用OpenGL。例如,Quake 3使用该库。你可以找到大量的例子和文档。当然,有许多包装OpenGL的库,所以你不必做低级的东西。看看OGRE,水晶空间等等。

至于基本的C / C ++库和函数兼容性,最好安装一些Linux,然后只运行该函数的手册页以查看它是否存在。你们可以查一查on the Internet