1

私は Windows 10 の 2D ボード ゲームに取り組んでいます。このゲームでは、144 個の動くオブジェクトが 36 個の動かないオブジェクトと衝突する連鎖反応が発生することがあります。これは考えられる「最悪」の状況です。

すべての動くゲーム オブジェクトは、動かないゲーム オブジェクトによって作成されます。動かないゲームオブジェクトは動くゲームオブジェクトを「撃ち」、他の動かないゲームオブジェクトと衝突すると何かが起こります:)

XAML オブジェクト (UserControls) を移動するためにストーリーボードを使用し、CompositionTarget.Rendering に基づいてゲーム ループとの衝突をチェックしています。

私の PC ではすべて問題なく動作しますが、電話でこの効果を作ろうとすると問題が発生します。

私のゲーム ループは次のようになります。

foreach (var movingGameObject in GameCanvas.Children.OfType<MovingGameObect>())
        {
            if (movingGameObject.Visibility == Visibility.Visible)
                CheckCollision(movingGameObject);
        }

CheckCollision メソッドは次のようになります。

        var left = Canvas.GetLeft(movingGameObject);
        var top = Canvas.GetTop(movingGameObject);
        var right = left + movingGameObject.Width;
        var bottom = top + movingGameObject.Height;

        // If left Canvas - remove
        if (left <= 0 || right >= GameCanvas.ActualWidth || top <= 0 || bottom >= GameCanvas.ActualHeight)
        {
            RemoveMovingGameObject(movingGameObject);
            return;
        }
        else
        {
            // Since it can go 4 ways - I check if it moves up, down, right or left
            if (movingGameObject.Way == Way.Left)
            {

                for (/* this is being done max 5 times, I checked it. It gets every possible game object id that may be on the way of moving game object */)
                {
                    if (this._gameObjects[i].IntersectsWith(movingGameObject))
                    {
                        RemoveMovingGameObject(movingGameObject);
                        GameObjectHit(this._gameObjects[i], null);
                        return;
                    }
                }
            }
            else if (movingGameObject.Way == Way.Right)
            {
                //SAME HERE
            }
            // SAME FOR UP and DOWN
        }

GameObjectHit メソッドは、動かないゲーム オブジェクトが別の動くゲーム オブジェクトなどを撃つ必要があるかどうかをチェックします。したがって、これが非常に悪いシナリオの場合、ゲーム ループの繰り返しで衝突をチェックし、場合によっては別の動くオブジェクトを生成してそれを撃つ必要があります。 .

そして IntersectsWith メソッド:

        var x1 = Canvas.GetLeft(this);
        var y1 = Canvas.GetTop(this);
        var r1 = new Rect(x1, y1, this.ActualWidth, this.ActualHeight);

        var x2 = Canvas.GetLeft(mgo2);
        var y2 = Canvas.GetTop(mgo2);
        var r2 = new Rect(x2, y2, mgo2.ActualWidth, mgo2.ActualHeight);

        r1.Intersect(r2);

        if (!r1.IsEmpty)
            return true;
        else
            return false;`

ああ、ほとんど忘れていました。電話で何が起こっているのですか?ゲーム ループが十分な回数呼び出されておらず、衝突を十分にチェックしていません (動いているオブジェクトが動いていないオブジェクトを通過するだけです)。

パフォーマンスを微調整するために、できる限りのことを試みました。Windows 10 Mobile はベータ版であり、より高速になることはわかっていますが、ゲームループが熱くなると毎秒 2 回呼び出されるため、システムの障害ではありません。

4

1 に答える 1

0

将来この問題に苦しむ人へ: はい - これは XAML ベースのパフォーマンスの問題でした。

MonoGame (XNA) でコードを書き直しましたが、問題はありません。低予算のNokia Lumia 635でもすべてがうまく機能します:)

私は Win2D オプションを試しませんでしたが、結果は MonoGame の場合と同じくらい良いと思います。

返信ありがとうございます。

于 2015-07-20T12:41:39.050 に答える