网游服务器节省通讯的方法。

 

今天发现一个很不错的设计:

一直以为网游的设计是类似以下这样的:

读: 客户端->服务器->客户端

写: 客户端->服务器->客户端

现在发现网游的实际设计可能是类似以下这样的:

读: 客户端->客户端备份数据->客户端

写: 客户端->服务器->更新客户端备份数据->客户端

 

 

多了个客户端备份数据有什么坏处和好处呢?

坏处:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值