文章目录
1. 服务器处理消息优化
1.1 我们完善我们的账号登录错误ErrorCode
我们需要足够多的ErrorCode来方便我们客户端进行UI提示
因为客户端只有知道错误原因,才好去处理我们的消息
1.2 确保在 reply() 完成之后才能进行session.Dispose()
之前我们是直接调用Action委托的repy()方法,然后Dispose掉我们的Session
但是reply是通过网络发送消息给客户端,如果发送到一半被直接断开,客户端就接受不到消息,一直在等待
这里我们编写帮助类 DisconnectHelper
我们使用拓展方法来开启异步协程安全释放我们的Session
将下面所有的Session用同样的方法进行释放
1.3 解决用户多次点击登录 多次消息处理的bug
我们创建一个Session锁的组件
然后我们在消息进来的时候,判断session是否有SessionLockingComponent组件
然后我们把后面的 异步逻辑块 用using关键字括起来,使用完自动remove释放dispose我们的SessionLockingComponent组件
为什么是异步逻辑块?异步逻辑块是否执行完是不容易判断的,如果按同步的逻辑去处理,那么就会出问题。因为我们必须得让这条消息处理完了,才能进行下一条消息逻辑
前面3中的验证账户密码的正确性是同步逻辑,是直接执行完的
而下面的异步逻辑,是需要时间的
1.4 解决两个客户端同时登录并且使用相同的账号和密码
两条消息都会进入处理阶段,然后在数据库根据账号进行查询,都是为0,然后同时创建account账户,然后同时存入到数据库。
那么,当他们下次登录的时候,同学A可能会去登录到同学B的账户里面,会造成数据错乱
这就是数据库里面最重要的一个概念,就是唯一值,我们必须得保证账户是唯一的,才能避免这些情况的发生
使用协程锁
锁的是异步逻辑
进入这个异步逻辑,就会锁上,直到执行完,才会解锁,让下个逻辑进来
加个协程锁的类型,为我们的Account
同时这个协程锁必须是唯一的,我们得有唯一的id进行标识,那么此时session登录消息的账户名的hash值,就是最好的id
1.5 对一些组件使用完及时释放
比如我们查询数据库的临时实体变量,我们在不使用之后,就得进行判空然后dispose释放掉资源
1.6 在客户端避免玩家多次点击按钮
首先我们进入EUIHelper,在这里我们为按钮添加自己定义的listener
然后我们找到调用我们客户端登录事件的方法
我们把同步的添加Listener的方法,改为我们刚才的拓展方法
这里我们需要的参数是一个Action委托函数,所以我们这里使用lambda表达式,这个()=>{}里面的,就是我们传入进去的函数
然后我们就发现,我们需要的参数是一个需要返回值的异步函数,所以我们得修改我们的登录方法,将它从同步的调用Login,改为异步
这里面我们拿到服务器返回消息的ErrorCode,然后进行下一步处理
1.7 数据字段和逻辑进行分离
进入EUIHelper,在这里我们为按钮添加自己定义的listener的时候,我们定义了一个isClicked的静态字段,但是这个类是在HotfixView层,不允许存在数据字段
我们进行ModelView层,将字段复制到这里
我们把他定义成属性
然后我们得在这个UIEventComponent进行Destory的时候,置为false
然后定义给他赋值的拓展方法
现在我们将使用这个UIEventComponent单例来判断是否点击了UI