[程式] 使用UE4 Blueprint遇到的问题与解决方法

楼主: windkey (揪噜噜)   2016-11-19 12:35:42
用Unreal已经有一小段时间了
稍微分享一下自己的心得
没有经过同意还请勿无断转载 谢谢~
为了避免大家讨厌看落落长的文章,我先讲结论,如果你已经知道就可以左转离开了。
1. Circular reference在UE4是很多问题的根源,不要让你的BP有circular reference。
2. 为了效能好,BP之间的Reference越少越好。
==================落落长的本文开始==================
Blueprint(BP)是UE4最重要的技术之一
使用BP可以减少编译执行档的时间,马上改马上测试,不用频繁更新执行档等等优点。
可是大量使用BP开发的结果
应该会发现BP有几个问题会慢慢浮现:
1. 游戏效能不好,读取关卡速度慢
2. 某些BP会跳不明的错误
3. 不好用断点追bug (相较于Visual Studio)
4. 难以用版本控管Diff不同版本之间的差异
5. BP没多少节点.uasset档就上MB,甚至数十MB
6. 改名不方便,操作不慎可能会让别的BP里面断线。
这边就先来提一下至今遇过造成BP最多问题的原因之一 Circular reference。
BP在编译的时候会根据其相依关系,把有参照到的BP class递回的编译一次。
因此如果a参照到b, 而b又参照到a的话,就会形成circular reference。
Circular reference我至少遇过几种问题:
1. BP无缘无故跳错,打开重新编译没事,关掉UE4重开又跳错
2. 读取效能不好,profiling时发现某个BP读取很久
如果有以上原因,我会建议利用Reference Viewer,
好好的检查一下你的BP有没有 circular reference的现象。
如果有,建议一定要解掉。
解法大致上有几种,
其中一种是用参照interface取代直接参照;
另一种则是使用Event dispatcher在BP之间沟通;
最后一种则是以C++ class取代。
这边要注意的几个点是,如果你的interface也是用BP做的,那一样要注意循环参照。
例如a->interface b ->a,这种状况依然要避免。
单层的循环参照还好找,如果有a->b->c->d->a的循环参照,要找到就要多花时间。
当Circular reference减少的差不多之后
如果读取效能还是不好,就要考虑减少不必要的reference。
例如有些cast是不必要的,当你已经有interface之后,应该尽量使用它。
另一个改善读取速度的方向则是默认变量
有时候会在BPa的array变量默认一组模型档或是动画档
但是这个array变量却在另一个关卡设定为另一组动画档
如果这样设定的话,这个关卡在读取的时候会同时包含两串素材
这时会建议把默认的array清空。需要的动画档设定在种在关卡内的Actor。
一时之间能想到比较重要的问题跟解法是这些。
建议开发规模到一定程度之后,让C++与BP互相搭配会是比较好的使用方法。
作者: coolrobin (泳圈)   2016-11-19 13:26:00
UE4使用者推一个
作者: damody (天亮damody)   2016-11-20 00:39:00
通常还是要混用比较方便
作者: PathosCross (木偶君)   2016-11-20 01:43:00
长知识推
作者: FukadaKyoko (小毛哥)   2016-11-29 16:08:00
感谢分享

Links booklink

Contact Us: admin [ a t ] ucptt.com