一、起因
今天被UE4
坑惨了,收到个bug单,偶发来回改名后,无法改回原名,重新登录后可继续修改回原名字。那么可能是DS同步到客户端之后值没有set进去,或者干脆没有同步给客户端,但这怎么会偶发呢?
废了很大劲,才找到稳定复现的办法[这是最艰难的一步],名字AB改成ab。然后再次改成AB的时候,就改不了了,说是名字没变。断点了一下还真是没有同步给客户端[裂开],客户端本地存的还是AB。
可能在我的常识里面c
、c++
、go
、rust
等编程语言的字符串比较默认就是区分大小写的,所以以为UE的FString
的比较运算符是区分大小写的。直到今天才知道老版本的UE4
,FString
竟然默认不区分大小写,真的是绝了,要不要这么坑。
代码如下
// Engine/Source/Runtime/Core/Public/Containers/UnrealString.h
FORCEINLINE friend bool operator==(const FString& Lhs, const FString& Rhs)
{
return Lhs.Equals(Rhs, ESearchCase::IgnoreCase);
}
二、字符串同步(Replication)是否受此影响?
同步机制本身不关心operator==
的实现,它直接比较二进制数据(或调用NetSerialize
)。
但属性同步的触发条件(如UPROPERTY(Replicated
)的脏值检查)可能会依赖operator==
,因此:
i.如果operator==
被改为IgnoreCase
,则"AB"
和"ab"
会被视为相同,不会触发同步。
ii.如果保持默认CaseSensitive
,则"Hello"
和"hello"
会被视为不同,会触发同步。
三、RPC(远程过程调用)参数传递
RPC
参数直接传输字符串的二进制数据,保留原始大小写,不受operator==
影响。
四、查看新版本
查看了新版本UE5.3+,已经是默认区分大小写了。
// Engine/Source/Runtime/Core/Public/Containers/UnrealString.h
FORCEINLINE friend bool operator==(const FString& Lhs, const FString& Rhs)
{
return Lhs.Equals(Rhs, ESearchCase::CaseSensitive);
}
五、总结
乐观一点,UE的坑真的是踩一个就少一个[狗头]!
大家如果有基于UE的开发的话,可以检查下自己的版本是否区分大小写,这玩意儿是真的坑了。
关于
本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/article/ue4-case-sensitive/
Thank you!
------from ProLightsfx
如果你对推荐系统、游戏开发、C++优化、程序员成长等感兴趣或者想参与讨论的话,欢迎关注笔者公众号.
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://www.prolightsfxjh.com/article/ue4-case-sensitive/
共有 0 条评论