之前的项目曾经遇到这样一个问题:
  在弱网环境下,几乎每次打开排行榜,都会出现小菊花(加载中),但是在wifi环境下则不会,初步猜测是数据包太大,导致加载速度慢。
  使用工具一查,进入排行榜,服务端返回的数据包居然达到了20KB,而我们的竞品,只有2.36KB。
  流量测试是什么
  流量测试是安卓APP性能测试的其中一个专项,测试APP在联网环境下,网络流量的消耗情况。
  流量测试怎么做
  使用过以下几种方式:
  · 通过Adb获取流量数据,TesterHome上的一篇文章有详细的讲述,不再重复了, 点击访问 。
  · 使用tcpdump抓包,使用wireshark分析。
  · 使用性能测试工具GT,Wetest,Emmagee,记录流量数据后,导出查看。
  · 在游戏代码中打印,汇总流量数据。
  简单有效的方式
  使用GT这类成熟的性能测试工具,可以直接生成csv文件导出,或者在云端通过图表形式展示。
transmittedreceived
min19108
max22137
avg21132
11:41:15.219108
11:41:16.420111
11:41:17.521136
11:41:18.722136
11:41:19.822137
11:41:21.022137
  不足之处,只是单纯记录每一秒的流量消耗,无法记录是什么操作产生的流量消耗。另外,如果同一秒中产生了多个请求,消耗的记录会积累到一起。
  tcpdump+wireshark可以精确到每一个请求产生的流量消耗,同样也无法直观知道具体是哪个操作。
  精确直观的方式
  怎么样才能直观地查看每一个请求所属的操作呢?答案是自制一个流量统计工具。
  工具原理:
  在客户端代码内,每次请求发送与接收的时候,嵌入统计流量的代码,并汇总到一起,完成测试后,输出到文本上。
  保存流量数据的工具类
public class TrafficCount {
private static Queue<string> trafficInfo = new Queue<string>();
public static void Add(string s) {
trafficInfo.Enqueue(s);
}
public static void WriteToFile(string filePath) {
StreamWriter sw = new StreamWriter(filePath);
foreach(var i in trafficInfo) {
sw.WriteLine(i);
}
sw.Close();
Debug.LogWarning("成功保存");
}
  在客户端发送请求和接收响应的地方加入流量统计(已发送请求为例,截取了部分代码,这里采用了硬编码的方式,其实不太合理)
SocketError error;
var sended = mSocket.Send(output, SocketFlags.None, out error);
if (error == SocketError.Success) {
obj.OK();
//统计代码
this.Debug("成功发送 {0} 字节数据", sended);
TrafficCount.Add("成功发送"+ sended + "字节数据");
//统计代码
} else {
obj.Error();
this.Error("发送数据失败: {0}", error.ToString());
}
  在主场景上,挂一个MonoBehaviour脚本,来调用开始统计和保存文件
void OnGUI() {
if (GUI.Button(new Rect(0, (Screen.height/2), 50, 30), "流量测试")) {
//监听发送请求和接收返回,获取操作的协议号
EventHelper.Ins.Get<SystemEventGroup>().onRequest.AddHandler((ss, req) => {
Debug.Log(req.Protocol);
TrafficCount.Add(req.Protocol.ToString());
});
EventHelper.Ins.Get<SystemEventGroup>().onResponse.AddHandler((ss, req) => {
Debug.Log(req.Protocol+"成功返回");
TrafficCount.Add(req.Protocol + "成功返回");
});
}
if (GUI.Button(new Rect(0, (Screen.height/2)+50, 50, 30), "保存")) {
TrafficCount.WriteToFile(@"C:VSTest esult.txt");
}
}
  终输出的文本是:
110101
成功发送77字节数据
接收到了55字节数据
110101成功返回
107501
成功发送84字节数据
接收到了28字节数据
107501成功返回
  怎么优化
  · 去除响应包的冗余内容,如排行榜只需要名称,所在工会,等级等数据,并不需要玩家阵型数据。
  · 有些系统,无需每次点击都请求新数据,如排行榜,进入后第一次点击里边的各个榜单会请求数据,在退出排行榜之前,再次切换榜单,会读取旧数据,不再发送新请求。
  结论
  时间段内流量的总消耗测试,建议使用GT类的工具。
  具体协议的流量消耗测试,使用自制工具分析。