本帖最后由 KA 于 2010-12-15 13:42 编辑
两种读取方法,你说哪个比较厉害点呢
求详细解释。。
JY_lua 0.66+
- -- 读取游戏进度
- -- id=0 新进度,=1/2/3 进度
- --
- --这里是先把数据读入Byte数组中。然后定义访问相应表的方法,在访问表时直接从数组访问。
- --与以前的实现相比,从文件中读取和保存到文件的时间显著加快。而且内存占用少了
- function LoadRecord(id) -- 读取游戏进度
- local t1=lib.GetTime();
- --读取R*.idx文件
- local data=Byte.create(6*4);
- Byte.loadfile(data,CC.R_IDXFilename[id],0,6*4);
- local idx={};
- idx[0]=0;
- for i =1,6 do
- idx[i]=Byte.get32(data,4*(i-1));
- end
- --读取R*.grp文件
- JY.Data_Base=Byte.create(idx[1]-idx[0]); --基本数据
- Byte.loadfile(JY.Data_Base,CC.R_GRPFilename[id],idx[0],idx[1]-idx[0]);
- --设置访问基本数据的方法,这样就可以用访问表的方式访问了。而不用把二进制数据转化为表。节约加载时间和空间
- local meta_t={
- __index=function(t,k)
- return GetDataFromStruct(JY.Data_Base,0,CC.Base_S,k);
- end,
- __newindex=function(t,k,v)
- SetDataFromStruct(JY.Data_Base,0,CC.Base_S,k,v);
- end
- }
- setmetatable(JY.Base,meta_t);
- JY.PersonNum=math.floor((idx[2]-idx[1])/CC.PersonSize); --人物
- JY.Data_Person=Byte.create(CC.PersonSize*JY.PersonNum);
- Byte.loadfile(JY.Data_Person,CC.R_GRPFilename[id],idx[1],CC.PersonSize*JY.PersonNum);
- for i=0,JY.PersonNum-1 do
- JY.Person[i]={};
- local meta_t={
- __index=function(t,k)
- return GetDataFromStruct(JY.Data_Person,i*CC.PersonSize,CC.Person_S,k);
- end,
- __newindex=function(t,k,v)
- SetDataFromStruct(JY.Data_Person,i*CC.PersonSize,CC.Person_S,k,v);
- end
- }
- setmetatable(JY.Person[i],meta_t);
- end
- JY.ThingNum=math.floor((idx[3]-idx[2])/CC.ThingSize); --物品
- JY.Data_Thing=Byte.create(CC.ThingSize*JY.ThingNum);
- Byte.loadfile(JY.Data_Thing,CC.R_GRPFilename[id],idx[2],CC.ThingSize*JY.ThingNum);
- for i=0,JY.ThingNum-1 do
- JY.Thing[i]={};
- local meta_t={
- __index=function(t,k)
- return GetDataFromStruct(JY.Data_Thing,i*CC.ThingSize,CC.Thing_S,k);
- end,
- __newindex=function(t,k,v)
- SetDataFromStruct(JY.Data_Thing,i*CC.ThingSize,CC.Thing_S,k,v);
- end
- }
- setmetatable(JY.Thing[i],meta_t);
- end
- JY.SceneNum=math.floor((idx[4]-idx[3])/CC.SceneSize); --场景
- JY.Data_Scene=Byte.create(CC.SceneSize*JY.SceneNum);
- Byte.loadfile(JY.Data_Scene,CC.R_GRPFilename[id],idx[3],CC.SceneSize*JY.SceneNum);
- for i=0,JY.SceneNum-1 do
- JY.Scene[i]={};
- local meta_t={
- __index=function(t,k)
- return GetDataFromStruct(JY.Data_Scene,i*CC.SceneSize,CC.Scene_S,k);
- end,
- __newindex=function(t,k,v)
- SetDataFromStruct(JY.Data_Scene,i*CC.SceneSize,CC.Scene_S,k,v);
- end
- }
- setmetatable(JY.Scene[i],meta_t);
- end
- JY.WugongNum=math.floor((idx[5]-idx[4])/CC.WugongSize); --武功
- JY.Data_Wugong=Byte.create(CC.WugongSize*JY.WugongNum);
- Byte.loadfile(JY.Data_Wugong,CC.R_GRPFilename[id],idx[4],CC.WugongSize*JY.WugongNum);
- for i=0,JY.WugongNum-1 do
- JY.Wugong[i]={};
- local meta_t={
- __index=function(t,k)
- return GetDataFromStruct(JY.Data_Wugong,i*CC.WugongSize,CC.Wugong_S,k);
- end,
- __newindex=function(t,k,v)
- SetDataFromStruct(JY.Data_Wugong,i*CC.WugongSize,CC.Wugong_S,k,v);
- end
- }
- setmetatable(JY.Wugong[i],meta_t);
- end
- JY.ShopNum=math.floor((idx[6]-idx[5])/CC.ShopSize); --小宝商店
- JY.Data_Shop=Byte.create(CC.ShopSize*JY.ShopNum);
- Byte.loadfile(JY.Data_Shop,CC.R_GRPFilename[id],idx[5],CC.ShopSize*JY.ShopNum);
- for i=0,JY.ShopNum-1 do
- JY.Shop[i]={};
- local meta_t={
- __index=function(t,k)
- return GetDataFromStruct(JY.Data_Shop,i*CC.ShopSize,CC.Shop_S,k);
- end,
- __newindex=function(t,k,v)
- SetDataFromStruct(JY.Data_Shop,i*CC.ShopSize,CC.Shop_S,k,v);
- end
- }
- setmetatable(JY.Shop[i],meta_t);
- end
- lib.LoadSMap(CC.S_Filename[id],CC.TempS_Filename,JY.SceneNum,CC.SWidth,CC.SHeight,CC.D_Filename[id],CC.DNum,11);
- collectgarbage();
- lib.Debug(string.format("Loadrecord time=%d",lib.GetTime()-t1));
- end
复制代码 JY_lua 0.5
- -- 读取游戏进度
- -- id=0 新进度,=1/2/3 进度
- function LoadRecord(id) -- 读取游戏进度
- --读取R*.idx文件
- local data=Byte.create(6*4);
- Byte.loadfile(data,CC.R_IDXFilename[id],0,6*4);
- local idx={};
- idx[0]=0;
- for i =1,6 do
- idx[i]=Byte.get32(data,4*(i-1));
- end
- --读取R*.grp文件
- data=Byte.create(idx[1]-idx[0]); --基本数据
- Byte.loadfile(data,CC.R_GRPFilename[id],idx[0],idx[1]-idx[0]);
- LoadData(JY.Base,CC.Base_S,data);
- JY.PersonNum=math.floor((idx[2]-idx[1])/CC.PersonSize); --人物
- data=Byte.create(CC.PersonSize);
- for i=0,JY.PersonNum-1 do
- Byte.loadfile(data,CC.R_GRPFilename[id],idx[1]+i*CC.PersonSize,CC.PersonSize);
- JY.Person[i]={};
- LoadData(JY.Person[i],CC.Person_S,data);
- end
- JY.ThingNum=math.floor((idx[3]-idx[2])/CC.ThingSize); --物品
- data=Byte.create(CC.ThingSize);
- for i=0,JY.ThingNum-1 do
- Byte.loadfile(data,CC.R_GRPFilename[id],idx[2]+i*CC.ThingSize,CC.ThingSize);
- JY.Thing[i]={};
- LoadData(JY.Thing[i],CC.Thing_S,data);
- end
- JY.SceneNum=math.floor((idx[4]-idx[3])/CC.SceneSize); --场景
- data=Byte.create(CC.SceneSize);
- for i=0,JY.SceneNum-1 do
- Byte.loadfile(data,CC.R_GRPFilename[id],idx[3]+i*CC.SceneSize,CC.SceneSize);
- JY.Scene[i]={};
- LoadData(JY.Scene[i],CC.Scene_S,data);
- end
- JY.WugongNum=math.floor((idx[5]-idx[4])/CC.WugongSize); --武功
- data=Byte.create(CC.WugongSize);
- for i=0,JY.WugongNum-1 do
- Byte.loadfile(data,CC.R_GRPFilename[id],idx[4]+i*CC.WugongSize,CC.WugongSize);
- JY.Wugong[i]={};
- LoadData(JY.Wugong[i],CC.Wugong_S,data);
- end
- JY.ShopNum=math.floor((idx[6]-idx[5])/CC.ShopSize); --小宝商店
- data=Byte.create(CC.ShopSize);
- for i=0,JY.ShopNum-1 do
- Byte.loadfile(data,CC.R_GRPFilename[id],idx[5]+i*CC.ShopSize,CC.ShopSize);
- JY.Shop[i]={};
- LoadData(JY.Shop[i],CC.Shop_S,data);
- end
- local ll=filelength(CC.S_Filename[id]);
- JY.S=Byte.create(ll);
- Byte.loadfile(JY.S,CC.S_Filename[id],0,ll);
- ll=filelength(CC.D_Filename[id]);
- JY.D=Byte.create(ll);
- Byte.loadfile(JY.D,CC.D_Filename[id],0,ll);
- end
复制代码 |