0

所以我有一个基于 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 似乎与之前的对象没有什么不同(除了它增加了一个)。据我所知,没有什么明显的原因可以导致这次崩溃。

4

1 回答 1

0

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

它源于调用堆栈的更高级:

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

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

于 2016-07-21T05:43:02.193 回答