俞哲祺

创建日期2019-03-08 12:44
最后修改2024-08-16 14:00

俞哲祺

教育背景

  • 浙江大学2013.09~2017.06:本科,计算机科学与技术学院,计算机科学与技术
  • 浙江大学2017.09~2020.03:硕士,计算机科学与技术学院,计算机技术

工作经历

网易(杭州)有限公司2016.07~2017.07:游戏客户端开发实习生。

  • 网络位置同步(C#/Lua)

杭州相芯科技有限公司2018.03~2020.03:算法工程师(实习)。

  • ViolaJones人脸检测
  • 纹理优化
  • 2D人脸特征点检测

杭州字节跳动江南工作室 2020.04~2024:星球重启客户端开发。

  • 二进制配置表
  • 建造系统
  • 服务器物理数据可视化
  • 面向外包外派的保密工程
  • 营地岛屿系统
  • 红点系统
  • 物理破坏
  • 性能优化
  • Mini项目中实现了一个帧同步游戏

专业技能

  • 使用语言:Lua, C#, C++, Python, Java/Groovy, Linux Shell(熟练程度由高到低)
  • 专业技能:数据结构与算法,操作系统,编译原理,图形学,深度学习
  • 其它:Unity,DX11,ECS,Jenkins,Tensorflow框架,CMake,QT,Perforce

获奖经历

  • 2019.03 PAT甲级100分

主要项目经历

2020.04~2024.08:建造系统的开发与维护

底层设计

接入了Unity DOTS提供的ECS功能。渲染部分使用ECS来做GPU Instancing(蒙皮和点光有特殊处理)。物理单独在引擎一侧支持直接使用PhysX,避免GameObject开销

制定相关Prefab制作规范,包括Prefab的层级结构,命名规范,材质选择,放置目录等。增加了资源的自动化检查

资源入包方面有专用的CI任务来生成ECS的二进制数据,支持分包,支持按需进包

实现了一套动态加载机制,支持更多的同屏物件以及在远距离能看见大致轮廓。大多数参数接入分级,可供配置

效果层面的优化:实时AO,雨影,TextureStreaming,软光栅遮挡剔除

特殊支持的材质替换/修改功能,避免原生Renderer修改后会产生很多材质实例。替换的材质特殊支持TextureStreaming

基于高度图的地形高度编辑和地表材质编辑

逻辑设计

数据一致性处理:给建造操作设计了一套基于序号SeqId的数据通信机制,支持多人编辑,部分操作支持回退。

动态加载处理:实现近景,远景的互相切换;实现远景数据的缓存和加载

扩展性处理:游戏内一共有4套建造机制,可以自由适配不同机制下不同操作的检查规则的异同,也可以支持更多

断线重连处理:在断线的时候对部分物件进行保留,直到重连失败或者服务器数据有变动才清理掉

一些其它优化:

  • 简易BVH,来处理形状特别不规范的物件(楼梯,弧面,三角锥…)
  • 由于全逻辑是Lua实现,在Unity的PhysX一侧单独加了接口来加速物理查询
  • 支持挂接Component来实现其他功能(交互,特效,机关等)
  • 支持建造物件配置为可游泳状态

上层系统

  • 蓝图功能,支持加载,保存,分享,套用
  • 支持填充蓝图和自由摆放
  • 支持自由视角和跟随人物视角
  • 自动摆放下一个
  • PC适配

2020.04~2024.08:二进制配置表的开发与维护

为了降低数据表占游戏中的内存以及降低包体大小

实现了一套完整的二进制表配表的工作流,包括导表、序列化、运行时(C++/C#)、运行时(Lua),同时部分表支持Patch功能

导表层面自动收集可以支持二进制化的表格,产出一份文件列表,每张表各产出一份中间产物记录数据和元数据。也可以手动指定某张表需要导出二进制,支持从Lua产物倒推中间产物

有自动触发的CI任务将导表结果里可以二进制化的表生成二进制数据

运行时支持懒加载,支持MMap

Lua一侧用lightuserdata的metatable来保证和普通LuaTable的访问写法一致

部分文件支持patch,独立计算diff,独立生成patch文件,运行时有独立的代码处理patch的读取

无法维持Lua原生语义的部分,指定编码规范避开

开发版本支持编辑器开关,支持通过reload的方式切换回Lua模式;线上版本支持Hotfix

支持一种特殊的ELua类型,实际就是一串可执行且返回table的代码,这部分也支持二进制,并且有缓存

支持自动测试(数值是否准确,hotfix功能,数据拷贝)

适配项目的高低配/PC方案

2020.04~2024.08:服务器物理数据可视化的开发

设计方案为嵌在服务器内部,通过服务器启动参数控制。在服务器进程上单独开一个线程用来可视化,利用的是PhysX的内存可在进程内共享

记录的是物理操作,包括 创建/销毁场景 创建/销毁/移动碰撞体 物理查询。主线程同步点在物理update末尾,子线程同步点在帧开头

主要功能:

  • 调式服务器的物理,主要用于排查技能效果问题
  • 查看服务器每个场景的物理数据
  • 不同层级可以不同颜色表示,不同层级可以单独显隐
  • 查看物理查询的可视化结果

2020.04~2024.08:面向外包外派的保密工程

基于P4的面向外包的加密开发方案落地

C#,Lua提供dll和字节码,引擎同学支持了从dll里生成MonoScript,兼容原版的从cs生成

资源提供Unity处理后的artifact文件,引擎同学支持了直接读artifact

Shader:ShaderLab用AssetBundle打包,非ShaderLab使用的内部的打包加密

落地使用了P4的import机制,拼接分支,并开放部分内部目录供外包人员提交

负责CI任务维护,协调QA工作

2020.04~2024.08:性能优化

实现并替换ToLua的loadfile和dofile,实现的是无GC版本

小地图大批量静态图标显示优化,降低Canvas重建和UI框架带来的overhead;主界面部分控件接入PreZ

利用二进制配置表配合资源系统消除路径字符串在Lua跨C#时产生的GC,C#内部使用无GC的string来避免加载资源带来的GC

建造系统优化,面数,耗时,内存,GC

2020.04~2024.08:其它系统开发

营地岛屿系统

供8人社交互相拜访的系统。主owner负责开发和协调人力

  • 成员操作,申请/踢出/邀请
  • 拜访他人,申请/邀请,退出/请离
  • 活动,篝火派对
  • 照片墙,场景内物件,可以自由展示照片,点赞
  • 留言板,场景内物件,可以留言,删除,点赞
  • 摩天轮,场景内物件,可以乘坐,换位置,换皮肤,换视角
  • 岛屿建造,可以摆放物件,编辑地形
  • 岛屿蓝图

庄园系统

个人家园空间,可以进行制作/分解,可以进行建造

  • 庄园建造
  • 庄园蓝图
  • 庄园里的灯可以开关
  • 庄园可以发布展示
  • 拜访他人,申请/邀请,退出/请离,留言/点赞

其它Owner系统

  • 基于3DUI的血条控件,有虚血状态,支持条形和圆形
  • 物理破坏系统。实现游戏内基于物理的破碎效果。接手功能,主要解决以下问题:碎块通过对象池复用,回收后结构未恢复原状;通过Review发现的对已回收的对象的修改问题
  • 红点系统。接手功能,主要解决以下问题:老设计侵入界面且命名有众多潜规则,改成逻辑和显示分离;排查问题困难,新增可视化工具
  • 客户端贴地系统。目的是弱化服务器物理数据带来的误差,让实体的模型能够真的贴在地表上
  • 客户端触发器Pot。以主角为目标的触发器,当主角进入/离开范围触发
  • 随身放置。简单的在主角周围一定范围内摆放物件需求
  • 麻将玩法。可碰杠,不可吃

有过开发的系统

  • UI控件。图片相关的控件,开发过自定义材质相关的内容;3DUI图片控件开发
  • 交互系统。一个基于交互系统的,下线后可以记录中间状态的三段式交互框架
  • 输入框。UI控件的负责人,制定并统一了文本检查的规则(限长,过滤字符…)
  • 公会居住。将岛屿/庄园搬入公会特定场景的功能,同时保证原有场景内有的功能在新场景也能继续使用。主要处理建造的远景,以及原场景相关静态数据的迁移

2018.12~2020.03:2D人脸特征点检测

基于3000FPS算法的特征点检测算法,在原有基础上进行数据增强后效果依然不佳,因而调研深度学习方法。

基于旷视的ShuffleNetV2论文,实时回归检测人脸的2D特征点。

增强数据使得模型支持:多光照,多角度,多表情,遮挡。

压缩模型大小使其移动端可用

2018.09~2018.12:数据集,底层人脸检测模型维护

训练流程规范化。

数据集扩充后人脸检测以及3000FPS特征点检测的训练与调优。

针对误检,检测失败等问题的处理。

2018.07~2018.09:基于KinectFusion的纹理优化

使用KinectFusion得到的3D网格和RGBD照片,优化每张照片的相机参数,从而恢复3D网格每个顶点的颜色信息。

利用图形流水线中的Vertex-Pixel映射关系,对Pixel的颜色差优化最小二乘的能量方程。

增加非刚体变换项修正镜头畸变。

实际使用中由于本身是一个Coarse-to-Fine而不是从0开始的过程,RGBD中的D信息可以不使用,深度图可直接使用流水线渲染的z-buffer。

2018.03~2018.06:ViolaJones算法的参数调优

新算法上线之前过渡算法的参数调优。

在相同误检的情况下,提高了检出率。

为了解决不同角度的问题,将一个模型分成若干个独立模型。由于算法本身的效果有限,Haar特征对变化的稳定性较差,因而改为不同类型的数据独立训练。

独立模型在各自的测试集上效果明显提升。

产品化时动态选择其中一个检测模型进行检测,相当与将原本一帧的任务分摊到多帧。

2017.06~2017.07:LuaJIT内存分析

获取每个Lua对象的引用关系,主要用于检测内存泄漏。

原有工具适用于Lua,由于项目使用的JuaJIT,将整个项目往JIT迁移。

统计table,userdata,function,thread,string等需要GC的对象,整数等非GC对象不在统计范围内。

对象占用的内存大小包括结构体头部,自身数据以及对其它对象的引用信息,但是不包括,其引用对象的大小。

2017.01~2017.06:网络位置同步

实现了状态同步(同步坐标)以及客户端部分的平滑插值。

分离需要插值的状态更新和不需要插值的状态更新的接口。

出于服务器性能考虑发包非连续,客户端解决了突然收不到包以及突然收到包的中止问题和冷启动问题

整合普通移动和由其它原因产生的位移,提高衔接连贯性

实现了基于NTP的时间同步算法,用指数衰减保证稳定性

其它项目经历(课程设计,个人兴趣)

2018.09~2019.01:LR-编译器

实现课程级别需求的语法输入,词法分析用简单的正则匹配,主要实现语法分析。

给定语法,生成每个符号的First Set和Follow Set。

利用First Set和Follow Set,生成对应的LR1DFA。

利用DFA中的每个状态,生成状态转移表,并检测Shift-Reduce冲突和Reduce-Reduce冲突。

给定输入符号流,输出语法分析步骤,在错误处停止。

项目地址:https://github.com/pw1316/LR-PlayGround.git

2018.03~2018.04 2018.09~2018~10:Monte Carlo Path Tracer

实现基于光线追踪的离线真实感绘制。

基于CUDA的GPU实现,实现重要性采样,Blinn-Phong的BRDF,透射球的BSDF。

后续改成D3D11的Compute Shader实现,并增加了CPU上预计算的KDTree实现求交加速。

项目地址:https://github.com/pw1316/MonteCarloPathTracer.git

2017.09~2017.12:SoftRender

基于区间扫描线z-buffer的软渲染。

在CPU上模拟VertexShader的投影变换,利用区间扫描线对面片进行光栅化,实现逐面片的Blinn-Phong光照。

项目地址:https://github.com/pw1316/SoftRender.gitdev和polygon分支

2016.06:Browser-Server课程设计

网页客户端的即时聊天程序。

数据库使用MySQL;后端基于Apache+PHP;前端使用原生JavaScript。

Ajax实现异步加载,定时刷新来实现消息的同步,session实现简单的登录。

项目地址:https://github.com/pw1316/WebInstantMessaging.git

CopyRight(C) Zheqi Yu 2016-2024