我正在使用 MonoGame 为 Windows Phone 8 构建游戏。它的免费版本将在顶部有广告。我使用 AdRotator 来展示广告。游戏可以选择将结果作为图像发布到 Facebook。最近,在测试时,我发现游戏在将图像发布到 Facebook 时完全冻结。在调试期间,我能够检测到导致冻结的代码。此代码是 MonoGame 的一部分:
var waitEvent = new ManualResetEventSlim(false);
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
var bitmap = new WriteableBitmap(width, height);
System.Buffer.BlockCopy(pixelData, 0, bitmap.Pixels, 0, pixelData.Length);
bitmap.SaveJpeg(stream, width, height, 0, 100);
waitEvent.Set();
});
waitEvent.Wait();
因此,MonoGame 线程正在等待设置waitEvent,但 BeginInvoke 未调用操作。当没有 AdControl 时,一切都很好,所以对我来说,AdRotator 和 MonoGame 似乎在某种程度上发生了冲突,但我真的不明白为什么会发生这种情况。
UPD:从上面调用代码的代码示例
RenderTarget2D renderTarget = new RenderTarget2D(ScreenManager.GraphicsDevice, width, height, false, SurfaceFormat.Color, DepthFormat.Depth24);
ScreenManager.GraphicsDevice.SetRenderTarget(renderTarget);
ScreenManager.GraphicsDevice.Clear(Color.White);
SpriteBatch spriteBatch = ScreenManager.SpriteBatch;
spriteBatch.Begin();
// drawing some graphics
spriteBatch.End();
ScreenManager.GraphicsDevice.SetRenderTarget(null);
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var stream = store.OpenFile(FacebookShareFileName, FileMode.Create, FileAccess.ReadWrite))
{
renderTarget.SaveAsJpeg(stream, width, height);
}
}
所以游戏冻结
renderTarget.SaveAsJpeg(stream, width, height);