2017年10月小感

题记:这个是8月份写的一些感悟,怕有道笔记某天给我弄丢了,还是多个地方保存一下吧;
近两年人变懒了,很少写一些文字了;一是时间不允许,来北京将近三年,有个笑话就是很少看到北京的夕阳,也很少看到北京的早晨(ps:下班晚,上班晚);项目一个接一个,我虽不是领导,但是该做的工作也是得做的,竟然很少有空闲;二是人确实变懒了,缺乏总结的激情了,即便工作中解决了一些自己以为很重要的问题,也只是开始坦然看待了,不再写文章记录了;最近又想,人不能一年一年过得不知道怎么过得,雁过留声一下吧,权当人生感悟;
从年后项目开始稳定运行,进入正常运转期,开始有点儿业余时间进行充电;近期学习比较杂,也许是比较焦虑吧,总觉得自己停步不前了。以前无知无畏,最近看了一些外面的技术和招聘需求,才知道自己多么无知,才意识到该学习了。或者有人说,当你的才华不足以支撑你的野心时,就该埋头学习了,事实上也确实有这么些感受。除此之外,还有一些生活不良习惯,总是被各种借口打断学习进程,事实上都没有真正意义学习过。下面是最近看的一些,就当是一些心得吧,以后说不定还需要捡起来认真研究。
1、网络编程,主要是研究了一些nio框架,还有一些原生的网络编程常识。说实话真是荒废了两年,也许借口就是太忙,作为游戏开发人员居然不懂底层,惭愧!看了一下Java自带的socket,Chanel,居然对以前项目中的一些地方又有了新的认识,比如说以前只知道用socket,却很少意识到可以把socket绑到通道进行编程,当然以前也不清楚怎么实现异步,什么是selector,什么是bytebuffer等这些网络编程常识了。研究了一下公司所用的网络框架和比较流行的netty,不敢说非常懂,但是源码跟着示例代码跟了一遍,大概知道怎么回事,真正使用起来不会抓瞎,有一些眉目。尝试着用netty打造进程间通信的基础,实现多进程通信如全球同服的设想。全球同服,概念上很好理解,但是涉及到实现就得考虑很多,如服务器的承载能力,地图之间数据的无缝连接,多进程的交互等。为此自己做了一个小的模块,设计如下,各个服务器向中央服务器汇报自己的服务,然后各个服务器需要有交互需求的时候,可以通过netty进行之间交互。为了保证服务的稳定,我想到了zookeeper,然后就是服务注册,服务发现,然后我注意到原有的内部协议已经有序列化方式,既然netty可以自定义协议实现,比如protocol buff,所以我模仿着pb然后按照我们的规则完成协议定制。最终居然可以跑demo了,也算一次成功的尝试。感谢《netty开发指南》这本书,在业余时间,我迅速浏览了一遍;
当然netty还有其他用处,比如我顺便实现了一个简单httpserver,性能不知道如何,但是却可以很好的分离业务逻辑,暂时留着。
2、网络优化,主要是新项目有个需求,希望在高延迟,高丢包的环境下改善游戏体验。因为之前的游戏都是跑tcp 协议的,看看udp能不能有点儿好的表现。先说需求,游戏的战斗要独立,很多与战斗无关的比如角色位移、甚至不影响结果的一些特效,这些完全可以用最新的数据覆盖旧的未到达的延迟数据,当然还有其他一些场景。深入了解了tcp会发现,在网络恶劣的情况下,卡顿就会很明显,而原因可能是某些无关紧要的tcp包丢失需要反复重传,或者有一些延迟确认等机制导致的卡顿,看来网络是可以优化的。方向有两个,一是优化tcp 协议的相关参数。二是使用定制的UDP协议。
2.1tcp 参数优化,这个在网络编程的地方可以设置,另外,在查询资料的发现了一个很久的对我来说新的技术BBR流量控制算法,只能说很牛逼的算法,已经进入Linux内核。当然了,肯定要玩味儿一下,据说提升了谷歌YouTube很高的吞吐能力,目前没有进行实验测试。一句话概括一下这个算法吧,省的以后忘记,大意就是该算法有效避免了路由器深度缓存带来的不必要填充延迟,而且出现堵塞并不是断崖似的降至慢启动点,而是有策略的快速恢复。已经在chrome浏览器用,可以自己测一下。感觉我刚才一句话没说明白,补充一点,tcp 是君子协议,但是现有的拥塞控制算法是个瞎子,不能很快的感知网络拥堵,而是直到发现丢包才知道可能堵了。但是现在网络中大部分路由器带有很大的缓冲区,所以呢,网络拥堵都是滞后的。
2.2定制udp 协议,让它满足需求。当然tcp 能干的它都得会,而且必须干的更出色才行。我对比分析了几个,最后选择了KCP + udp组合。一个是底层协议,一个是控制算法。KCP是一个ARQ算法框架,本身不进行数据传输,但是可以保证数据的准确性和流量换延迟特性,代码并不多,可以很快的进行接入业务并测试;这里还看了一些一些其他实现方式,比如KCP的netty版本实现,受益良多;当然还看了另外一个大名鼎鼎的raknet,在github把代码clone下来,费了大半天时间,居然也编译通过了,过程虽然坎坷;跑了一个C/S交互的例子,c++语言自从大学学完都还给老师了,不过啃了两天,还算是理出来一些思路,顺便学习了gcc、gdb这套开发环境,为以后应用这个算法算是积累一些基础;强烈推荐一个软件vscode,一款跨平台的编辑器,方便至极;
2.3 其他;在这个过程中,学习了linux进行网络流量的监控及linux对网络的模拟,包括丢包、延迟等各种网络环境的模拟,也算一种学习吧;看来设定一个目标,总会有收获的;
3、开源框架limax学习;前公司一拨人自立门户开发的一个很适合游戏开发的框架,提供了各种平台的开发语言,包括lua,js、Java、C#、Obejct-c;虽然很多理念不赞同,但是学习一下总是好的;整个9月份,为了适应业务需要,对整个框架进行了一些必要的修改,获益良多;
4、Dubbo学习;工作中,有很多时候需要提供一些接口给其他系统或者调用其他系统的服务,以前实现的方式都是从头到尾写一遍交互协议,比如A应用需要调用B的数据,就是A和B定义协议,然后程序员进行底层代码编写处理交互逻辑;费时费力,还不好维护。为了解决这样的问题,研究了一些RPC框架,觉得dubbo不错,开源且文档齐全,社区比较活跃。dubbo将底层交互隐藏起来,双方遵守相同的接口就可以实现数据的交互。当然深入研究,dubbo不仅仅做了这些,不过对我这样的懒人,已经足够了。为了适应业务,稍微对dubbo进行了调整,目前看来运行良好。
大概就这样吧,有时间再进行分开写,主要是需要什么就去研究什么,毫无系统性而言。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值