因此,Native Client 可以从浏览器运行 C++ 代码,而且我知道NX 引擎 是从 C++ 构建的,并且可以进行调整以在 Android 上运行。那么,如果 NX 引擎可以运行 Cave Story,并且理论上可以在本机客户端中运行,那么您如何让它工作和托管,以便人们可以访问页面并在浏览器中玩游戏?
2 回答
要将 NXEngine 移植到 Native Client,您需要移植 NXEngine 本身(当然!)以及它的依赖项。让我们考虑它们中的每一个:
- SDL已经移植,但可以使用更新,因为移植落后了几个版本。它位于http://code.google.com/p/naclports/source/browse#svn%2Ftrunk%2Fsrc%2Flibraries%2FSDL-1.2.14
naclports
的社区存储库中(请参阅下面的注释)。naclports
- SDL_ttf需要移植,包括它的依赖项,据我所知,这只是 freetype
- freetype已被移植并驻留在http://code.google.com/p/naclports/source/browse#svn%2Ftrunk%2Fsrc%2Flibraries%2Ffreetype-2.1.10的 naclports 中。
移植到 Native Client 非常类似于移植到一个新的——在很多方面更像是 Linux——操作系统。但是,有一些重要的区别:
Native Client 的“操作系统”API 是 Pepper,或 PPAPI,一组提供对浏览器功能的访问的 API。大部分移植工作通常是让您的代码使用 Pepper API 来打开文件、显示图形、播放声音等(不过,SDL 使输入、声音和图形变得更加容易)。要打开文件,人们经常使用
nacl_mounts
一个封装了 Pepper File API 的库,这样就可以将应用程序的 HTML5 Web Storage 或 Web 上的 URL 作为文件系统挂载,然后使用熟悉fopen
的 ,fread
等。来自 Pepper 25,部分nacl_mounts
包含在 NaCl SDK 中。Native Client 模块不能使用本机操作系统调用,也无法访问主机文件系统。这是出于安全原因并确保可移植性。
Pepper 目前没有非实验性的字体 API。因此,所有字体渲染都必须在您的代码中完成,并且任何
.ttf
文件都必须作为应用程序的一部分提供,因为 Native Client 将无法访问.ttf
. 出于安全原因,主机系统上的文件。
推荐使用 Chrome/Pepper 25:从历史上看,Pepper API 调用只能从主线程进行。这需要对游戏和其他多线程程序进行重大重构,例如,在一个线程上渲染并在另一个线程上播放音乐。从 Chrome 25 起,此限制不再存在。有关详细信息,请参阅https://developers.google.com/native-client/dev/peppercpp/classpp_1_1_message_loop。以 Chrome 25 或更高版本为目标,因此使用 NaCl SDK 的 Pepper 25 版本可能会减少此类应用程序的重构工作量。
在网页上运行 Native Client:问题提到可以“访问页面并在浏览器中玩游戏”。重要的是要知道此时只有 Chrome 支持 Native Client。当前一代 Native Client 和即将推出的 Portable Native Client 之间还有一个重要区别,后者要求将 Web 应用程序放在 Chrome Web Store 中才能运行 Native Client,后者将允许在任何网页上显示 Native Client 内容。为了让网页上的访问者能够以最少的弯路使用基于 NaCl 的当前一代应用程序,Chrome 网上应用店内联安装(请参阅https://developers.google.com/chrome/web-store/docs/inline_installation)可以避免用户需要去 Chrome 网上应用店。
关于naclports
: naclports
的注释是 Native Client 的基于社区的存储库。它包含几个库和以前的端口。naclports
您可以在http://code.google.com/p/naclports/source/browse/trunk/src/libraries/中查看库列表。虽然它包含有关如何进行移植的有用示例,但它naclports
不适合胆小的人,因为它经常损坏并且 - 鉴于它是在志愿者/尽力而为的基础上维护的 - 可能需要时间来修复。
其他提示:*此答案中有一些其他提示和指南提示:Google Chrome Extension using NaCL with an external library。
有趣的是,我已经移植了它!它真的不需要太多改变(但我还是做了很多改变)。
我有一段时间没有尝试重新编译它,所以它可能已经坏了。也许我会花一些时间尝试让它再次工作...... :)