游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3378|回复: 4

如何在游戏中快速的载入数据

[复制链接]

24

主题

64

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2006-3-27 01:47:00 | 显示全部楼层 |阅读模式
     现在的游戏真是越来越大,关卡也是越来越大,载入的时间也上越来越长,但如何来缩短这一方法呢?
    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]

6

主题

26

帖子

30

积分

注册会员

Rank: 2

积分
30
发表于 2006-3-27 08:24:00 | 显示全部楼层

Re:如何在游戏中快速的载入数据

看不懂 回去补课

5

主题

120

帖子

144

积分

注册会员

Rank: 2

积分
144
QQ
发表于 2006-3-28 16:01:00 | 显示全部楼层

Re:如何在游戏中快速的载入数据

我也去补课
。。。。

16

主题

266

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
发表于 2006-4-4 13:17:00 | 显示全部楼层

Re:如何在游戏中快速的载入数据

在windows游戏编程中,游戏资源的载入一般采用内存映射方式,具体可以参看windows核心编程

13

主题

113

帖子

123

积分

注册会员

Rank: 2

积分
123
QQ
发表于 2006-4-8 02:00:00 | 显示全部楼层

Re:如何在游戏中快速的载入数据

如果我没理解错的话,楼主的意思应该是:一种方法是边读边解析;二是一次读入一个缓冲中,然后解析,最后释放。不知道是也不是?

如果是这样的话,那么楼主的代码则很容易令人迷惑- -b,GameData::BufferedLoad貌似和GameData:oad做了同样的事情,但却多了一个复制操作。而且这种读取方法貌似很基本。也许是我没看出内里的深意?

我和楼上的想法一样,WINDOWS下用内存映射文件来做的话,无论是在内存管理,效率,同步,还是进程间共享,恐怕都会更好。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 04:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表