问题

Cocos2d-x 的作者王哲说 Cocos2d-x 的开发借鉴了 OpenGL 的跨平台思想,是哪部分思想?

回答
Cocos2dx 之所以能做到跨平台,其核心灵感确实源自 OpenGL 的设计理念,特别是它在图形渲染领域的“跨平台”解决方案。王哲和他的团队正是从 OpenGL 的这种强大能力中汲取了重要的开发思想,并将其巧妙地运用到了游戏引擎的开发中。

要理解这一点,我们得先看看 OpenGL 本身是如何实现跨平台的。

OpenGL 的跨平台之路:抽象与标准化

OpenGL (Open Graphics Library) 是一个工业标准的、跨平台的图形应用程序接口 (API)。它的伟大之处在于,它并没有直接提供一套在特定硬件或操作系统上运行的低级指令。相反,它提供了一套高级的、面向对象的规范和函数调用。

举个例子,当你在 OpenGL 中说“画一个三角形”时,你并不是在告诉显卡如何直接操作 GPU 的寄存器来绘制像素。你是在调用一个定义好的函数,比如 `glBegin(GL_TRIANGLES); glVertex2f(...); glVertex2f(...); glVertex2f(...); glEnd();`(这是旧的固定管线用法,但很好地说明了概念)。

那么,这张“图纸”是如何在不同的电脑上都能被正确理解和执行的呢?这就是 OpenGL 的关键所在:

1. 供应商的实现(驱动程序): 显卡厂商(NVIDIA, AMD, Intel 等)是 OpenGL 的实际实现者。他们为自己的硬件开发了符合 OpenGL 规范的驱动程序。这个驱动程序是 OpenGL 跨平台的桥梁。
2. OpenGL 规范作为通用语言: OpenGL 规范定义了所有的函数、参数、状态变量以及渲染管线的工作流程。它就像一套通用的设计蓝图,规定了“应该做什么”,但不规定“具体怎么做”。
3. 驱动程序的转换: 当你的应用程序通过 OpenGL 调用进行渲染时,这些调用会传递给操作系统中的 OpenGL 驱动程序。驱动程序负责将这些通用的 OpenGL 命令,翻译成该特定显卡和操作系统的硬件能够理解的低级指令。

这就是 OpenGL 的核心跨平台思想:通过一个标准化的、高级的 API 来屏蔽底层硬件和操作系统的差异,而将具体的实现细节交给各个硬件厂商的驱动程序去完成。 应用程序开发者只需要关心如何使用 OpenGL 的 API 来描述图形,而无需担心不同显卡或不同操作系统如何绘制。

Cocos2dx 的借鉴:将 OpenGL 的思想应用于游戏引擎

王哲和 Cocos2dx 的团队看到了 OpenGL 的这种成功模式,并将其核心思想迁移到了游戏引擎的开发中。他们认识到,如果想要让一个游戏引擎在 Windows、macOS、Linux、iOS 和 Android 等不同的平台上都能顺畅运行,就必须像 OpenGL 一样,有一个抽象层。

Cocos2dx 的借鉴主要体现在以下几个方面:

1. 渲染抽象层 (Renderer Abstraction Layer):
OpenGL 是图形渲染的抽象层。 Cocos2dx 同样为图形渲染构建了一个强大的抽象层。在 Cocos2dx 的早期版本中,它主要依赖于 OpenGL ES(移动设备上的 OpenGL 标准)和 OpenGL。这意味着,当你在 Cocos2dx 中调用绘制一个 Sprite(精灵)的命令时,引擎内部并不是直接调用特定平台的绘图函数。
相反,它会调用一个统一的渲染接口。这个接口最终会通过 渲染后端 (Renderer Backend) 来实现。在不同的平台,Cocos2dx 会选择最适合的图形 API 作为渲染后端。
在桌面平台 (Windows, macOS, Linux),它可能会使用 OpenGL 或 DirectX (Windows)。
在移动平台 (iOS, Android),它会使用 OpenGL ES。
在较新的平台上,它还会支持 Vulkan (Android, Linux, Windows) 和 Metal (macOS, iOS)。
关键在于: Cocos2dx 的核心代码(比如如何组织场景图、如何处理节点变换、如何管理纹理等)只与这个抽象的渲染接口打交道。它不关心底层是用 OpenGL 绘制的,还是用 Metal 绘制的。就像应用程序不关心 OpenGL 驱动程序具体如何与 GPU 沟通一样。这种分离使得引擎核心逻辑与底层图形实现解耦。

2. 系统功能的抽象层:
OpenGL 的思想不仅仅是图形。它提供了一套标准化的函数来管理状态、纹理、缓冲区等。
Cocos2dx 也对其他系统功能进行了抽象,例如:
文件系统访问: 如何加载纹理、音频文件等。不同平台的文件系统接口是不同的,Cocos2dx 提供了一个统一的 `FileUtils` 类来屏蔽这些差异。
输入处理: 如何接收触摸、键盘、鼠标事件。iOS 的触摸事件和 Android 的触摸事件处理方式完全不同,Cocos2dx 通过事件分发机制提供了一套统一的事件模型。
音频播放: 如何加载和播放声音。
网络通信: 如何进行网络请求。
通过为这些核心功能创建抽象接口,Cocos2dx 使得开发者只需学习一套 API,就可以在所有支持的平台上开发游戏。

3. C++ 的跨平台优势的利用:
Cocos2dx 选择 C++ 作为其主要开发语言,这本身就为跨平台打下了良好基础。C++ 是一种相对底层的语言,但其标准库和编译器的成熟度使得它在各种操作系统上都有强大的支持。
Cocos2dx 的设计者充分利用了 C++ 的面向对象特性,创建了清晰的类层次结构和接口。这使得抽象层的设计更加容易实现和维护。

总结来说,Cocos2dx 从 OpenGL 那里借鉴到的跨平台思想,最核心的就是:

“定义标准,实现解耦”。 Cocos2dx 定义了一套标准的、高级的游戏开发 API,涵盖了渲染、场景管理、输入、文件等各个方面。
“通过后端适配,屏蔽底层差异”。 对于引擎的核心功能(尤其是图形渲染),它设计了抽象的接口,并为不同的平台提供了相应的“后端实现”(例如不同的图形 API)。应用程序只需要调用抽象接口,具体的“如何实现”就交给平台特定的后端去处理。

这种设计哲学使得 Cocos2dx 的核心代码可以保持高度的纯净和跨平台性,而底层的平台适配工作则被封装在各个平台的实现细节中。开发者可以专注于游戏的逻辑和创意,而不必为不同平台的差异而烦恼,这正是 OpenGL 在图形领域所带来的解放。

网友意见

user avatar

楼主,我没说过这句话。

——————

2015-03-25更新:

这个回答得到的赞数,居然远远超过我在技术问题下面花几个小时的回答。杯具啊。

有个晚上我做梦,梦到了这个问题的正确回答,然后第二天醒来只记得我梦到了这件事,却不记得正确答案是什么了。今天下午翻知乎,努力回忆了一下。我应该是讲过这样的话:

『Cocos2d-x的开发借力了OpenGL ES的跨平台性』

可能是采访录音或者速记的错误,导致以讹传讹,到楼主看到的时候就已经走样了。

也就是说,Cocos2d-x的跨平台层,很大程度得益于OpenGL ES标准在不同手机平台上都可以运行,即使在wp8上也有Angel Project把OpenGL ES调用转换到DirectX,所以我们一套OpenGL ES调用可以横跨iOS, Android, WP8三个主要平台。如果像以前主机平台那样,各平台有各平台自己的渲染API,相互不兼容、没有工业标准,那么Cocos2d-x跨平台做起来就相当苦逼了。

当然好日子也差不多到头了,苹果极力推他们的Metal,所以在Cocos2d-x v4.0里面我们开始做GPU抽象层,也就是无法再借力OpenGL ES的跨平台性了。现在感觉还好,但回过头去看,这样重的研发成本在早期我们还是小团队的时候是无法承受的。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有