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

时间:2016-07-21 03:44:26

标签: c++ raknet

所以我有一个基于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,但第三个NetObjects总是在SetNetworkID内崩溃:

Assertion Failed! nio->GetNetworkID()!=rawId

使用以下callstack:

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

1 个答案:

答案 0 :(得分:0)

所以我想出了问题 - 错误被抛出,因为我试图添加一个与已添加的网络ID相同的对象。

它源于调用堆栈的进一步上升:

private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e)
        {

            FileInfo fileInfo = new FileInfo(e.FullPath);
            string strFileExt = fileInfo.Extension;

            // filter file types 
            if (Regex.IsMatch(strFileExt, @"\.png|\.jpg", RegexOptions.IgnoreCase))
            {
                //here Process the image file 
                try
                {
                    using (Bitmap test = new Bitmap(Bitmap.FromFile(e.FullPath)))
                    {
                        //Do your code here.
                    }
                }
                catch (Exception error)
                {
                    Console.WriteLine("File Error");
                }
            }


        }

        private void Form1_Load(object sender, EventArgs e)
        {
            fileSystemWatcher1.Path = @"C:\Users\Christlin\Desktop\res";

            //To Prevent duplicated calling of changed event
            fileSystemWatcher1.NotifyFilter = NotifyFilters.FileName | NotifyFilters.Size;
        }

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