Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

改善调试环境,以及修复v8编译 #114

Merged
merged 8 commits into from
Dec 16, 2020

Conversation

yuatpocketgems
Copy link
Contributor

@yuatpocketgems yuatpocketgems commented Dec 14, 2020

这个PR含有5个commits。其中 1a28b1c 修复了v8编译中的错误。其余4个commits改善了在Unity中的调试流程。改善包括:

  • 支持.cjs文件扩展名,不再需要.js.txt
  • 支持同窗口下调试和更改源文件
  • .cjs文件被更改后,自动热重载全部JS模块,无需重启Unity Editor(或任何子系统)即可调试更改后的代码

修复v8编译

Commit: 1a28b1c

  • 使用问题:Github Actions近期更新了macos-10.15环境。新环境中默认XCode版本被升级为12.2。根据这里的提示,xcode12.2不提供chrominum/v8需要的10.15SDK。编译时会报错

  • 解决办法:在Github Workflow中设定默认xcode版本为12.0即可。

改善Unity中的调试流程

增加Unity对于.cjs文件的支持

Commit: ff24112

  • 使用问题:此前Unity中的JS文件都是.js.txt格式。这导致了几个问题:

    1. IDE (VSCode)需要额外配置才可以开启针对JS的高亮显示。
    2. 类同上述,在.txt文件中设置断点需要额外配置。
    3. 在调试过程中,v8输出的JS源文件路径与*.js.txt文件不匹配,导致VSCode自动开启新的*.js只读文件。修改代码需要切换窗口,使得开发人员效率降低。
    4. 我们(Pocket Gems, Inc.)希望使用Puerts实现Unity客户端与NodeJS后台共用源文件。如果客户端必须使用.js.txt文件格式的话,我们需要额外的过程把文件拓展名更改后打包上传到后台。
  • 解决办法:添加针对.cjs文件的自动导入工具。
    因为Puerts本身就支持CommonJS格式的模块,所以我选择不支持.mjs扩展名。
    而Unity内嵌了一个导入.js文件的工具,以继续支持2017年终止的UnityScript项目,我们无法支持.js文件格式。

改变Unity中CommonJS模块沙盒创建逻辑

Commit: 377676b

  • 使用问题:在使用旧版require逻辑调试代码时,我发现VSCode的调试窗口与源文件不同。例如,index.js文件
console.log('Hello')

在调试窗口中显示为

(function() { var __filename = '/path/to/index.js', __dirname = '/path/to', module = puerts.getModuleBySID(1), exports = module.exports; module.filename= __filename ; (function (exports, require, console, prompt) { console.log('Hello')
});

这导致VSCode判定调试文件与源文件不同,所以调试窗口为只读,继而导致调试过程中更改代码需要切换窗口、效率降低。这是参照NodeJS的格式还有VSCode调试工具源代码得出的结论。

  • 解决办法:改变modular.js中对于源文件的包装,使用NodeJS的格式
"(function (exports, require, module, __filename, __dirname) { " + script + "\n});"

然后让module.js调用C++函数。C++函数继而导出包装后形成的v8::Function并回调函数。沙盒的参数被回传。这个过程类似于NodeJS的源代码源代码2

由于我没有Unreal的环境,我并没有更改Unreal的CommonJS模块逻辑。类似的更改应该很容易移植过去,并且可以改善相同的问题。

自动热重载JS模块

Commit: a796d3a 79a66a3

  • 使用问题:调试过程中更改后的代码应该自动加载到正在运行的Unity Editor中。

  • 解决办法:添加global函数clearModuleCache,在JsEnv中增加对应函数,并且在.cjs文件自动导入时调用

其中 79a66a3 可能并不适用于所有的开发团队。请问您有没有任何意见或建议?

@chexiongsheng
Copy link
Collaborator

79a66a3 最好用条件编译宏框住,默认不开启,毕竟不是每个团队都适用。

@chexiongsheng
Copy link
Collaborator

chexiongsheng commented Dec 15, 2020

puerts支持的版本是Unity5 ~ 最新版本
在Unity 5下面没有ScriptedImporter,需要用条件编译宏
在Unity 2017下TextAsset只有无参数构造函数,先构造,然后设置text属性的兼容性更好些

@chexiongsheng
Copy link
Collaborator

chexiongsheng commented Dec 15, 2020

Commit: 377676b
要实现同样效果,好像不需要新增__tgjsEvalModule,利用__tgjsEvalScript在js测就可以完成一样的功能。
原生代码可以不改就不改。

…hain builds for arm architecture, which breaks linker step. Will need to add steps for arm specifically in the future so Unity works on the new Macs.
@yuatpocketgems
Copy link
Contributor Author

谢谢反馈。

Commit: be597aa

  • 查阅资料发现2017版本内{TextAsset}.text为只读。构建函数在2018.1版本第一次出现。所以CJSImporter内所有代码被框在了UNITY_2018_1_OR_NEWER中间。
  • 添加了ENABLE_CJS_AUTO_RELOAD宏。
  • 删除了__tgjsEvalModule.

Commit: 6bcd347
修复build和publish workflow。今天发现puerts.bundle只有1kb,dll不加载。回查编译过程发现linker error。我感觉问题是Xcode12.2默认编译目标为arm,与x86的v8库无法连接。改回Xcode12.0编译正常。
另一种可能是Github添加了新的mac mini导致编译目标架构不统一。之后Mac需要支持两个架构,但是因为暂时不需要重新编译v8而且这个问题超出了PR范畴,所以我没有深究这个问题。

Commit: 60a2368
函数名首字母大写。

TODO:

  • 添加使用说明
  • Squash commits

@chexiongsheng chexiongsheng merged commit e209cb0 into Tencent:master Dec 16, 2020
@UpUpLiu
Copy link

UpUpLiu commented Mar 22, 2021

是否有时间出一个简单的应用demo?
有尝试使用, 确实脚本本身被reload, 但是引用的地方没有变. 是否是我使用的方式不对?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants