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]
tuo.chen
(tuo.chen)
3
抱歉这么久才回复,这个问题在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]