是不是一定需要安装DB2000这个数据库??

  最初我也不太肯定,因为我还没有看源代码。

  现在看了,完全可以不必安装和配置这个玩意了,没有必要。

  看下面就应该知道没有这个必要——

 1 //加载物品数据
 2 function TFrmDBSrv.LoadItemsDB(): Integer;
 3 var
 4   i, Idx: Integer;
 5   StdItem: pTStdItem;
 6   nRecordCount: Integer;
 7 resourcestring
 8   sSQLString = 'select * from StdItems';
 9 begin
10   MainOutMessage('正在加载物品数据...');
11   try
12     Result := -1;
13     Query.SQL.Clear;
14     Query.DatabaseName := sHeroDB;
15     Query.SQL.Add(sSQLString);
16     try
17       Query.Open;
18     finally
19       Result := -2;
20     end;
21     nRecordCount := Query.RecordCount;
22     for i := 0 to nRecordCount - 1 do begin
23       New(StdItem);
24       Idx := Query.FieldByName('Idx').AsInteger;
25       StdItem.Name := Query.FieldByName('Name').AsString;
26       StdItem.StdMode := Query.FieldByName('StdMode').AsInteger;
27       StdItem.Shape := Query.FieldByName('Shape').AsInteger;
28       StdItem.Weight := Query.FieldByName('Weight').AsInteger;
29       StdItem.AniCount := Query.FieldByName('AniCount').AsInteger;
30       StdItem.Source := Query.FieldByName('Source').AsInteger;
31       StdItem.Reserved := Query.FieldByName('Reserved').AsInteger;
32       StdItem.Looks := Query.FieldByName('Looks').AsInteger;
33       StdItem.DuraMax := Word(Query.FieldByName('DuraMax').AsInteger);
34       StdItem.AC := MakeLong(Round(Query.FieldByName('Ac').AsInteger), Round(Query.FieldByName('Ac2').AsInteger));
35       StdItem.MAC := MakeLong(Round(Query.FieldByName('Mac').AsInteger), Round(Query.FieldByName('MAc2').AsInteger));
36       StdItem.DC := MakeLong(Round(Query.FieldByName('Dc').AsInteger), Round(Query.FieldByName('Dc2').AsInteger));
37       StdItem.MC := MakeLong(Round(Query.FieldByName('Mc').AsInteger), Round(Query.FieldByName('Mc2').AsInteger));
38       StdItem.SC := MakeLong(Round(Query.FieldByName('Sc').AsInteger), Round(Query.FieldByName('Sc2').AsInteger));
39       StdItem.Need := Query.FieldByName('Need').AsInteger;
40       StdItem.NeedLevel := Query.FieldByName('NeedLevel').AsInteger;
41       StdItem.Price := Query.FieldByName('Price').AsInteger;
42       if StdItemList.Count = Idx then begin
43         StdItemList.Add(StdItem);
44         Result := 1;
45       end else begin
46         MainOutMessage(Format('加载物品(Idx:%d Name:%s)数据失败!!!', [Idx, StdItem.Name]));
47         Result := -100;
48         Exit;
49       end;
50       Query.Next;
51     end;
52     Result := nRecordCount;
53     MainOutMessage(Format('物品数据库加载完成(%d)...', [nRecordCount]));
54   finally
55     Query.Close;
56   end;
57 end;

 

  这个只是加载物品DB的,还有技能的DB和怪物DB的加载,算一算,总共需要开辟多少块内存空间????

  一条数据开辟一块,总共多少条数据???再加上一个控件TQuery,需要多少空间??

  读取数据会不会快??读取多个堆内存效率高,还是只读取一个高???

  而且还得带一个DB2000数据库,真不知所谓。

  如果是SQL,那么带一个数据库很正常,但是你看上面的内存分配和数据操作,是不是觉得多余???

 

  既然这样,显然不如自己自定义结构化文件要理想得多,人物数据不是自定义结构化文件吗?

  采用自定义结构化文件,实际只需要声明一个文件对象,然后初始化。

  之后读取文件,采用类内部的内存流对象载入文件,以后就可以根据索引值来读取任何一条数据,实际是整个内存流内部数据的一块数据块。

  直接操作一块内存显然效率要比任何一种数据库要高得多。

  但是内存流操作的数据对象最好不要太大,跟SQL那些大型数据集是不同的。

  然而,这几份数据文件能有多大??百MB以上,这个是不可能的,看看你们的DB合起来是多大,呵呵。

  其实完全等于是忽略不计的。

 

  以后还是需要调整为SQL的,现在需要的是整体引擎出来,否则就连测试都没有法子做。

  但是结构架构前期必须调整到比较理想的状态,否则以后就麻烦了。

posted on 2012-08-14 22:33  一笑如风  阅读(919)  评论(2编辑  收藏  举报