所以我有一个基于 RakNet 的 NetworkIDObjects 创建对象的工厂。如果是权限,那么它只会创建一个新对象,否则它将创建对象然后设置网络 ID:
std::shared_ptr<CNetObject> CNetObjectFactory::Create(int netObjectType, bool IsAuthority, RakNet::NetworkID networkID) const
{
auto entry = m_RegisteredObjects.find(netObjectType);
auto clone = std::shared_ptr<CNetObject>(entry->second->Clone());
clone->SetNetworkIDManager(m_NetworkIDManager.get());
if (IsAuthority)
{
clone->SetAuthority();
}
else if (networkID != 0)
{
clone->SetNetworkID(networkID);
}
return clone;
}
这对于在客户端生成的前几个 NetObjects 工作正常,但第三个总是在 SetNetworkID 中崩溃:
Assertion Failed! nio->GetNetworkID()!=rawId
使用以下调用堆栈:
MyApp.exe!RakNet::NetworkIDManager::TrackNetworkIDObject(class RakNet::NetworkIDObject *) Unknown
MyApp.exe!RakNet::NetworkIDObject::SetNetworkID(unsigned __int64) Unknown
MyApp.exe!CNetObjectFactory::Create(int netObjectType, bool IsAuthority, unsigned __int64 networkID) Line 42 C++
我在其他任何地方都找不到有关此错误的任何信息,也无法弄清楚这个特定对象有什么不同。NetworkID 似乎与之前的对象没有什么不同(除了它增加了一个)。据我所知,没有什么明显的原因可以导致这次崩溃。