一直以为网游的设计是类似以下这样的:
读: 客户端->服务器->客户端
写: 客户端->服务器->客户端
现在发现网游的实际设计可能是类似以下这样的:
读: 客户端->客户端备份数据->客户端
写: 客户端->服务器->更新客户端备份数据->客户端
多了个客户端备份数据有什么坏处和好处呢?
坏处:
1) 用户所见的未必是最新的(因为是本机上的备份数据)。
2) 服务器的1份数据要变成N份客户端的数据。
3) 数据的拷贝等多了一份客户端的开销。
好处:
1) 减少了读时的网络通讯。
2) 把服务器的“读写矛盾”转移到客户端的“读写矛盾”(极大的减少了服务器的读写矛盾处理压力)。
function ZcBase()
local m_public = {}
local m_protected = {}
m_protected.data = {}
m_protected.data.CONST_PAR =
{
T_GROUP_PLAYER_MAX = 1,
T_GROUP_MAX = 1,
SU_SH = 0,
SU_SM = 0,
SU_EH = 0,
SU_EM = 0,
ET_SH = 0,
ET_SM = 0,
ET_EH = 0,
ET_EM = 0,
LM = 0,
}
m_protected.data.tGropu1 = {}
m_protected.data.tHadPlayer1 = {}
m_protected.data.tGropu2 = {}
m_protected.data.tHadPlayer2 = {}
m_protected.data.tGropu3 = {}
m_protected.data.tHadPlayer3 = {}
m_protected.data.lasterError = "UnKnow"
--初始化
function m_public.Init(_data)
myPrint("初始化未实现",1)
end
--报名
function m_public.SetGroupID(_from, _playerID, _ChooseID)
myPrint("报名未实现",1)
end
--进入
function m_public.SetPlayer(_from, _playerID)
myPrint("进场未实现",1)
end
--获得最新的错误
function m_public.GetError(_playerID)
return m_protected.data.lasterError
end
--获得数据
function m_public.GetData()
return m_protected.data
end
return m_public, m_protected
end
function ZcMediumData()
local m_public, m_protected = ZcBase()
--刷新
function m_protected.UpdataDate()
local pClient = Get_ZcClientData()
pClient.Init(m_protected.data)
end
--报名
function m_public.SetGroupID(_from, _playerID, _ChooseID)
myPrint("服务器报名" .. _playerID .."->" .. _ChooseID,1)
local GroupID = d_getPlayerFaction(_playerID)
--Boss1
local dLen = table.getn(m_protected.data.tGropu1)
for i=1, dLen do
if m_protected.data.tGropu1[i] == GroupID then
m_protected.data.lasterError = "玩家所处帮会已报过名"
_from.RecvRet(m_protected.data)
return
end
end
--Boss2
local dLen = table.getn(m_protected.data.tGropu2)
for i=1, dLen do
if m_protected.data.tGropu2[i] == GroupID then
m_protected.data.lasterError = "玩家所处帮会已报过名"
_from.RecvRet(m_protected.data)
return
end
end
--Boss3
local dLen = table.getn(m_protected.data.tGropu3)
for i=1, dLen do
if m_protected.data.tGropu3[i] == GroupID then
m_protected.data.lasterError = "玩家所处帮会已报过名"
_from.RecvRet(m_protected.data)
return
end
end
if 1 == _ChooseID then
m_protected.data.tGropu1[table.getn(m_protected.data.tGropu1) + 1] = GroupID
elseif 2 == _ChooseID then
m_protected.data.tGropu1[table.getn(m_protected.data.tGropu2) + 1] = GroupID
elseif 3 == _ChooseID then
m_protected.data.tGropu1[table.getn(m_protected.data.tGropu3) + 1] = GroupID
end
m_protected.data.lasterError = "OK"
_from.RecvRet(m_protected.data)
m_protected.UpdataDate()
end
--进入
function m_public.SetPlayer(_from, _playerID)
myPrint("服务器进场" .. _playerID,1)
m_protected.data.lasterError = "OK"
_from.RecvRet(m_protected.data)
m_protected.UpdataDate()
end
return m_public
end
function ZcClientData()
local m_public, m_protected = ZcBase()
--服务器的回调函数
function m_public.RecvRet(_data)
m_protected.data = _data
myPrint(m_protected.data.lasterError, 1)
end
--初始数据
function m_public.Init(_data)
m_protected.data = _data
myPrint("客户端初始化数据",1)
end
--读本地数据
function m_public.Read()
myPrint("客户端读数据",1)
end
--报名
function m_public.SetGroupID(_from, _playerID, _ChooseID)
--服务器报名
local pServer = Get_ZcMediumData()
pServer.SetGroupID(m_public, _playerID, _ChooseID)
end
--进入
function m_public.SetPlayer(_from, _playerID)
--服务器进场
local pServer = Get_ZcMediumData()
pServer.SetPlayer(m_public, _playerID)
end
return m_public
end
G_ZcMediumData = ZcMediumData()
G_ZcClientData = ZcClientData()
function Get_ZcMediumData()
return G_ZcMediumData
end
function Get_ZcClientData()
return G_ZcClientData
end