为什么RakNet的SetNetworkID导致断言失败?

Why is RakNet's SetNetworkID causing an assert to fail?

本文关键字:断言 失败 RakNet SetNetworkID 为什么      更新时间:2023-10-16

所以我有一个基于RakNet的NetworkIDObjects创建对象的工厂。如果它是权威,那么它将只创建一个新对象,否则它将创建对象,然后设置Net 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似乎与以前的对象没有什么不同(只是增加了一个)。据我所知,没有任何明显的原因可以导致这次坠机。

所以我发现了问题-抛出错误是因为我试图添加一个与已经添加的对象具有相同NetworkID的对象。

它源于更上层的调用堆栈:

    auto netObject = m_NetworkIDManager->GET_OBJECT_FROM_ID<CNetObject *>(networkId);
    if (netObject == nullptr)
    {
        netObject = m_NetObjectFactory->Create(netObjectType, false, networkId).get();
    }

我检查对象是否存在,如果不存在,我就继续创建它。问题是这段代码中引用的NetworkIDManager是一个完全不同的实例,这意味着检查总是失败,每次都会尝试创建一个新对象。