game-engine - 如何让复杂的游戏跨平台?

标签 game-engine multiplatform

我已经使用 OS X 大约 11 个月了,在此之前我同时使用过 Linux 和 Windows,我知道使用在所有平台(没有 Java)上运行良好的 GUI 做一些事情是多么痛苦。

我不明白的是,人们如何让《使命召唤》、《永远的毁灭公爵》或《 bat 侠阿卡姆疯人院》等游戏同时在 Windows 和 OS X 上运行。

像 DirectX 这样的库不是特定于 Windows 而在 Mac 上完全不可用吗?我猜像 Photoshop 这样的应用程序将有自己的 GUI,它是从零开始用 C++ 编写的,所以这不会像使用 3d 图形引擎那样造成那么多麻烦(我在这里错了吗?)。

我知道在 Linux 上通过 Wine 可以使一些东西正常工作,但这并不是真正的官方方式。

如何为高性能应用程序实现这种多平台性?

最佳答案

尽管 3D 图形 API 在平台之间可能会有很大差异(Mac/Linux 上的 OpenGL 与 Windows 上的 Direct3D 11 与 Xbox 360 风格的 DirectX9 与 PS3 上的 LibGCM 等),但底层 3D 硬件实际上非常相似.一般来说,游戏会有一个低级别的兼容性 API 层,它抽象了目标平台之间 3D API 之间的大部分差异,然后更高级别的渲染将构建在这个较低级别的抽象之上。这种移植到新平台的方式仅涉及移植相对较小的“驱动程序”以支持低级别兼容层,而不是移植所有更高级别的渲染代码。

开发在所有目标平台上实现高性能的跨平台游戏的现实往往比这个理想化的画面复杂一些。例如,平台差异可能会渗透并影响高级渲染决策,因为实现特定效果的最有效方法在不同平台上可能大不相同。当不同的平台可能使用不同的着色语言(GLSL、HLSL、Cg)时,以高效的跨平台方式处理着色器也可能相当复杂。

在开发时考虑到控制台的游戏往往已经有一个复杂的 Assets 管道,它采用艺术家创作的源 Assets (纹理、模型、动画、 Material 定义等)并将它们预处理为最适合的原生格式在控制台上加载和渲染。许多平台差异可以在管道中处理,其中代码只需在 PC 上运行,对性能和内存限制的关注不太重要。

这种方法允许内容创建者开发他们的大部分内容,而不必担心平台特定的细节,并使游戏运行时不必处理格式转换、字节顺序差异等。目标平台上的图形驱动程序层可以相当精简并且只需要处理原生纹理格式、顶点数据、着色器等,而在开发系统(通常是高端 PC)上的管道代码中处理的格式之间转换的大部分复杂性。

开发跨平台游戏是一项相当复杂的挑战,但通过仔细设计抽象层和 Assets 管道,可以使大部分游戏运行时代码平台不可知,并将代码的平台特定部分隔离到某些明确定义的部分模块。

现在许多游戏都是使用 Unreal 或 Unity 等第 3 方引擎开发的,它们已经完成了处理平台差异的大量艰苦工作,并允许游戏创作者较少关注处理平台差异的细节,而更多地关注开发他们的特定游戏。

关于game-engine - 如何让复杂的游戏跨平台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8013218/

相关文章:

java - 为什么这会抛出 NullPointerException?

algorithm - 在有障碍物的连续大 map 上寻找路径

java - 在java中获取 'program files'的通用方法?

Linux 上的 Python 模块 win32com

c++ - 使用非平凡的构造函数初始化 union

game-engine - 任何代码示例开源引擎,或开源六角瓷砖游戏,编写基于六角瓷砖的游戏的引用?

java - JFrame 中的游戏逻辑

c++ - 使用 C++ AI 引擎和 ASP.NET C# 页面的纸牌游戏

java - 当您不是 Kotlin Multiplatform 项目时,是否有一种干净的方法可以在 Gradle 中声明多平台依赖项?

kotlin - 无法在 Android Studio 的 Kotlin 多平台中运行 iOSApp