|
|
现在的游戏真是越来越大,关卡也是越来越大,载入的时间也上越来越长,但如何来缩短这一方法呢?
1,先预处理你的数据。通常是编写成的独立的游戏工具,也就是关卡设计器,在游戏中,自定义数据的打包结构,这里,可以参考,我以前提过的打包器的编写。(在我的BLOG里,有人就使用哈西结构,这可是高效率的哦!详细,请参考《数据结构》,计算机专业的必修可之一)。
2。保存你的数据。代码如下:
#include <stdio.h>
class GameData
{
public:
bool Save(char *fileName);
bool Load(char *fileName);
bool BufferedLoad(char *fileName);
private:
static FILE *fileDescriptor;//一次只打开一个文件
int data[1000];//使用自己的数据格式替换这个字段
};
bool GameData::Save(char *fileName)
{
fileDescriptor = fopen(fileName,"wb");
if (fileDescriptor)
{
fwrite(this,sizeof(GameData), 1, fileDescriptor);
fclose(fileDescriptor);
return TRUE;
}
else
{
return FALSE;
}
}
这里使用的是抽象数据类型(ADT),将有的成员变量都定义成类的私有成员,通过公共结构(PUBLIC)实现对数据的操作。好拉,不喷拉。。。。这只是一个C++的小字节上的问题。(跑题拉);
3。使用简单的方法载入你的数据。代码如下,(继续上面的)
bool GameData: oad(char *fileName)
{
fileDescriptor = fopen(fileName, "rb");//只读方式打开文件
if (fileDescriptor);
{
fread (this, sizeof (GameData), 1, fileDescriptor);
fclose(fileDescriptor);
return TRUE;
}
else
{
return FALSE;
}
}
4.更安全地载入你的是数据。
这里是使用建立一个缓冲区来,通过,重复利用缓冲区,来实现数据的读取,一次性的读入,再慢慢的释放它。这样比你变读变释速度要快的多。代码入下(继续上面)
#define READ_GRANULARITY 2048
bool GameData::BufferedLoad(char *fileName)
{
char *temBuffer = new char[sizeof(GameData)+READ_GRANULARITY];
if(!tempBuffer)
{
return FALSE;
}
fileDescriptor = fopen(fileName, "rb");
if(fileDescriptor)
{
fread(tempBuffer, sizeof(GameData), 1, fileDescriptor);
fclose(fileDescriptor);
mencpy(this, tempBuffer, sizeof(GameData));
delete tempBuffer;
return TRUE;
}
else
{
delete tempBuffer;
return FALSE;
}
}
本文献参考
Mark DeLoura 《Game programming Gews》
[em18] |
|