请教一下关于C++注册非DYNAMIC_DELEGATE回调的问题 #1486
Replies: 3 comments
-
目前提供的所有c++调用脚本的方式传闭包都会持有闭包的引用不会释放,这是最最基本的东西。 |
Beta Was this translation helpful? Give feedback.
-
测试了一下发现我描述有问题,产生问题的原因还和FJsObject有关系。在使用UMG的ListView的时候为了方便,包装了一个统一的UObject去持有一个FJsObject。这样在AddItem的时候能直接Add一个纯粹的JS对象进去。 大概代码如下。
然后崩溃发生在这个std::function被Invoke的时候,FJsObject拷贝的过程中。 想求教一下是不是使用和理解上有什么问题,导致了这个崩溃的产生。 |
Beta Was this translation helpful? Give feedback.
-
你试试更新下:67615a1 |
Beta Was this translation helpful? Give feedback.
-
我看文档中到注册非DYNAMIC_DELEGATE有几种方法,包括:
使用std::function注册的时候,发现如果构造闭包传递给C++,然后通过AddLambda的方式注册给一个非DYNAMIC的回调。延迟一段时间后再触发回调的话,比较容易产生崩溃;感觉是C++持有的std::function对象并不会持有这个闭包的生命周期。
Unreal中有很多非DYNAMIC的事件(特别是GAS中),它们通过各种AbilityAsync让蓝图能调用。因此想非DYNAMIC的回调能否安全的通过C++绑定封装给JS。
否则的话得为这些每个回调再封装一个DYNAMIC_DELEGATE,类似ULatentActionState这样再来做一个代理中转,总感觉会比较麻烦而且有损性能。
不知道能否JS传递一个闭包给到C++,然后给注册给一个非Dynamic的Delegate,能持有或者不持有(AddWeak)生命周期的方法?
Beta Was this translation helpful? Give feedback.
All reactions