ET服务器框架学习笔记(二十)
文章目录
前言
本篇简单介绍一下ET中得压测模块
提示:ET5.0中的压测示例比较简单,实际上针对不同业务逻辑需要写不同的压测模块,但是使用方式是几本相同的。
一、BenchmarkComponent
BenchmarkComponent组件的内容相对简单,大体流程:模拟多个客户端,每个客户端向固定端口发送一个消息,然后记录耗费时长等信息。
public static void Awake(this BenchmarkComponent self, string address)
{
try
{
IPEndPoint ipEndPoint = NetworkHelper.ToIPEndPoint(address);
NetOuterComponent networkComponent = Game.Scene.GetComponent<NetOuterComponent>();
for (int i = 0; i < 2000; i++)
{
self.TestAsync(networkComponent, ipEndPoint, i);
}
}
catch (Exception e)
{
Log.Error(e);
}
}
获取地址,外网组件,然后调用2000次循环(模拟2000个客户端同时发送数据),内部调用TestAsync
public static async void TestAsync(this BenchmarkComponent self, NetOuterComponent networkComponent, IPEndPoint ipEndPoint, int j)
{
try
{
using (Session session = networkComponent.Create(ipEndPoint))
{
int i = 0;
while (i < 100000000)
{
++i;
await self.Send(session, j);
}
}
}
catch (Exception e)
{
Log.Error(e);
}
}
每调用一次TestAsync,都通过外网组件创建一次Session。然后内部循环异步调用100000000次发送。
public static async Task Send(this BenchmarkComponent self, Session session, int j)
{
try
{
await session.Call(new C2R_Ping());
++self.k;
if (self.k % 100000 != 0)
{
return;
}
long time2 = TimeHelper.ClientNow();
long time = time2 - self.time1;
self.time1 = time2;
Log.Info($"Benchmark k: {self.k} 每10W次耗时: {time} ms {session.Network.Count}");
}
catch (Exception e)
{
Log.Error(e);
}
}
每次发送完毕后唤醒异步,进行记录,这里记录了每10W次处理的耗费时间,简单的估算了处理能力,当然也可以在这里用其他指标来进行测试。服务器得处理方式也比较简单,收到Ping直接回复,没有其他处理。
至此,一个外网组件的最简单的测试,也可以测试actor等等其他消息,看响应速度等。
**备注:**对于webSocket的压力测试组件WebSocketBenchmarkComponent,与普通的测试基本一样,这里就不做过多解释了,只是一个socket类型与地址不同而已。
二、ET中另外两个服务方式UDP,WebSocket
- WebSocket的实现方式与TCP差别不多,唯一的几个差别就是在开启服务,新建Socket的地方不一样,Tcp中交给Channel,WebSocket交给了Service处理。
- UDP在ET中使用了KCP的方式进行使用,即可靠UDP。UDP处理相对TCP来说更加复杂一点。内部封装了很多状态消息,因为消息接收时可能是无序的,所以还要对这些消息进行二次消息的拼接处理,这样能保证消息的可靠性。
UDP的具体处理我就不仔细说了,对于延时要求较高,可靠性要求较低的游戏可以使用这种通信方式。在一般的MOBA类,或者竞技类游戏中用的比较多,因为节省了握手以及错误重发等机制,所以在不稳定网络中有很好的响应表现。
总结
自此,ET5.0服务器框架中所有的服务模块基本上都简单的梳理了一遍,个人理解可能会有错误的地方,希望后面在具体使用过程中进行纠正。
后续会真正开始使用ET5.0作为框架基础进行开发,当然如果6.0正式版本在我开发初期的话,估计我会马上转战6.0了。毕竟6.0里面的思想更加先进,对理解,使用,以及合作开发上都提供了更加强大的能力。
这里再次感谢ET作者,开源这款强大的C#语言基础的服务器框架,里面很多思想都值得学习。
最后希望在这款框架的帮助下,实现人生价值!!!!!!