蓝图中修改包含位域的结构体,在 iOS Shipping 包体中出现数据错乱

C++ 位域结构体在蓝图中使用时,在特定平台(iOS Shipping)上出现数据错误的问题。

如下图, 延迟后修改NavAgentProps中使用Bitfield定义的某个Bool值. 发现其他的Bool值也会被修改.

[Image Removed]

​以下是附近测试工程里的表现:

正常情况 (编辑器):

​ [Image Removed]

​iOS 14 Shipping 异常情况:

[Image Removed]

这个操作在 Windows (Editor/Development/Shipping) 和 iOS 14 (Development) 上表现完全正常。但是,在 iOS 14 (Shipping) 包体中,结构体内的大量位域成员会被错误地重置为 false。

同时测试发现, 使用 “Set​ Boolean(by ref)” 的方式更新Bool值, 不会触发该问题.

[Attachment Removed]

测试工程

[Attachment Removed]

抱歉这么久才回复,这个问题在5.7中修复了。

不只是ios14的问题,应该是编译器的一些行为。

bool NewValue = 0;
 
	// evaluate the r-value for this expression into Value
	Stack.Step( Stack.Object, &NewValue ); // 传入的是bool值,输出自动变成了0/1,实际上需要的uint8 bitfield
	if( BoolAddr )
	{
		checkSlow(CastField<FBoolProperty>(BoolProperty));
		if (BoolProperty->HasSetter())
		{
			check(PropertyContainer != nullptr);
			BoolProperty->SetValue_InContainer(PropertyContainer, &NewValue);
		}
		else
		{
			BoolProperty->SetPropertyValue(BoolAddr, NewValue);
		}
	}

可以使用下面的提交修复

https://github.com/EpicGames/UnrealEngine/commit/d14343859e758e73a32181a7238db7473a1997c6

https://github.com/EpicGames/UnrealEngine/commit/0c8995fc6242767c6d36f3f83a6df94d35ebabf6

[Attachment Removed]

好的. 感谢回复!

[Attachment Removed]