zoukankan      html  css  js  c++  java
  • 探讨【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的,现在需要的是整体引擎出来,否则就连测试都没有法子做。

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

  • 相关阅读:
    bits,Bytes,KB,MB,GB和TB之间的换算关系
    idea快捷键
    拦截器Interceptor和过滤器Filter的区别
    JSTL标签
    EL 表达式
    El 表达式和 Jstl 标签库
    JavaWeb servlet,乱码的原因和解决
    java类从加载、连接到初始化过程
    js中获取监听键盘事件
    ASP.NET Core Web 支付功能接入 微信-扫码支付篇(转)
  • 原文地址:https://www.cnblogs.com/GameDelphi/p/2639023.html
Copyright © 2011-2022 走看看