-1

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);
4

1 に答える 1

0

これを試して、

同期コンテキストをメソッドに渡します。

SynchronizationContext uiThread = SynchronizationContext.Current;

    public WritableBitmap GetImage(SynchronizationContext uiThread))
    {
        WriteableBitmap bitmap = null;
        var waitHandle = new object();
        lock (waitHandle)
        {
            uiThread.Post(_ => 
            {
                lock (waitHandle)
                {
                   bitmap = new WriteableBitmap(width, height);
                   System.Buffer.BlockCopy(pixelData, 0, bitmap.Pixels, 0, pixelData.Length);
                   bitmap.SaveJpeg(stream, width, height, 0, 100);
                   Monitor.Pulse(waitHandle);
                }

            }, null);

            Monitor.Wait(waitHandle);
        }
        return bitmap;
   }

そして、このメソッドを別のスレッドで呼び出します。

        SynchronizationContext uiThread = SynchronizationContext.Current;
        var result = await Task.Factory.StartNew<WriteableBitmap>(() =>
        {
            return GetImage(uiThread);
        });

コードにpixelData Your ピクセル配列を追加しませんでした。その情報をコードに渡してください。また、VSエディターでテストされていないコードを心から入力しました。誤字脱字があるかもしれませんが無視してください。これで問題が解決することを願っています。コーディングを楽しむ

于 2013-09-17T12:26:10.340 に答える