浮点数二进制表示

我们都知道浮点数会有精度问题,但为什么会有精度问题?用来表示整数是否会有精度问题?最大可以准确描述的整数可以有多大?这些问题在我们平常开发中也会遇到,想要弄明白这些问题的答案,需要从浮点数的具体表示方式入手。后续会写的一些技术文章也有涉及到这部分知识,所以先开一篇文章从最简单的浮点数表示开始,把这些问题讲清楚。以下均以32位浮点数举例说明,64位同理。

首先我们需要知道浮点数表示由三部分组成,最高位是符号位,表示正负。中间8位是指数位,用来表示后23位有效位的小数点位移。后23位就是用来存储浮点数有效表示的01。

我们先来看看6.75这个数怎么用二进制表示,整数部分6是110,小数部分0.75是11,整体是110.11。整数部分 6是110 是与整型表示是一致的,而小数部分第一个1表示2的1次幂的倒数即1/2,第二个1表示 2的2次幂的倒数即 1/4,如此类推。0.75小数部分11(1/2+1/4),0.625小数部分是101(1/2+1/8)。

Continue reading

《月夜狂想曲》结项感想

《月夜狂想曲》是并入盛趣后做的项目,科乐美恶魔城IP授权, 横版3D的开放大世界玩法。从18年6月份开始做,到现在21年4月结项,接近三年的时间。项目完成度已经很高,对外测过两次数据也不错。IP买了,国内版号也拿到了,这样的情况下突然结项了,实在是很无奈。结项的原因有科乐美的问题,也有盛趣战略调整的问题,涉及保密就不具体展开了。作为程序负责人,从0开始搭这个项目的人,我认为我们程序团队是在有限的人力情况下做到最好的了。本来这个项目能上线的话,不管数据怎么样,至少是能展示我们团队的实力,现在连面世的机会都没有,这三年多的心血,大家的努力都付诸东流,真的非常遗憾。

在这个项目中,我们实现了横版开放大世界的主线玩法,很好的还原了月下的游戏核心。为了保证玩家在一个无缝大世界中随意探索都能有很流畅的体验 ,我们把地图拆分得非常细,场景表现物件都采用异步加载及分帧Instantiate,为了这套制作方式还会做很多配套的工具。另外Roguelike玩法中的随机地图生成也做了很多技术的尝试,处理了很多生产上的问题。强联网玩法上我们采用帧同步技术实现同步战斗,为了更快的传输用UDP重写了帧同步战斗的网络通信,同时做了很多表现与逻辑分离的处理,确保在丢包严重的情况下也能有较好的体验。针对外挂问题做了专门的验证服。项目中涉及到的技术其实非常多,包括各种战斗玩法中多角色多技能多套装的组织, 面向数据的封装,复杂地形的操作补充,客户端安全,资源及代码的热更,实时剧情动画。服务端动态负载均衡、 跨服匹配架构,可线上热更的C++lua服务器,高并发的Go服务器等等。后续会开专门的文章来详细分享具体的技术方案及实现细节。

其实从技术成长的角度来看,这三年也有很大收获,只是差了临门一脚,没法将产品最终呈现给大家看,只能孤芳自赏了。现在B站还有不少去年测试时玩家的试玩视频,也算是露了个面了,以后想回忆的话至少可以看看视频。

创业这六年知识面扩展了很多,对于整个游戏开发无论前端后端涉及到的知识都有了解。对帧同步、大世界这些新发展的技术有攻关突破。但因为人手及时间的问题,很多技术都是做到满足需求后,就要去解决下一个问题了。目前能保证做一款稳定上线的,具有特色玩法的游戏,但无法做到精益求精。另外这几年都是关注gameplay方面的东西,对于渲染以及UE4或者Unity引擎底层的了解也很缺乏。所以未来打算加入到技术前沿的公司,参与UE4的大项目,学习UE4引擎以及大项目的开发模式,努力提升自己。

技术负责人工作思考

从2015年出来创业到现在已经过去5年了, 当初选择出来创业,目的很简单,就是想掌握游戏开发的各个方面,从头到尾做出一款完整上线的游戏。如今最初的目标算是达成了。作为团队的技术负责人, 从最开始的单人做DEMO到现在在盛趣游戏体系内带领游戏开发团队,已完整做了两款游戏,经历了游戏开发的各个阶段。游戏类型上从2D到3D,玩法上从单人闯关到实时同步战斗,大世界,Roguelike等,技术上客户端服务器各个方面都有涉及。 在这五年中经历了很多,也成长了很多。通过这些经历,对于技术负责人这么一个岗位有了一些思考,在此记录一下。

先对我这里讲的技术负责人作一个定义:它是指负责带领开发团队完成项目开发工作的人。需要负责的工作包括技术调研、具体方案实现、代码审核、招聘人员的面试筛选,团队的管理等等。 这样的人在各个公司可能会有各种各样的名称,例如技术总监,主程序等,而在技术负责人下也会设立组长、经理等来分担这些职责。在后面文章中统一使用技术负责人这一个词来做统称。然后所说的项目、产品是指网络游戏。

首先项目开发分为三个阶段:DEMO预演阶段、迭代开发阶段、测试及上线维护阶段。DEMO预演阶段指的是前期产品的构思及预演尝试阶段,以立项为止。项目立项后进入迭代开发阶段,这一阶段就是以既定的方向及版本规划按时完成功能,直到产品第一次上线测试为止。最后是产品测试及上线维护阶段,测试阶段不会涉及太多新功能开发,但需要根据测试反馈结果查漏补缺,而最终上线后还需要考虑产品迭代,线上维护更新等等。这三个阶段不一定是顺序不可逆的,它可能是循环上升的。在不同阶段技术负责人的工作重心也有所不同。

Continue reading

2019年终总结

不知不觉日历就翻到2020了,去年做的事情非常多,项目的变化也非常大,趁着年底的时间梳理一下去年做的事情,也好好思考一下工作上的一些得失以及未来的规划。

2019年是并入盛大的第二年,恶魔城项目在18年10月正式立项,19年一整年就是全力在做这款产品。游戏从最开始的闯关模式到roguelike模式到最终现在的大地图探索模式,核心玩法就换了两版了。除了核心玩法之外这一年还做了多个同步战斗玩法,几十个游戏系统。在这一年内游戏从刚立项的demo阶段到现在已经面对玩家测试过两轮,而且功能都是全新开发的,很多还是以前未做过的,这样的速度不可谓不快了。代价就是今年全年无休的加班,一直996并且除了国庆外所有假期都没放过假。工作很疲惫,无论是团队还是自己做到后面都会有心态不稳的情况。

Continue reading

Unite2019

今年的Unite大会在上海, 跟17年一样在上海国际会议中心举行。时间也一样是五月的10、11、12,又一次跟母亲节重合,出差没法陪家人过节,实在惭愧。今年还是4个会场,内容满满,不停赶场实在是累,不过收获也很多,很值得。项目组今年从过完年开始一直在加班,五月抽空3天去参加会议后回来也一直加班,到现在才有空整理这次大会的内容,在此简单梳理记录一下。

《Unity 科幻巨作《异教徒》影视级技术大起底》

每年的第一场都是类似炫技的主题,今年第一场也一样。主题是Unity最新的实时渲染短片《异教徒》的技术讲解。通过这个CG短片可以感受到Unity最新的HDRP已经做得功能很强大了。皮肤、毛发、眼睛,角色专属灯光等都有非常多的细节可供调整。例如皮肤的斑点,胡渣的细节,瞳孔的底图,反射光等等。除此之外在短片中有一个类似时空穿越的效果是通过环境光切片过度来达到的,也非常炫酷,并且给我们提供了一个做效果的思路。而最新的后处理系统加入了模拟真实相机的参数,例如iso,快门时间,曝光度等等,可以让我们从另外一个维度来调我们希望的效果。

《用刚体控制角色移动的实践》

这一场分享主要讲解的是结合Unity物理引擎控制角色移动的一种思路。首先分析了目前比较常用的三种方式:1. NavMeshAgent;2. Character Controller;3. 动画位移驱动的利与弊。还提到了一个细节,在运用动画控制位移的方法中,如果update与fixupdate同时操作对象的position,而多个fixupdate穿插在两个update中时,直接操作Transform的position会不正确,应该使用RigidBody的position。最后提出了一些利用物理引擎来驱动角色移动的思路,例如利用RigidBody.velocity判断是否浮空,跳跃上升时关闭useGravity,大型角色肢体做成isKinematic从而影响小角色不不被影响,通过设置不同角度的斜面的摩擦系数从而达到不同地形是否可攀登等。不过这一套控制移动方式还是依赖物理引擎来驱动的。我们项目组目前的移动逻辑是建立在Unity的物理引擎上,但只使用了物理引擎的检测判断而不依赖其来驱动物体的,所有的移动逻辑自己实现的,并且以面向数据的形式进行了封装。之所以这样做是因为我们游戏采用帧同步模式来做实时战斗模块,Unity的物理引擎模块底层已经根据DOTS进行了重构,如果依赖引擎来驱动的话是无法保证多个客户端的一致性的。再有就是一些特殊移动规则例如漂浮,正弦曲线移动,类抛物线移动等还是要自己实现或者利用动画驱动。与其自己的代码与引擎代码混杂驱动还不如全部自己实现掌握。

《新一代后期处理栈:Post Processing v3》

与第一场类似的,还是以《异教徒》短片为例子,讲解了最新的PPS v3的功能以及各个参数如何使用,能达到什么样的效果。除了前面说到的物理镜头参数等,还有散射,屏幕扭曲等效果也是很炫酷。网上相关资料很多,就不在此重复了。

Continue reading