导读:
中有可以保存自己定义的各种结构。如果将他们两个结合起来使用会是什么情况呢?
试想一下,如果在游戏中如果突然有哪个玩家断线,那么即便是我们知道这个玩家的Socket,但是要从所有玩家中检索出他的信息,也不是一件容易的事。
那我们为什么不能将Hash表和Tlist结合使用呢。在我开发的游戏中,我就是将Hash表和Tlist同时使用,来对玩家断线做相关的处理。
今天我就简单的写一下我是如何处理的。
假定有一个Tlist中(UserList)保存着游戏中某房间的所有玩家信息。玩家的信息结构如下:
RuserInfo = record
Socket;Tsocket;
UserID:String[20];
Face:Byte;
Sex:Boolean;
Socre:Integer;
CurrStatus:Integer;
End;
PuserInfo = ^ RuserInfo;
我们来创建一个Hash表和一个Tlist表:
ScHash:=THashedStringlist.Create;
UserList:=Tlist.Create;
当某一玩家加入游戏时这样处理。
New(P_User)
P_User.Socket:=3500;
P_User.UserID:=’fxh7622’;
P_User.Face:=3;
P_User.Sex:=true;
P_User.Socre:=1000;
P_User.CurrStatus:=0;
Index:=ScHash.IndexOf(IntToStr(p_User.Socket));
if Index=-1 then
begin
ScHash.AddObject(IntToStr(p_User^.Socket),TObject(Integer(p_User)));
end;
//这里将玩家的信息以Socket作为KEY来放入Hash表中。
UserList.Add(P_User);
//在这里将玩家的信息保存在一个Tlist表中。通过前面我的文章中介绍,大家可以知道在HASH表中和在Tlist表中保存的是同一个内容,也就是说:如果修改了某玩家在Tlist中保存的信息那么他在Hash表中保存的信息也将随着修改。
这样当玩家断线以后,我们可以快速的使用Hash表来检索出是哪个玩家断线。
function TUserBaseControl.Sel_Hash(sc:TSOCKET;var p_User:PUserSocket): Boolean;
var
t_User:PUserSocket;
t_Object:TObject;
Index:Integer;
begin
Result:=false;
Index:=ScHash.IndexOf(IntToStr(sc));
if Index<>-1 then
begin
t_Object:=ScHash.Objects[Index];
p_User:=PUserSocket(t_Object);
Result:=true;
end;
end;
检索出玩家信息以后可以将玩家信息中的相关信息进行修改。
例如:p_User.CurrStatus:=5;
以上的例子只是对Hash表和Tlist使用的一个小小的窍门,但是的确可以加快服务器的处理速度。希望也对大家有一个帮助。
本文转自
http://fxh7622.blog.51cto.com/63841/46105
中有可以保存自己定义的各种结构。如果将他们两个结合起来使用会是什么情况呢?
试想一下,如果在游戏中如果突然有哪个玩家断线,那么即便是我们知道这个玩家的Socket,但是要从所有玩家中检索出他的信息,也不是一件容易的事。
那我们为什么不能将Hash表和Tlist结合使用呢。在我开发的游戏中,我就是将Hash表和Tlist同时使用,来对玩家断线做相关的处理。
今天我就简单的写一下我是如何处理的。
假定有一个Tlist中(UserList)保存着游戏中某房间的所有玩家信息。玩家的信息结构如下:
RuserInfo = record
Socket;Tsocket;
UserID:String[20];
Face:Byte;
Sex:Boolean;
Socre:Integer;
CurrStatus:Integer;
End;
PuserInfo = ^ RuserInfo;
我们来创建一个Hash表和一个Tlist表:
ScHash:=THashedStringlist.Create;
UserList:=Tlist.Create;
当某一玩家加入游戏时这样处理。
New(P_User)
P_User.Socket:=3500;
P_User.UserID:=’fxh7622’;
P_User.Face:=3;
P_User.Sex:=true;
P_User.Socre:=1000;
P_User.CurrStatus:=0;
Index:=ScHash.IndexOf(IntToStr(p_User.Socket));
if Index=-1 then
begin
ScHash.AddObject(IntToStr(p_User^.Socket),TObject(Integer(p_User)));
end;
//这里将玩家的信息以Socket作为KEY来放入Hash表中。
UserList.Add(P_User);
//在这里将玩家的信息保存在一个Tlist表中。通过前面我的文章中介绍,大家可以知道在HASH表中和在Tlist表中保存的是同一个内容,也就是说:如果修改了某玩家在Tlist中保存的信息那么他在Hash表中保存的信息也将随着修改。
这样当玩家断线以后,我们可以快速的使用Hash表来检索出是哪个玩家断线。
function TUserBaseControl.Sel_Hash(sc:TSOCKET;var p_User:PUserSocket): Boolean;
var
t_User:PUserSocket;
t_Object:TObject;
Index:Integer;
begin
Result:=false;
Index:=ScHash.IndexOf(IntToStr(sc));
if Index<>-1 then
begin
t_Object:=ScHash.Objects[Index];
p_User:=PUserSocket(t_Object);
Result:=true;
end;
end;
检索出玩家信息以后可以将玩家信息中的相关信息进行修改。
例如:p_User.CurrStatus:=5;
以上的例子只是对Hash表和Tlist使用的一个小小的窍门,但是的确可以加快服务器的处理速度。希望也对大家有一个帮助。
本文转自
http://fxh7622.blog.51cto.com/63841/46105