При рисовании тайламапов мой fps падает - PullRequest
0 голосов
/ 03 апреля 2011

Хорошо, я пытаюсь увеличить частоту кадров до 60, но сейчас он около 20. Что я могу сделать с этим кодом, чтобы ускорить его?Примечание: это c ++ с использованием sfml.

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

Ответы [ 2 ]

1 голос
/ 03 апреля 2011

Похоже, вы перебираете пиксели своего уровня, а не плитки. Перепишите это как

 ///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);
    }
}
0 голосов
/ 03 апреля 2011

Мне не хватает опыта в этой области, но вы рисуете свою карту листов для каждой плитки, основываясь на параметрах, которые она принимает, похоже, что она перерисовывает всю карту плиток, даже если она изменилась не более чем для одной плитки.

Как бы только вызывать App.Draw (tilemap);после каждой строки, или, возможно, после того, как вы установили весь экран, влияйте на вещи.

...