当前课程知识点:游戏程序设计 > 第十六章 《游戏支撑系统 》 > 16.4 游戏支撑系统(4) > 16.4 游戏支撑系统(4)
咱们今天讲一下
这个日志相关的技术点
这日志相关这个技术点
其实挺搞笑的一件事
就是今年的IEG的魔方工作室群的
有那个这个技术同学留用
靠一个题来直接决定的
这道题就是把实习生
给实习生两周的脱产的时间告诉他们
要做一个高可用的日志体系
最后在第一周对吧
第一周回来的时候
一个北大的硕士生就说
我不用第一周就是其中两周的时间
其中中间的中我不用参加后面的比赛
就拿这个跟我跟他们两周比赛就行
我ACM金牌得主对吧
这个日志系统一定做的非常的高效
像他这样的同学还有好几个
为什么最后没有得高分
是因为他们过于看中了其中一个点
这个点是他把算法做的非常的牛
这算法什么牛呢
对吧
我怎样利用这种缓存的体系对吧
这个字符串一共有八种组合的方法
有加号
有什么
我全部都比了一遍
这个是最高效的
后来呢
我发现O一O二O三
o2的编辑开发效率非常高
O3要我把编辑效果都想了
后来我又看了汇编发现有两条语句
是多余的
我把它合并了
摘出去了
然后你看我这个代码里
这个F好热这个F如果换一下
这个效率将提高百分之零点几
对啊
然后swich
如果要用什么方法就会提高的更快一些
然后讲了很长时间
这个东西确实做的很好
但是其实我今天给大家讲这个目的
其实是想说
设计一个小模块
哪怕是一个日志
它绝不是plan一句话是可以解决的
它背后有它自己的一整套体系架构
如果你要想做一个高可用的东西
一定要考虑很多很多的点
我今天其实就摘了一些点
其实给大家分享一下
一个日志体系不是拿着一个plan图
打一个logo这么简单
所以咱们先说一下第一个这个日志
你的可配置吧
因为有些信息是很重要的
error日志
非常严重的告警对吧
有些这种
warn日志还有咱们调试的debug日志
还有现在很不重要的info信息
这样话因为你只有把它区别开了
你后面才能做开关
再当这个游戏跑的很正常的时候
我只打error就可以了或者少量的warn
它都有级别开关呢
当我出现一个问题
要跟踪跟一个点的时候
比如我登录体系怀疑坏了
我可以把登陆的debug信息打开
对不对这个开关只打开这一点
让我去分析到后面是不是有问题
再就是你要支持多种记录方式
你支持不支持js 支持不支持xml
方便不方便
输入数据库
这些都是一个完善的一个知识体系
要考虑的
这就是一个这种海量的知识
海量知识我这个就是可滚动打印
这代表什么意思呢
有些日志
可能瞬间会很很短的时间可以打十几级
或者二十几级
所以第一点呢
你首先你这日志要能滚动
这滚动代表对不对
一个文件你可以给它区别成
一个一G的限制
当它超过一G以后
它应该打在一个地方0001的文件上去
如果01超过1G应该打在02文件里
这样你去分析才会快一些
但有些像这种info信息会非常非常大
你也不能让它0102030405
一直算一下可能零两万了
你不可能有两万G的
所以这种info信息其实达到100
要把前面这最早的那个删除掉
对吧删除掉后面再接着在去打零九
我只保留最近的实际就可以了
实际日志因为这是查bug用的
不需要
很持久化
这个就是
日志体系它也要有容灾
要备份
你必须把非常重要的一些信息
比如我付费的信息
我购买商品的这种信息非常重要
你要打在远程服务器上去
这样的话
在远程服务器可以做什么呢
其实可以做这种数据库的分析
或者快速的查询
它不需要到每个每个服务器去爬去
第三个你得支持跨平台
你要支持安卓吧 支持ios 支持windos
对不对你叫代码级的平台无关性
并且要适用于大多数的主流操作系统
和开发工具
如果语言不相同
那你要起很方便提供库级别的方式
跟别人去调用
还有这个其实这个你设计好了
比你把那些上面做好都很重要
那就是因为大家都知道
在计算机里最慢的就是访问硬盘
对不对访问IO
你不能让他组色组
你如果不想让它阻塞不是你打一个缓冲词
比如说买了满了两兆刷一下
满了两兆就可以简单解决的
一般情况下
你要把它打到另外一个线程
或者另外一个进程里去
为什么这样呢
因为在游戏里
就是你刷的两兆的一百毫秒是等不了的
一定会造成玩家体验的卡顿
就玩家的响应要及时在35毫秒以内
响应回来
所以我们不能把这种日志
写在我们的逻辑的那个线程里面
一定要把它做之事多先写到另个线程里
另外就是它写在另外一个线程里
打日志的那个模块本身
是需要需要支持多线程的
因为要支持多线程
就要涉及到很多很多同步变量的东西
就一些基本功是要考虑到的
所以我今天拿这个小例子就去讲
如果哪天你要去做一个日志模块
你也不要去写
也不要去想有很多现成的开源的框架
你拿过来就可以用比你写的好多了
因为毕竟经过很多很多人验证了
匹配
匹配这块估计大家体验就比较深了
打王者打吃鸡
对吧
把你搓成五人一个房间
31人一个房间一百人一个房间
背后肯定是一套
自己的一个匹配的
匹配的一个算法
但是这个匹配呢
一般要考虑以下这几个点
第一个点是你要考虑这种匹配的扩展性
什么叫扩展性
因为就在一个游戏不同的副本玩法
它是要求这种匹配规则不一样的
有的要求讲究的职业平衡性
有的可能讲究的是战略平衡性
有些讲究的是
就在我这个玩法里面
积分的平衡性就要和战略和什么都没关系
因为战略反映不了对这个玩法操作
操作水准
再就是匹配时长不能太长
如果超过二十秒
你肯定会我会抓狂的
有些时候会填一些机器人
填些机械人帮你打
那最后一个就是温暖局
那最后一个就是温暖局
你打王者荣耀的第一局
你打和平精英的第一局
一定是跟机械人在打
因为你这时候谁也打不过
上来就被人K了
你肯定是不舒服的
这种温暖局得一方面是要教学
一方面是要教育玩家这个这种这种心态
我要更强
差一点
就差一点
其实这里面呢
这种所有的匹配系统里面
有一个技术的一个点
就是我们假设A和B它们俩要打一场比赛
A如果赢了以后给A加多少积分是合适的
所以这个点
这个点
不仅在游戏里有在我们的象棋比赛里
足球比赛里对不对
篮球比赛里它都是有
在我们的经济里面
魔兽世界lol王者里面
都有也都有这种也都会遇到这个问题
所以我觉得数学家是很伟大的
居然可以用一个很简单的公式
把这个问题给通用的解决了
有人听说过没有
大家看过社交网络没有
拉格伯格在评价他们学校的
那个美女受欢迎程度的时候
他在玻璃上写了一串公式
就这公式
就是我们今天要讲的这个Elo算法
非常权威
放到哪里都准
这个算法背后
他是一套基于统计学的一套理论对吧
它背后的理论如果大家对数学
有学数理的可以去深究一下
但是把它呈现给大家的时候
它就很简单
十几行代码解决短短的一小段
短短一小段
这个算法大概这个流程什么样呢
就是
玩家A有一个自己的积分
叫Ra玩家B有一个自己的积分叫Rb
并且当它们比赛完以后有个结果叫Sa
Sa就是A的结果
A的结果代表着
A是赢了得一分
A打了平局得零点五分
A输了得零分
那同样对吧
那个我没写
念出来不好听
也有另外一个对不对
它其实代表了另外B那个玩家
B那个玩家的那个胜胜负情况所以呢
其实这个是一个观念
就是A选手和B选手决战它的胜率是多少
它的胜率就这些公式
就这个公式
因为Ea有a的胜率
B也有B的胜率是Ea加Eb
应该刚好等于几
刚好等于一
因为你赢和我赢了这个胜率加在一起
刚好应该等于一
所以比赛结束以后
A的积分改变的差值
其实就是它这个胜率
和它这个实际胜率的一个插值
乘一个系数K
K在象棋里面低段位低段位里面是32
高段位是16在我的游戏里是40
基本就在这个数之间就可以了
就用它做这种这种积分排名
非常公平大家也是比较认可的
后面讲一个存储相关的吧
我就把后面几页
一起按照版书的形式给大家讲起来
我觉得比较好理解
我这样讲就比较枯燥在这上面
就这个游戏的存储
游戏的登录我一共讲两个这种设计上面的东西
这两个只要你做互联网
就一定绕不开登陆
也绕不开存储
所以它比较通用给大家讲一下存储
但我们常见的存储肯定是对吧
我不用这个
就是放在那个
内存里对不对
memory
它就内存
但我们今天想说的
想讲的是可持久化存储
就是需要落地的
就是这个结果需要你下次下线
需要能显示出来的一个结果
所以今天我们讲一个
学计算机的同学有没有听过这么一个技术
就是当这个进程crach以后
这个内存没有没有被回收掉
如果你在内存里申请一块内存
这个crach技能应就没了
有没有同学了解学计算机的同学
了解知道是什么技术吗
共享内存
叫共享内存
我们叫share mermory
它的好处就是
就算是这个内存crash掉了
我也可以不回收
那其实他很好解决了一个问题
像我们的这种游戏里面
特别是mmo游戏里面天涯明月刀启动以后
三十二级的后台存储
轩辕传奇还有那个
还有那个秦时明月
他们背后都是二十G+的这种存储
如果你没有它
如果你没有它你的启动
第一
你要从第一页load是不可能的
好多G的数据把它捞回来
不可能瞬间启动起来
就down机了
这恢复过程可能是半小时级别的
这就是放在共享内存里
它一定不会丢
这种数据重启接着运算就可以了
那好所以呢
在游戏里大量地使用这种share mermory技术
那它只是在这个
只是说在咱们的内存来缓存一下
那真的要持久有话
大家应该了解
对不对你要入库的DB系统
正常情况下
它要和DB去交流
学数据库的话
你们应该去了解过这个DB
你不是简单的用语句
可能就是就完了
你要考虑最重要就是它的容灾
我出了问题以后怎么从DB把它恢复回来
这块我直接讲这块可能偏工程的
如要想容灾
一般要保证几点
第一要有一个冷热倍
这个大家能不能明白
就是同时还有一个DB2
也在往里面写数据
但它可能不读
所有的数据改变都在那DB二里
它是你的一个备份
如果哪天这个硬盘坏了
ok没关系
切到那个切到另外一个就可以了
第二就是你要定期
你要定期的备份
每天24小时24点的时候
这个DB一定要把它备份出来
备份出来
至少要存在同样存半年以上
你要哪天有问题
至少我可以恢复到任何一个指定天数
零点的数据是很容易把它恢复回来的
那还有一个叫binlog
这个就是基于因为DB
在自己操作的时候
它也会在硬盘里记一个人log
它是基于更细的
我要恢复到几点几分几秒的没关系
就基于log
是可以把它回滚回来的
基本就是靠这三个
但是呢
我在11年第一次在北京
这边做手游的时候
其实就犯了一个错误
这个错误是什么呢
就我的玩家就是大概是一兆左右
一兆左右
就一个玩家的数据是一兆左右
因为我们那个游戏运营到后期以后
每个服平均都有三十万的数据
三十万的数据
那这代表什么呢
这是三百G
这三百G的数据
突然有一天我们的公司的数据库大升级
就我们自己用来做
不要你用了
公司有统一的一个大库管理的
更好的管理让我们迁移过去
这可把我给累坏了几十个服
每天晚上
我从两点我就每天两点
我在公司睡觉两点到到九点
我每天都在迁数据库
因为三百G的数据库
你把它备份出去
再导出来
需要非常长的时间
所以后面呢就学了一个经验教训
到底需不需要三百G
其实它完全是不需要的
为什么因为这一m的数据
它其实我是存的数据结构
大家讲过数据结构吗
就我把整个数据结构都存进去了
都存进去了
如果你要想把它降低
有两个非常好的方法
一个叫序列化
大家知道谷歌那个开源protobuf
大概能理解
序列化的意思是
我只存有效的数据
哪怕我开了一个一千个数组
里面可能就存了三个有效的数据
那我只存了三个
另外
那997个是不需要存储的
它只需要存个类比3就行了
没必要把这一千都丢数据库里
就这一步至少可以降低百分八十以上
我这几个游戏我都看过可以降的
第2个其实就是一个很简单的技术
就压缩那么成熟的一个技术
当时问没有用
这个技术可以降低90%以上
你看这就多少了零点零二
我这三百G乘以零点零二
可能就成了多少了六G
我如果再操作
这个时间我可能就几分钟就完成了
所以后续我在做游戏都给大家去讲
虽然后面是一个大库
你想用多少用多少
还省着点用这个越小对你对你更好
但其实在这个设计里面
其实还存在着一个问题
什么问题
这个游戏的逻辑如果直接访问数据库
这个时间比你访问硬盘还大
比你读一块硬盘还快
因为它毕竟要在mencache里查询出来
再返还给你
它是一百毫秒级别的
但我的业务遇到这种高并发的时候
什么叫高并发down机重启的时候
玩家集中登陆
刚开服的时候
玩开新区的时候玩家集中登陆
它们的压力是很大的
它们的压力是很大的
所以在腾讯体系里面
基本上没有直接访问数据库的业务
大家可以想一想用什么技术
比如说我举个例子
我们CPU是要访问存储的对不对
但我们CPU不能直接访问
那个硬盘这太慢了
中间有一层什么介质
叫内存
其实内存是什么
就是它的一个池子
然后内存有啊啊
有命中算法
它会预测将来谁用的多
谁就在这里面
所以在这个体系里面
整个腾讯里面
无论叫有的叫
有的叫
没关系
都有一个就是内存数据库的概念
就是cache mero
异常简单就是个
就是一个可以把这个数据检索出来
他只需要存储他在里面的10%以内就可以
命中率
绝对能高达百分96以上
这样话你就其实可以解决了
在高并发的情况下
就是当前在线的用户
如果down机了
它才最有可能下一次再启动起来再去登陆
所以在这一块就解决了这种
这种比较大的这种比高并发的问题
这也是一个通用的解决方案吧
整个游戏应该现在都用大家早期
我刚开始刚毕业做游戏的时候
在那个搜狐那家公司
它就没有用这个技术
但是后来后来现在也都改掉了
-1. 1什么是游戏(上)
--选择题
-1.2 什么是游戏(下)
--选择题
-1.3 游戏是如何开发出来的
-1.4 游戏引擎(上)
-1.5 游戏引擎(下)
--单选题
-1.6 如何成为一个游戏开发者
--多选题
-2.1 什么是游戏服务器
--单选题
-2.2 游戏服务器的和分类发展
--单选题
-2.3 核心技术和实现难点
--单选题
-2.4 设计原理与方法论
--单选题
-3.1 三维坐标系统
--多选题
-3.2 向量与运算
--单选题
-3.3 矩阵与线性变换
--双选题
-3.4 四元数
--3.4 四元数
--多选题
-4.1 游戏循环概述(上)
--多选题
-4.2 游戏循环概述(下)
--单选题
-4.3 《无尽之路》的实现
--单选题
-4.4 支撑游戏的功能
--选择题
-4.5 支撑游戏的机制与系统
--多选题
-5.1 基本介绍
--5.1 基本介绍
--单选题
-5.2 随机数生成器
--单选题
-5.3 随机数分布与应用
--单选题
-6.1 什么是游戏玩法开发
--单选题
-6.2 建立愿景 Vision
--单选题
-6.3 划定边界 Scope
-6.4 迭代 Iteration
--单选题
-6.5 迭代 Iteration+抛光Polish
--单选题
-7.1实时图形渲染管道 宏观渲染系统
--单选题
-7.2实时图形渲染管道 应用阶段
--单选题
-7.3实时图形渲染管道 几何阶段
--单选题
-7.4实时图形渲染管道 光栅化阶段
--单选题
-7.5实时图形渲染管道 总结 参考
-8.1 物理回顾1
--单选题
-8.2 物理回顾2
--单选题
-8.3 材质 1
--8.3 材质 1
-8.4 材质 2
--8.4 材质 2
-8.5 材质3
--8.5 材质3
-8.6局部光照
--8.6局部光照
--单选题
-8.7 全局光照
--8.7 全局光照
--单选题
-9.1 动画介绍
--9.1 动画介绍
--多选题
-9.2 游戏动画介绍
-9.3 动画技术类型
--多选题
-9.4 骨骼蒙皮动画
--多选题
-9.5 动画流水线
--多选题
-9.6 动画前沿趋势
--多选题
-10.1 .基本概念
--多选题
-10.2 设计目标
--多选题
-10.3 传输数据分析
--多选题
-10.4 常用同步方案 1
-10.4 常用同步方案 2
-10.4 常用同步方案 3
-10.4 常用同步方案 4
--多选题
-10.5 方案对比
--多选题
-11.1 基本图元
--单选题
-11.2 图元距离(上)
--单选题
-11.2 图元距离(下)
--单选题
-11.3 图元相交测试+ 其他几何方法
--单选题
-12.1 著名物理引擎介绍
--单选题
-12.2 物理引擎原理(上)
--单选题
-12.3 物理引擎原理(下)
--单选题
-12.4 游戏中的物理体
--单选题
-12.5 物理引擎使用入门
--单选题
-13.1开发语言
--13.1开发语言
--单选题
-13.2 开发环境
--单选题
-13.3 腾讯开发组件介绍
--单选题
-13.4 网络通信+业务框架介绍
--多选题
-14.1 进程间通信(上)
-14.2 进程间通信(下)
-14.3 通信格式
-14.4 并发模型
-14.5 超时处理
-14.6 大系统小做(上)
--多选题
-14.7 大系统小做(下)
-14.8 架构层面的技术支持(上)
--单选题
-14.9 架构层面的技术支持(下)
-14.10 分布系统的关键能力
--多选题
-15.1 游戏人工智能综述
-15.2 人工智能在游戏中主要方法 上
--多选题
-15.3人工智能在游戏中主要方法 (下)
-15.4 人工智能在游戏制作中的应用领域1
--多选题
-15.5 人工智能在游戏制作中的应用领域2
-15.6 人工智能在游戏制作中的应用领域3
--多选题
-15.7 人工智能在游戏运营中的应用实践(上)
-15.8 人工智能在游戏运营中的应用实践(下)
--多选题
-16.1 游戏支撑系统(1)
--单选题
-16.2 游戏支撑系统(2)
--单选题
-16.3 游戏支撑系统(3)
--单选题
-16.4 游戏支撑系统(4)
--单选题
-16.5 游戏支撑系统(5)
-17.1 游戏逻辑服务器(上)
--单选题
-17.1 游戏逻辑服务器(下)
-17.2 外挂与反外挂(上)
-17.2 外挂与反外挂(下)
--多选题
-18.1运行环境
--18.1运行环境
--多选题
-18.2物理部署
--18.2物理部署
--多选题
-18.3系统的可运维性
--多选题
-18.4运维案列分析
--多选题