Как минимизировать время загрузки Векторов?

0

В настоящее время я пытаюсь разработать игру, и у меня возникают проблемы с Картой.

Карта работает следующим образом: у нас есть класс с именем Map, который будет содержать вектор Tiles.

class GMap
{
private :
    std::vector <BTiles> TileList;
...

Таким образом, будет функция Load в GMap, которая будет загружать все плитки из txt файла. Все плитки имеют свою собственную функцию, например рендеринг. И их собственные переменные, такие как ID и Type of Tile.

Я могу легко отобразить плитки, но моя проблема в том, что, поскольку карты являются довольно большими, и каждая плитка имеет всего 16x16 пикселей, для заполнения всей поверхности требуется много их. И так как их так много, для загрузки требуется слишком много времени. Например, 30-40 секунд для небольшой части из них.

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

bool GMap::Load(char *File)
{
    int XRand;

    for(int i = 0;i < 1024;i++) //I need 1024 tiles to load a screen of 512x512 pixels.
    {
        BTiles NewTile; //Btile is the Tiles Class.
        XRand = rand() % 5; //There are currently only 5 types of Tile. And i wanted to print them randomly, just for testing. 
        NewTile.OnLoad(XRand, i); //This will be setting type = Xrand, and ID = i. The Type will define which block to print on the screen. And the ID will define where to print it.
       TileList.push_back(NewTile);
    }
    return true;
}

Это функция Tiles OnLoad:

bool BTiles::OnLoad(int BType, int BID)
{
    if((BSurface = Surface::OnLoad("BTexture.png")) == false)
        return false;
    Type = BType;
    ID = BID;
    return true;
}

Затем я могу распечатать все плитки следующим образом:

void GMap::Render(SDL_Surface *MainSurface)
{
    for(int i = 0;i < TileList.size();i++)
    {
        TileList[i].OnRender(MainSurface); //I am calling a Render function inside the Tile Class. MainSurface is the primary surface im using to render images.
    }

Но моя проблема заключается в функции загрузки. Для загрузки этих 1024 плиток требуется слишком много времени. И 1024 плитки - это лишь немногие из суммы, которые мне действительно придется загружать на серьезной карте. Кроме того, он даже не загрузит их всех. После огромного количества времени, затрачиваемого на загрузку 1024 плиток, он печатает только половину из них. Например, экран не заполнен плиткой, хотя я "загрузил" правильную сумму, чтобы заполнить весь экран. Затем я продолжил увеличивать число с 1024 до 2048, в надежде, что он закончит экран. Но на самом деле это не изменило НИЧЕГО. Похоже, он загружает определенное количество, а затем просто останавливается. Или, по крайней мере, он прекращает рендеринг.

Если кто-то хочет знать, как делается рендеринг, у меня есть функция Global, которая будет выполнять эту работу, а затем в классе Tile у меня есть эта функция:

void BTiles::OnRender(SDL_Surface *MSurface)
{
    int X = (ID * 16) % M_WIDTH; //Since i am only using the ID to know which position to put a Tile, i use this function to locate which Horizontal Position to put them. M_WIDTH is a global variable that defines the Width of the screen, it is currently 512
    int Y = ((ID * 16) / M_HEIGHT) * 16; //The same but for the Vertical Position. M_HEIGHT is currently also 512
    Surface::OnDraw(MSurface, BSurface, X, Y, (Type * 16) % M_WIDTH, (Type * 16) / M_HEIGHT, 16, 16); //This means Render(On The Primary Surface, using the Images on the BSurface, on the Position X, on the position Y, Where the Tile i want to render starts on the X line, Where the Tile i want to render starts on the Y line, it is 16 bits Width, it is 16 bits Height
}

Я прошу прощения, я не правильно объяснил последнюю функцию, но я не думаю, что моя проблема есть.

В любом случае, если кому-то нужно больше информации, в части кода, просто спросите.

Спасибо!

  • 0
    Вы проверяли, что все методы OnLoad действительно возвращают true ?
  • 0
    Насколько сложен BTiles? Если вы профилируете код, потратит ли он много времени в конструкторе копирования? Я спрашиваю, потому что вы копируете каждый объект BTiles хотя бы один раз, из стека в векторное хранилище, и многие из них снова, когда вектор перераспределяется.
Показать ещё 7 комментариев
Теги:
vector
rendering
sdl

1 ответ

1
Лучший ответ

Я обнаружил проблему. Каждая плитка имела свою собственную поверхность, которая загружала бы один и тот же образ. Это означает, что я создавал 1024 поверхности и загружал 1024 поверхности. Что я сделал для решения проблемы, так это создать поверхность в классе карты, которая будет использоваться всеми Tiles.

Так

bool BTiles::OnLoad(int BType, int BID)
{
    if((BSurface = Surface::OnLoad("BTexture.png")) == false)
        return false;
    Type = BType;
    ID = BID;
    return true;
}

стал

   bool BTiles::OnLoad(int BType, int BID)
{
    Type = BType;
    ID = BID;
    return true;
}

В классе карты я добавил MSurface, в котором будет загружено изображение, которое будет содержать все блоки Tile. И затем, чтобы сделать, я сделал бы следующее:

void GMap::Render(SDL_Surface *MainSurface)
{
    for(int i = 0;i < TileList.size();i++)
    {
        TileList[i].OnRender(MainSurface, MSurface, 0, 0);
    }
}

Msurface - это поверхность, содержащая изображение.

И каждая плитка получит MSurface как внешнюю поверхность, но она будет использоваться для хранения всех изображений.

Поэтому вместо создания 1024 Surfaces, я создал только 1. Теперь загрузка занимает намного больше времени, чем раньше. Это также зафиксировало мою проблему не-рендеринга всех плиток.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню