1

我正在开发一款 Windows 10 2D 棋盘游戏,它有时会产生连锁反应,其中 144 个移动物体可以与 36 个非移动物体发生碰撞。这是“最坏”的可能情况。

每个移动的游戏对象都是由一些不移动的游戏对象创建的。不动的游戏物体“射”出移动的游戏物体,当它们与其他不动的游戏物体碰撞时会发生一些事情:)

我正在使用情节提要移动 XAML 对象 (UserControls),并基于 CompositionTarget.Rendering 检查与游戏循环的冲突。

在我的电脑上一切都很好,但是当我试图在手机上产生这种效果时会出现问题。

我的游戏循环如下所示:

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 处于 beta 版本,它会更快,但是当它变热时,gameloop 每秒被调用约 2 次,所以这不是系统故障。

4

1 回答 1

0

对于将来遇到此问题的任何人:是的 - 这是一个基于 XAML 的性能问题。

我用 MonoGame (XNA) 重写了代码,没有问题。即使在低预算的诺基亚 Lumia 635 上也一切正常:)

我没有尝试 Win2D 选项,但怀疑结果会和 MonoGame 一样好。

谢谢大家的回复。

于 2015-07-20T12:41:39.050 回答