chexiongsheng
chexiongsheng
比较重要的是IdleNotificationDeadline,一个ue项目反馈,对于一些动作类型游戏,v8的gc有时会导致能感觉出来的卡顿。这个api能够把一些gc开销放在系统空闲时做。 其次是RequestGarbageCollectionForTesting,定位问题还是比较有效的,而且主动调用Minor有时也能解决些实际的gc卡顿(虽说不推荐)。
目前的生成代码,js 传递给C#一个C#对象,需要动态获取转换器(GeneralGetter/GeneralSetter) 路径是 ~~~csharp ArgumentHelper.Get ->StaticTranslate.Get -> GeneralSetterManager.GetTranslateFunc/GeneralGetterManager.GetTranslateFunc ~~~ 优化建议 StaticTranslate的Get\Set是可以设置的,但该delegate定义目前和GeneralSetterManager.GetTranslateFunc/GeneralGetterManager.GetTranslateFunc的返回定义不一致(前者多了一个jsEnvIdx参数) 可以把GeneralSetterManager/GeneralGetterManager改为和jsEnv实例不绑定,并把GeneralSetterManager.GetTranslateFunc/GeneralGetterManager.GetTranslateFunc的返回改为和StaticTranslate的Get\Set一致,那么就可以直接赋值cache起来 好处: 1、不用每次都查找TranslateFunc; 2、GeneralSetterManager和GeneralGetterManager可以全局一份,不用每个jsEnv new一个,能减少一点内存。
目前对于生成蓝图方法的调用,都需要反射调用C++然后再通过Function.Invoke反射调用回来。 对于RPC方法,这是有必要的,对于其它方法则可能(不确定除RPC外有没其它类似必须走回引擎的方法)浪费性能。 初步修改在一个大型项目初步测试没有该功能本身的问题。 不过引发了之前该项目由于代码逻辑不严谨导致的错误。比如$Ref的传递,调用方直接用$Ref(),被调用方并未对$unref的undefined处理,这在之前(反射调用C++然后再通过Function.Invoke反射调用)的逻辑,已经自动被反射调用的栈变量赋值了个有效值。
有个项目ts_file_versions_info.json的版本号和ts文件都对的上,结果蓝图一致都不生成,也不报错。 启动的时候,尽管ts的md5对的上ts_file_versions_info.json,也看看是否蓝图和js有没在,没在就生成。如果这优化导致启动时间太长,就不优化
原因:quickjs封装用了stl,如果用动态库,可能stl版本冲突,静态库因为有静态变量的存在外加UE Editor下的编译规则,导致外部调用v8 api会崩溃 有几个解决的方案: 1、检测到是quickjs,在外部使用静态绑定就用pesapi backend,但用户自己调用v8 api还是可能崩; 2、github只编译quickjs动态库,v8的封装源码引入;
esm加载就需要顶下导出的内容,这和目前lazyload的设计相冲突。要保持lazyload,目前衡量比较合适的方案为:导出类放到全局空间。 业务代码变更:对于业务,只需要删除`import * as UE from 'ue'`即可兼容。 运行时变更:这很简单,只要把UE和CPP模块放到全局即可。 Typing变更: 经实验,貌似得把Typing/ue下的目录的文件合并(namespace貌似不能重复定义,不同文件间也不能相互引用),合并后大概如此: ~~~typescript import {$Ref, $Nullable} from "puerts" import * as cpp from "cpp" export = UE; export as namespace UE; declare...
目前代码量有点多,一些能迁出的模块就迁出去。
比如FJsEnvImpl里很多导出到js的api都是裸调v8 api实现,这的问题是:代码多;切换后端难;对html5支持也构成麻烦。
## detail | 详细描述 在这个commit里头:https://github.com/Tencent/puerts/commit/a6853226fb763afc07b258da5e72d5b94f7da901 ,由于package.json里包含了本模块*.js文件是以cjs还是esm方式加载的信息,所以调整为优先加载package.json,但这又会导致其它一些npm模块加载失败,比如这两个issue: https://github.com/Tencent/puerts/issues/1199 https://github.com/Tencent/puerts/issues/1223 要解决这问题,目前 IJSModuleLoader所定义的c++/js分工方式并不能很好的解决。估计得把逻辑完全交给c++或者完全交给js。完全在c++做会比较复杂,特别是c++解析json并不方便。所以倾向于把逻辑放到js。
## detail | 详细描述 业务有v8和quickjs backend同时并存的需求。 该需求的短期实现方案: 1、qjs模拟的v8 api的namespace改用宏定义,不定义宏默认是v8; 2、一个纯虚puerts::IJSEngine和不同实现puerts::v8::JSEngine和puerts::qjs::JSEngine 3、new JsEnv时,调用CreateJSEngine传入参数选择backend,JSEngine根据参数去new puerts::v8::JSEngine或者puerts::qjs::JSEngine; 4、对每一个plugin对C#接口,都在puerts::IJSEngine新增一个对应虚函数,实现挪动到puerts::v8::JSEngine和puerts::qjs::JSEngine 5、所有plugin对C#接口都改为接收puerts::IJSEngine参数,然后调用puerts::IJSEngine上对应的虚函数; 中长期的方案: puerts::qjs::JSEngine直接调用qjs的接口实现即可,省掉一层封装性能更优;