工作记录-WASM streaming instantiate以及删除引擎默认资源

2019-02-27 12:30:00

在较老版本的 Unity 上使用 WASM streaming instantiate

背景

项目用的是 Unity 2018.2.12f1,这个版本使用的 emscripten1.37.33Unity 在这个版本的 WebGL Support 中有 ItegrateWasm.js 这样一个源文件,用来覆盖 emscriptenwasm 默认加载方式。文件头部有如下注释

// The following code overrides the default Emscripten instantiation of the WebAssembly module
// as a workaround for incorrectly initialized Runtime object properties
// (module export is not available at launch time if the module is compiled asynchronously).
// This file should be removed as soon as this bug is fixed in Emscripten.

我理解的意思是如果使用 WASM streaming instantiateasynchronously compile,会带来 bug。具体是什么 bug 我没有验证。

Unity 2019.1.0b2 版本中更新 emscripten,去掉了 ItegrateWasm.js,也就是说支持了使用 emscripten 的默认方式:不提前加载 wasm 文件放到 Moduel['wasmBinary'],通过实现 Module['locateFile'] 提供URL,让 emscripten 调用 WebAssembly.instantiateStreaminghttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming

处理方法

  • 确定 Unity 安装目录,这里我们用 /path/to/unity 代替
  • 删除 /path/to/unity/Editor/Data/PlaybackEngines/WebGLSupport/BuildTools/prejs/IntegrateWasm.js
  • 正常编译发布 WebGL 平台
  • 修改 UnityLoader.js(加入 Module['locateFile'] 函数,参考 Unity 2019.1.0b2
    var unityInstance = {
      // ...
      Module: {
        // ...
        locateFile: function(url) {
          return "Build/".concat(url == "build.wasm" ? this.wasmCodeUrl : url);
        },
      },
      // ...
    };

  • xxxx.wasm.code.unityweb 文件重命名为 xxxx.wasm
  • xxxx.jsonxxxx.wasm.code.unityweb 修改为 xxxx.wasm
  • nginxmime.types 配置文件新加一行(让浏览器 mime 类型判断通过)

    application/wasm                      wasm;

  • nginxnginx.conf 配置文件在正确位置加入下面的配置(让浏览器来解压)

    location ~ .+\.(unityweb|wasm)$ {
        add_header 'Content-Encoding' 'gzip';
    }

去掉游戏发布后包体中 Unity 引擎默认资源

背景

Unity 引擎有许多自带资源,分为以下三类

  • unity default resources:一定会发布到包体中
  • unity_builtin_extra:根据使用情况,会进行裁剪
  • unity editor resources:编辑器使用

项目因为对于首包大小十分敏感,并且有一些 unity default resources 中的资源并没有使用,所以希望裁剪 unity default resources 中的资源。这里另外提一句,unity default resources 这个包里面有 Unity 自己的 Splash Texture,还有各种版本的 logo。其实这部分资源,大部分游戏都不会用到。

处理方法

  • 确定 Unity 安装目录,这里我们用 /path/to/unity 代替

  • Runtime.7z 解压到Unity安装目录同级目录,这里我们用 /path/to/unity_parent 代替

    Runtime.7z 属于源码的一部分,这里就不提供了,有需要的可以网上找 Unity 4.3 的代码,或者自己用 AssetStudio 解包导出

  • /path/to/unity_parent 目录下新建文件夹,名称 Editor Unity 源码中有路径判断,所以 RuntimeEditor 一定要存在并且与安装目录同级(默认是 C:\Program Files

  • 运行命令


    "/path/to/unity/Editor/Unity.exe" -cleanedLogFile "/path/to/log/clean_builtin_resources.log" -logFile "/path/to/log_folder/builtin_resources.log" -batchmode -forceFullStacktrace Assert -forgetProjectPath -nographics -force-gfx-direct -projectpath ”/path/to/unity_parent/Runtime/Resources“ -buildBuiltinUnityResources -outputpath ”/path/to/output“ -quit
命令中的 `/path/to/log` 目录是临时log保存的目录,可以自定义。

命令中的 `/path/to/output` 目录是 `asset bundle` 输出的目录,可以自定义。

注意目录一定要保证存在并且正确。
  • Unity 打开 /path/to/unity_parent/Runtime/Resources 工程,删除 Assets 目录下不用的资源 一定要先运行 batch 命令,让 Unity 处理好资源之后再打开工程,主要是 Arial.ttf 这个字体文件的材质的Shader路径的问题。另外删除资源不能删除 Arial.ttf 和与其配套的 Font.shader,因为引擎代码中有判断。

  • 用命令重新打包

  • /path/to/output 目录下的 asset bundle 拷贝覆盖掉对应平台的 unity_default_resource 文件

    例如 /path/to/output/resources_webgl 覆盖 /path/to/unity/Editor/Data/PlaybackEngines/WebGLSupport/BuildTools/data/unity_default_resource

Update

Runtime 文件夹在编译完 Asset Bundle 之后要重命名,否则会导致 Unity Editor 打开找不到 GUI shader,整个编辑器显示粉色

Unity 有一些“规则”写死在代码里,真的很无奈