当我们完成了任务奖励系统后,奖励系统发出的包和其他触发此系统发出的包会同时发送给客户端,这是一种浪费流量的行为,我们可以把两个消息合并来优化流量。

并包

当我们铸造金币,PshTaskPrgsRspBuy会同时推送给客户端

服务器TaskSys增加GetTaskPrgs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public PshTaskPrgs GetTaskPrgs(PlayerData pd, int tid)
{
TaskRewardData trd = CalcTaskRewardData(pd, tid);
TaskRewardCfg trc = _cfgSvc.GetTaskRewardCfg(tid);

if (trd.prgs < trc.count)
{
trd.prgs += 1;

//更新任务进度
CalcTaskArr(pd, trd);

return new PshTaskPrgs
{
taskArr = pd.taskArr
};
}
else return null;
}

修改BuySys的API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
if (pd.diamond < data.cost)
{
msg.err = (int)ErrorCode.LackDiamond;
}
else
{
pd.diamond -= data.cost;
PshTaskPrgs pshTaskPrgs = null;//+++
switch (data.buytype)
{
case 0:
pd.power += 100;//购买体力无视体力限制
pshTaskPrgs = TaskSys.Instance.GetTaskPrgs(pd, 4);//+++
break;
case 1:
pd.coin += 1000;
pshTaskPrgs = TaskSys.Instance.GetTaskPrgs(pd,5);//+++
break;
}
if(_cacheSvc.UpdatePlayerData(pd.id, pd))
{
msg.err = (int)ErrorCode.UpdateDBError;
}
else
{
msg.rspBuy = new RspBuy
{
buytype = data.buytype,
diamond = pd.diamond,
coin = pd.coin,
power = pd.power,
};

//并包处理
msg.pshTaskPrgs = pshTaskPrgs;//+++
}
}

修改客户端MainCitySys

修改RspBuy方法,就是判断一下GameMsg里面有没有pshTaskPrgs包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void RspBuy(GameMsg msg)
{
RspBuy rspBuy = msg.rspBuy;
GameRoot.Instance.SetPlayerDataByBuy(rspBuy);
GameRoot.AddTips("Buy Succeed");
mainCityWnd.RefreshUI();
buyWnd.SetWndState(false);

if (msg.pshTaskPrgs != null)
{
GameRoot.Instance.SetPlayerTaskPrgs(msg.pshTaskPrgs);
if (taskWnd.GetWndState()) taskWnd.RefreshUI();
}
}