[传奇技术]探讨【IGE】的源代码【四】
是不是一定需要安装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的,现在需要的是整体引擎出来,否则就连测试都没有法子做。 但是结构架构前期必须调整到比较理想的状态,否则以后就麻烦了。
|