MonoGame を使用して Windows Phone 8 用のゲームを作成しています。無料版では上部に広告が表示されます。広告の表示には AdRotator を使用しています。ゲームには、結果を画像として Facebook に投稿するオプションがあります。最近、テスト中に、Facebook に画像を投稿しているときにゲームが完全にフリーズすることがわかりました。デバッグ中に、そのフリーズを引き起こすコードを検出できました。このコードはモノゲームの一部です:
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);