Monogame - 等距瓷砖,大地图上的低FPS

时间:2017-07-15 06:33:13

标签: xna monogame tile frame-rate isometric

我在Monogame的等距2D上需要帮助我的代码。 我已经成功创建了一个瓦片引擎,可以在60FPS渲染500 * 750个瓷砖(128x64大小)(但是我的计算机着火了),但问题在于FPS大幅下降的大尺寸。

首先我将所有瓷砖加载到瓷砖列表中:

for (int i = 0; i < 500; i++)
        {
            for (int j = 0; j < 750; j++)
            {
                int x = j * 128 / 2;
                int y = i * 64;

                int ix = x - y;
                int iy = (x + y) / 2;
                tiles.Add(new Tile("001", new Vector2(ix, iy), new Vector2(j, i), spriteBatch, spriteFont, content));
            }
        }

然后当我需要绘制将绘制可见图块的i&#39; m colling方法时:

public void drawMap(Camera camera)
    {
        if (spriteBatch != null)
        {
            tilesDrawed = 0;
            foreach (Tile tile in tiles) // the problem
            {
                if (camera.isTileVisibe((int)tile.position.X, (int)tile.position.Y))
                {
                    Point isoCoords = new Point((int)tile.position.X, (int)tile.position.Y);
                    isoCoords.X -= camera.xOffset;
                    isoCoords.Y -= camera.yOffset;

                    tile.drawTile(isoCoords);
                    tilesDrawed++;
                }
            }


        }
    }

我知道问题是我经历了每个有效的瓷砖。 但我不知道如何处理这个:/。我想我会将瓷砖列表添加到可见的瓷砖列表中,但最后它是相同的,我必须考虑所有瓷砖以检查它们是否对相机可见。

结果: Result

我真的需要帮助我长时间坐在这上面。

谢谢。

编辑: 所以我用不可见的东西替换了我的foreach:

            List<Tile> visibleTiles = tiles.FindAll(r => (
                           (int)r.position.X + 128 > camera.width + camera.xOffset - camera.width && (int)r.position.X - 128 < camera.width + camera.xOffset) &&
                          ((int)r.position.Y + 64 > camera.height + camera.yOffset - camera.height && r.position.Y - 64 < camera.height + camera.yOffset));


            foreach (Tile tile in visibleTiles)
            {
                Point isoCoords = new Point((int)tile.position.X, (int)tile.position.Y);
                isoCoords.X -= camera.xOffset;
                isoCoords.Y -= camera.yOffset;

                tile.drawTile(isoCoords);
                tilesDrawed++;
            }

没有帮助那里发现我觉得这很慢,它只是快一点。

我切换到2d阵列 我需要找到可见的瓷砖.. 当我用:

计算时
            int si = (-camera.xOffset - tileWidth) / 64;
            int ei = (-camera.xOffset + camera.width + tileWidth) / 64;
            int sj = (-camera.yOffset - tileHeight) / 64;
            int ej = (-camera.yOffset + camera.height + tileHeight) / 64;

            Point start = twoDToIso(new Point(si,sj));
            Point end = twoDToIso(new Point(ei, ej));

它有点偏离,如果它外出,我将检查是否存在瓷砖。

我无法弄明白......坐在这里思考凌晨3点

1 个答案:

答案 0 :(得分:0)

如果要绘制2D地图,为什么不将其存储在2D中?一个二维数组就可以了。

通过这种方式,您可以计算要渲染的区域的哪个部分,并使用2个循环来遍历数组。

永远不要在实时应用程序中使用LinQ,只要你只调用一次,而不是每次调用它。

您可以在相机中添加变换矩阵,这样您就可以跳过移动添加,而是通过SpriteBatch移动切片的顶点。