所以我有一个基于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似乎与之前的对象没有什么不同(除了它增加了一个)。据我所知,没有什么可以导致这次崩溃。
答案 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是一个完全不同的实例,这意味着检查总是会失败,并且每次都会尝试创建一个新对象。