如何最小化加载向量的时间?

时间:2014-01-04 07:33:22

标签: c++ vector rendering sdl

我目前正在尝试开发一款游戏而且我在使用Map时遇到了一些麻烦。

Map的工作方式如下:我们有一个名为Map的类,它将包含一个Tiles向量。

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

因此,在GMap中将有一个函数Load,它将从txt文件加载所有图块。 所有图块都有自己的功能,例如渲染。以及他们自己的变量,如ID和Tile类型。

我可以很容易地渲染瓷砖,但我的问题是,由于地图有点大,而且每个瓷砖只有16x16像素,因此填充整个曲面需要很多。而且由于它们很多,所以加载它需要太长时间。比如,他们中的一小部分是30-40秒。

我还没有开发出实际读取txt文件的代码,它将包含要加载多少个tile的信息,它们是哪些类型以及它们的位置,所以我一直在使用这段代码来测试Tile Rendering。 / p>

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 Class上,我有这个功能:

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
}

我道歉我没有正确解释最后一个功能,但我不认为我的问题就在那里。

无论如何,如果有人需要更多信息,请在部分代码中询问。

谢谢!

1 个答案:

答案 0 :(得分:1)

我发现了问题。每个图块都有自己的Surface,它会加载相同的图像。这意味着我正在生成1024个曲面,并加载1024个曲面。我解决这个问题的方法是在Map类中创建一个Surface,它将被所有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;
}

在Map类中我添加了MSurface,它将加载包含所有Tile Blocks的Image。 然后渲染我将执行以下操作:

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

Msurface是包含图像的Surface。

每个图块都会将MSurface作为外部曲面接收,但它将用于保存所有图像。

因此,我只创建了1个而不是创建1024个Surfaces。现在加载比以前多了2秒。它还解决了我的所有Tiles Not-Rendering问题。