我在Visual Studio中开发(使用Windows Phone 8.1的monogame)。当我使用"在没有调试的情况下运行"它启动速度非常快,但在调试中启动非常慢(大约5分钟,不计算构建时间!)。我看到的问题(beyound慢加载外部符号)是我的应用程序加载了许多图形文件,但在加载图片之前,它搜索其高清版本,其高清和本地化版本,并且只进行了本地化。大多数文件都没有高清版本,其中一些是本地化的,有些则不是。所以在日志中我看到很多消息:
A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll
A first chance exception of type 'System.IO.FileNotFoundException' occurred in MonoGame.Framework.DLL
当然,当开始无调试时,所有调试内容都无法正常工作,应用程序启动速度很快。 检查文件是否在Content文件夹中的唯一方法是尝试打开它(TitleContainer.OpenStream)并捕获异常。所以我无法避免产生这些异常。如何以某种方式加速调试启动禁用这种愚蠢的慢速FileNotFoundException处理?
答案 0 :(得分:0)
在我遇到烦人的异常处理的情况下,我通过递归预加载文件名然后在stringlist中搜索来解决问题:
private static List<string> mContentFilenames = new List<string>();
private static void preloadContentFilenamesRecursive(StorageFolder sf)
{
var files = sf.GetFilesAsync().AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
if (files != null)
{
foreach (var f in files)
{
mContentFilenames.Add(f.Path.Replace('\\','/'));
}
}
var folders = sf.GetFoldersAsync().AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
if (folders != null)
{
foreach (var f in folders)
{
preloadContentFilenamesRecursive(f);
}
}
}
private static void preloadContentFilenames()
{
if (mContentFilenames.Count > 0)
return;
var installed_loc = Windows.ApplicationModel.Package.Current.InstalledLocation;
var content_folder = installed_loc.GetFolderAsync("Content").AsTask().ConfigureAwait(false).GetAwaiter().GetResult();
if (content_folder != null)
preloadContentFilenamesRecursive(content_folder);
}
private static bool searchContentFilename(string name)
{
var v = from val in mContentFilenames where val.EndsWith(name.Replace('\\', '/')) select val;
return v.Any();
}
更新
但仅在附加调试器时使用此代码。我低估了微软的工作人员 - 他们很乐意把你的调试变成地狱。他们的错误处理和缺少isFileExist函数使你以递归方式检查文件以实现isFileExist而没有异常,但是 - 令人惊讶 - 如果没有附加调试器,这段代码会使app静默地退出而不会出现任何异常。在应用程序崩溃之前它会检查随机数量的文件,因此问题不是特定的方法 - 它只是“无法检查多个文件”,有多少 - 不时变化。
考虑到VS在真正的WP8.1设备上启动任何(小型或大型)应用程序的50%的情况下崩溃,以及无法访问设备文件系统这一事实,想象一下如何找到根目录很困难崩溃我已经花了将近一天的时间!
顺便说一下,在使用Windows,Windows商店和Windows手机应用程序二十年后,我真的很想见到来自msft的人,只是为了看一眼。看它是什么 - 愚蠢或虐待狂?开发商,他们真的很讨厌我们吗?为什么?