Read this manual in English

Build variants

打包游戏时, 需要选择你想用的引擎类型. 有三个基本类型可以选择:

  • Debug
  • Release
  • Headless

这些类型即是 Build variants

使用 Project ▸ Build 时使用的是 debug 版引擎.

Debug

此版本通常在游戏开发阶段使用, 因为它具有许多有用的调试功能:

  • 分析器 - 用于收集性能和使用计数器. 如何使用分析器参见 分析器教程.
  • 日志 - 日志开启后引擎会记录系统信息, 警告和错误. 引擎也会通过 Lua print() 功能, 原生扩展使用 dmLogInfo(), dmLogError() 之类的功能记录日志. 如何阅读日志参见 游戏和系统日志教程.
  • 热重载 - 热重载是一个强大的功能, 能让开发者在游戏运行时重新载入资源. 如何使用热重载参见 热重载教程.
  • 引擎服务 - 游戏的调试版本可以连结一些开启的 TCP 端口和服务并与之交互. 这些服务包括热重载功能, 远程日志存取和上述的分析器功能, 以及其他一些各种各样的服务. 关于引擎服务参见 开发者教程.

Release

此版本移除调试功能. 准备发布到应用商店时使用此版本. 基于以下原因不推荐发布包含调试功能的游戏:

  • 调试功能会使包体略微变大, 我们应该尽量使发布游戏包体最小.
  • 调试功能也会占用一点 CPU 时长. 这可能使用户的老机型卡顿. 在手机上增加 CPU 使用也会造成过热和电池消耗.
  • 调试功能可能会给用户暴露不应暴露的信息, 无论从安全, 作弊还是欺诈角度.

Headless

此版本没有图像和声音. 也就是说它可以 CI 服务器上进行 unit/smoke 测试, 甚至可以在云端作为服务器程序使用.

App Manifest

不但可以为引擎加入原生扩展功能, 还可以从引擎中剔除一些部分. 比如你不需要物理引擎, 就可以从应用中去除. 关于如何去除引擎功能参见 应用清单教程.

上下文组合

实际上 app manifest 有着与 extension manifest 相同的结构和语法. 这使我们能够在最终编译时为每个平台混合上下文配置.

而且, Defold 自身, 有其基础 build manifest (build.yml). 编译每个扩展时, 这些文件做如下混合:

manifest = merge(game.appmanifest, ext.manifest, build.yml)

用户可以覆盖引擎和每个扩展的默认行为. 而且, 对于最终链接阶段, 我们混合了 app manifest 与 defold manifest:

manifest = merge(game.appmanifest, build.yml)

语法

这是一个参考示例:

platforms:
    x86_64-osx:
        context:
            excludeLibs: []
            excludeSymbols: []
            libs: []
            linkFlags: []
    x86_64-linux:
        context:
            excludeLibs: []
            excludeSymbols: []
            libs: []
            linkFlags: []
    js-web:
        context:
            excludeLibs: []
            excludeJsLibs: []
            excludeSymbols: []
            libs: []
            linkFlags: []
    wasm-web:
        context:
            excludeLibs: []
            excludeJsLibs: []
            excludeSymbols: []
            libs: []
            linkFlags: []
    x86-win32:
        context:
            excludeLibs: []
            excludeSymbols: []
            libs: []
            linkFlags: []
    x86_64-win32:
        context:
            excludeLibs: []
            excludeSymbols: []
            libs: []
            linkFlags: []
    armv7-android:
        context:
            excludeLibs: []
            excludeJars: []
            excludeSymbols: []
            libs: []
            linkFlags: []
    armv7-ios:
        context:
            excludeLibs: []
            excludeSymbols: []
            libs: []
            linkFlags: []
    arm64-ios:
        context:
            excludeLibs: []
            excludeSymbols: []
            libs: []
            linkFlags: []

白名单

对于所有关键字, 我们提供白名单过滤. 这样可以避免非法路径处理和访问编译上载文件夹之外的文件.

linkFlags

可以在这里添加指定平台的编译标志.

libs

此标志仅在需要添加平台或者 Defold SDK 里的库时使用. 应用的扩展库是自动添加的, 不应在这里添加. 下面是从引擎中剔除 3D 物理的例子:

x86_64-linux:
    context:
        excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision"]
        excludeSymbols: []
        libs: ["physics_2d"]
        linkFlags: []

Exclude flags

此标志用于剔除平台上下文已经预先定义的东西. 下面是从引擎中剔除 Facebook 扩展的例子 (注意 (.*) 是帮助去掉正确元素而使用的正则表达式).

armv7-android:
    context:
        excludeLibs: ["facebookext"]
        excludeJars: ["(.*)/facebooksdk.jar","(.*)/facebook_android.jar"]
        excludeSymbols: ["FacebookExt"]
        libs: []
        linkFlags: []

所有 flags, libraries, symbols 在哪?

与其在这里列举我们不然努力把 manifest 的编辑功能加入编辑器, 让用户使用更方便.

与此同时, Manifestation 工具也会持续更新.