0

好的,我正在尝试将我的 fps 提高到 60,但现在它在 20 左右。我可以对这段代码做些什么来加快它的速度?注意:这是使用 sfml 的 c++。

    App.Clear();
    for(int x = 0; x < lv.width; x++){
        for(int y = 0; y < lv.height; y++){

            int tileXCoord = 0;
            int tileYCoord = 0;
            int tileSheetWidth = tilemapImage.GetWidth() / lv.tileSize;

            if (lv.tile[x][y] != 0)
            {
                tileXCoord = lv.tile[x][y] % tileSheetWidth;
                tileYCoord = lv.tile[x][y] / tileSheetWidth;
            }

            tilemap.SetSubRect(sf::IntRect(tileXCoord * lv.tileSize, tileYCoord * lv.tileSize, (tileXCoord * lv.tileSize) + lv.tileSize, (tileYCoord * lv.tileSize) + lv.tileSize));
            tilemap.SetPosition(x * lv.tileSize, y * lv.tileSize);
            App.Draw(tilemap);
        }
    }

    playerSprite.SetSubRect(sf::IntRect(player.width * player.frame, player.height * player.state,
                                   (player.width * player.frame) + player.width, (player.height * player.state) + player.height));
    playerSprite.SetPosition(player.x, player.y);

    App.Draw(playerSprite);

    if(player.walking){
        if(player.frameDelay >= 0)
            player.frameDelay--;

        if(player.frameDelay <= 0){

            player.frame++;
            player.frameDelay = 10;

            if(player.frame >= 4)
                player.frame = 0;
        }
    }


    for(int x = 0; x < lv.width; x++){
        for(int y = 0; y < lv.height; y++){

            int tileXCoord = 0;
            int tileYCoord = 0;
            int tileSheetWidth = tilemapImage.GetWidth() / lv.tileSize;

            if (lv.ftile[x][y] != 0)
            {
                tileXCoord = lv.ftile[x][y] % tileSheetWidth;
                tileYCoord = lv.ftile[x][y] / tileSheetWidth;
            }

            tilemap.SetSubRect(sf::IntRect(tileXCoord * lv.tileSize, tileYCoord * lv.tileSize, (tileXCoord * lv.tileSize) + lv.tileSize, (tileYCoord * lv.tileSize) + lv.tileSize));
            tilemap.SetPosition(x * lv.tileSize, y * lv.tileSize);
            App.Draw(tilemap);
        }
    }


    App.Display();
4

2 回答 2

1

看起来您正在迭代关卡的像素,而不是图块。像这样重写

 ///get the width of a tile
// get the height of a tile
int tileWidth = tilemapImage.getWidth();
int tileHeight = tilemapImage.getHeight();

//find the number of tiles vertically and horizontally, by dividing
// the level width by the number of tiles
int xTiles = lv.width / tileWidth;
int yTiles = lv.height / tileHeight();

for (int x = 0; x < xTiles; x++) {
    for (int y = 0; y < yTiles; y++) {
        // Do your calculations here

        //ie: if(Walking) { draw_walk_anim; }
        // draw_tile[x][y];

        tilemap.SetPosition(x * tileWidth, y * tileHeight);
    }
}
于 2011-04-03T14:40:31.860 回答
0

我缺乏该领域的专业知识,但是您正在为每个图块绘制您的图块地图,基于它所采用的参数,看起来它正在重新绘制整个图块地图,即使它最多更改一个图块。

怎么会只调用 App.Draw(tilemap); 在每一行之后,或者可能在你设置了整个屏幕之后影响事情。

于 2011-04-03T14:35:46.367 回答