This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. 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 工具也会持续更新.