ue4 Encountered %d object(s) breaking Disregard for GC assumptions

16 篇文章 0 订阅

今天遇到一个奇怪的崩溃Bug,具体的崩溃log如下:

[2019.04.19-02.36.16:128][618]LogGarbage: Warning: 
Disregard for GC object Monatge_ON_AnimNotify 
/Game/_AI/BT/Task/AI_Random/W2_Stand_Relaxed_Unjam_Montage.W2_Stand_Relaxed_Unjam_Montage:
Montage_ON_AnimNotify_0 referencing Pirate_02_C /Game/Maps/MyMap.MyMap:PersistentLevel.Pirate_02_C_0 which is not part of root set

[2019.04.19-02.36.16:128][618]LogGarbage: Warning: 
Disregard for GC object Monatge_ON_AnimNotify 
/Game/_AI/BT/Task/AI_Random/W2_Stand_Relaxed_Unjam_Montage.W2_Stand_Relaxed_Unjam_Montage:
Montage_ON_AnimNotify_0 referencing ShooterAIController /Game/Maps/MyMap.MyMap:PersistentLevel.MonsterAIController_1 which is not part of root set

Script Stack (0 frames):

Fatal error: [File:I:\Work\UnrealEngine\Engine\Source\Runtime\CoreUObject\Private\UObject\GarbageCollectionVerification.cpp] [Line: 131] 
Encountered 2 object(s) breaking Disregard for GC assumptions. Please check log for details.
MyGame.exe 已触发了一个断点。

仔细分析崩溃log,大体意思是忽视GC Object Monatge_ON_AnimNotify,Monatge_ON_AnimNotify引用的Pirate和ShooterAIController不是root set的一部分。

根据此线索,应该是Monatge_ON_AnimNotify代码出了问题,Monatge_ON_AnimNotify代码如下:

UCLASS()
class UMontage_OFF_AnimNotify : public UAnimNotify
{
	GENERATED_BODY()
	
	UFUNCTION()
	virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation) override;

private:
	UPROPERTY()
	class AShooterBot* My_Bot;

	UPROPERTY()
	class AShooterAIController* My_Ctrl;
};

这是一个AnimNotify,其中用到了AShooterBot是Pirate的基类,

这时候问题已经很明显了,由于My_Bot和My_Ctrl属性有UPROPERTY()修饰,导致UMontage_OFF_AnimNotify被析构时,会检测被标记为UPROPERTY的UObject,这个地方其实My_Bot和My_Ctrl作为Notify内部的成员变量就可以了,这样问题就解决了

 

PS:此处还一处改法,此处之所以会检测,是因为在VerifyGC

有个命令行启动参数-NoVerifyGC,可以忽略VerifyGC,当然,不建议这么修改

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值