【游戏编程扯淡精粹】工作第三年总结

工作第三年总结

文章目录

  • 工作第三年总结
  • #1 做了什么
    • 自研路线
    • Lua 脚本系统
    • ToolX
  • #2 职业发展
    • 如何做事
    • 技术中台化
    • 内卷的职业市场
    • 个人成长
  • #3 心态建设
    • Owner vs 打工人

今年仍然是个人成长视角更多一些,额外新学到的重点是,借助团队力量

先介绍两个词:

  1. unk-unk:unknown-unknown的简写,即不知道不知道的事情,它们会偷走项目的时间并且阻塞时间表
  2. low-hanging fruit : 轻易能达到的巨大提升
  3. mere-work : 需要很少创造力并产生很少风险的工作,可以被很容易地评估

#1 做了什么

由于项目保密,笔者开发的一个工具用 ToolX 代称,本文不谈其技术和是什么,其他工作涉密内容也不会讨论

截至目前,正好在当前项目做了一年客户端 Gameplay,半年 QS 天刀引擎,半年 UE5

自研路线

工作的前两年半,笔者下班后一直维护另外一条自研路线

  • Zelo Engine:自研客户端玩具引擎,跑通引擎流程,Lua 脚本 + OpenGL 前向渲染 + ImGui 编辑器
  • Zelo Engine2:目标是现代玩具游戏引擎,Vulkan + Job System + ECS + Server,实际只写完 C++ 反射系统,其他只做完技术选型和跑通 Demo,由于一些原因搁置了,后面会提到
  • Lyra:切 UE5 后,单独维护一个 Lyra 作为 Playground,目前也不太使用了

在这里插入图片描述

维护这条路线,在入行前期有非常重要的意义,一个很好的结果是,工作线和自研线互相反哺

  • 通过自研一个玩具引擎,获得 C++ 实战基础,进而获得下一份工作 // 如果只是项目工作,那就是一年 Python 脚本,估计就很难获得现在的工作了
  • 自研玩具引擎的 Lua 框架和工具链,移植给项目 QS 引擎,让项目的 Lua 变得好用
  • QS 引擎的反射系统,看懂了自己写一个,主要原因其实是面试时没答上来
  • 自研线只有自己一个人提交,保持干净,快速构建,快速实验各种小功能,再移植到项目引擎

在这里插入图片描述

这条线最近半年开始逐渐搁置,主要是:

  1. 项目引擎屎山,做实验的效率低,但是切 UE5 DevOps 逐渐完善后,在项目里实验的效率已经足够高,没必要自己维护一个独立环境
  2. 自研玩具引擎的学习收益到达瓶颈,这些技术规划很好,但是项目里并不需要
  3. 在项目里的工作开始进入好的循环,学习-输出-反馈,逐渐倾向于在项目中输出

Lua 脚本系统

目前项目里的 Lua 模块由笔者一人负责维护

但是实际这个模块的积累早在大二就开始了

  • 大二把 Lua 解释器自己从零完整实现过一遍
  • 工作第一年,自己从零搭建支持 Lua 的引擎
  • 工作第二年,维护 QS 引擎的自研 Lua 模块
  • 工作第三年,切 UE 选型并接入维护 UnLua

这个过程是标准化的,可复制的,学院派-自研玩具-维护项目已有模块-为新项目模块选型维护

在大二写解释器的时候,谁能想到后面会在工作里负责这个东西呢?

这块简单说一下对 Lua 模块技术上的浅显理解:

  • 不只是接入 UnLua 能跑就完了,要提供一整套脚本解决方案
    • 完善的工具链:Debugger,IDE,内存泄漏,Profiler(CPU 和内存 GC),热更新
    • 文档和培训:项目里前 2k 行 Lua 代码是笔者手工翻译蓝图写的,让其他团队成员抄作业
    • 性能优化:benchmark,常规的优化手段(必须有),以及一些先进技术预研(可以有)
    • 方案对比:puerts,其他项目的使用经验
  • Lua 是一个工具,以目前工具链的完善程度,已经比 C++ 迭代 Gameplay 效率高 N 倍,简单来说,就是出活快,不卡版本构建,拿机器时间换程序员时间
  • 去框架化,这次的 Lua 笔者选择不预先搭建框架,而是直接写,堆逻辑,并提供若干实用函数
    • 看过若干也写过一个框架,笔者认为搭建框架的坏处在于,预先定义了若干“角色”,用了框架就必须派生某个角色来写,后面再调整角色就很困难,大多是给屎山打补丁
    • 笔者缺乏上线项目的验证经验,开始搭框架时的设计对未来的预测大概率会有偏差
    • bad:和 C++ 没隔离,跨语言边界交互少不了,潜在的性能问题,这是无框架不可避免的
    • good:开发半年,大概有 1w+ 代码,确实是不需要所谓框架的,用 UE 本身的事件回调就够用了

ToolX

ToolX 是笔者切 UE 后两个月开始开发的一个工具,是市面上某个痛点的第一个解决方案

emm,这个说法怪怪的,但是保密没办法,组内分享的时候主要讨论了技术细节,本文这里主要说说非技术因素

ToolX 大致的开发历程是这样的:

  • 笔者在切 UE 的第一周,开发过程中就模糊地感觉到有这个需求,有意识地去在空余时间做一些预研和方案选型
  • 切 UE 的第二个月,笔者想到了一个绝妙的新解决方法,然后花一天跑通 hello world,周五周会上提了一下,技术总监塔夫哥这块正好有需求,本来在用常规的堆人力 A 方法,需求进度缓慢痛苦,于是开始尝试笔者这条路线,给了一周时间,并且沟通清楚技术创新的风险性,和必须快(速失败)
  • 周六,周日加班,20h 肝第一个 Demo,这个 Demo 的效果已经比另一个项目组 T9 做一个月的方案好了
  • 第一周,搭架子,跑通核心流程,这时笔者比较确定能做完了
  • 第二周,加入一个引擎组同学一起肝,分摊工作量,结束的时候已经能用 ToolX 用于原来需求的生产了,而且需求进度一下子冲到 60%
  • 第三周,第四周,继续完善和开发,最终产出结果,需求进度 100%,ToolX 进度 90%

实际大概是 6 周的时间 x 2.5 人力,完成了这个需求,相比 A 方法节约 2+ 人月,ToolX 持续用在项目内

这个过程中,还遇到 UE DS 网络的问题卡住,非常艰难,最后运气好解决了

这个活的真正难点和关键点,并不是想到了那个“绝妙的方法”

技术和原理虽然是第一性的,是技术创新开头的必要条件

但是支撑把这个方法落地,到最后有很好的产出结果,有很多更加关键的因素:

  1. 运气好
  2. 团队支持
  3. Tech Leader 支持
  4. 技术开发流程
  5. 个人努力和技术积累

运气好,首先是团队有这个需求,没有需求,这个技术是没有业务价值的,Leader 也不会支持

然后是开发过程中,在实际产出一个可用结果之前,任何一个卡点,这个项目就暴死了

这里遇到 UE 网络的问题,就是预料之外的,实际上,当时给的是一个临时方案,笔者后续持续跟进这个问题,半年后也就是最近才彻底解决这个问题,也是运气好,那个时候能在两天内给出临时解决,才让项目进行下去

这里涉及一个风险控制的问题,就是说,技术创新一定是有风险的,风控的核心是在早期排除 unk-unk:

  1. 快速失败,知道最坏结果的恶劣影响,产出是 0,浪费了时间,损害团队信用,所以第一周的工作就是快速排雷,验证没有基本的技术卡点,即编码过程不会有实现不了功能的情况
  2. 即使没有基础卡点,也会遇到意外,这就是运气问题,要尽快跑通实装流程,遇到意外了有一个快速的临时解决

团队支持,两个人力拉出来做这个分支项目,意味着主线项目需要分摊工作量

Leader 支持,在团队内作为信用背书,这点其实也是出乎意料的

这里可以理解为信誉积分和技术品牌,个人有一个积分,团队也有一个积分,当遇到这个关键事件的时候,笔者抵押个人信用,说“我能解决这个问题”,然后团队支持也抵押了一份,事情做成了,个人和团队的技术品牌都得到了提升

技术开发流程,比较基础,前面提到,ToolX 时笔者自己维护一个 Lyra 开始做 Demo,再移植到项目内,包括技术上倾向于 Python 写快速开发原型,都是日常自研习惯积累

涉及到两个人干活,拉分支,做好任务分配和排期,问题跟踪,因为疫情原因,实际上 ToolX 除了开头一个会,大部分时间都是远程办公

个人努力和技术积累,虽然但是,其实是最不重要的一部分

#2 职业发展

如何做事

个人

笔者在 2019 年实习的时候,翻项目资料,仔细看过毛星云写的周报,其实和他开源的文章和项目笔记一样,简单来说,就是认真做事

国内技术环境是相当恶劣的,急功近利的,个人要保持内核稳定,认真做事,不要受环境影响

按功利的角度,写文章分享,写文档,写书,做 ToB,做纯技术就是不挣钱的,毛走了,还有问题问他做了什么游戏,挣多少钱,实际他的技术影响力,留下的这些资料是非常宝贵的

在团队内做事

项目组内是需求驱动的,做了有反馈是最重要的,这样才能快速地深入地做好一件事,避免闭门造车,技术自嗨

自研路线搁置的一部分原因,就是要实现真实的需求,不要实现自己想象的需求

每个公司和团队都有一堆问题,强如 Naughty Dog 在做 TLOU2 的时候项目管理也有糟糕的时候,不要抱怨

技术中台化

之前分享过一篇自研引擎 vs UE 的文章,其实也是因为那个时候项目组也从自研切了 UE,非常突然

文章重点当然不在技术细节规格的对拼,而是技术中台化对个人技术路线的影响

从自研切 UE,个人的一部分感受:

降低沟通成本

团队外技术交流多,有问题可以问项目外的人

技术通用化

笔者做的 ToolX 是通用的,UnLua 也是通用的

一份技术能服务更多团队和用户,当然是好事

UnLua 节约了自研 Lua 框架的成本,切 UE 后一周内就把 Lua 开发流程跑起来了,如果是自研。。

自研技术的未来

其实是比较迷茫的,UE 标杆立在这里

技术通用化,意味着一旦有一个标杆立在这里,新项目选型优先选择中台技术,比如 UE 和 UnLua,不会费劲去再造轮子

个人开发和学习路线,其实优先用好 UE,既然是通用的,就学的快一点,广一点,避免造轮子

这个造轮子,不只是写代码,连 TA 也是一样的,某个效果(Shader 或者物理),优先找现成的

反过来,自研技能会失去锻炼的机会,做游戏靠爱发电,现在做引擎也是,光是使用现成的中台技术,会逐渐丧失底层开发的能力

内卷的职业市场

内卷化,大概是 2019 年的一波红利,在 4 年内基本消失殆尽

现在入行门槛非常高,和最近不景气无关

202x 年,Games 系列上架,先是渲染,再是直接一个现成的小引擎

当初面试 Gameplay 都问渲染和引擎,现在大家人手一个

笔者入行的时候,还没有 Games101,不过也没有卷到引擎岗

第二年重新找工作的时候,引擎岗已经彻底内卷化,几乎没有机会了

这种内卷和门槛高,意味着基本只有校招那一次有机会卷到引擎岗(其他岗位也适用),因为不要求经验

跳槽转岗,招聘方要有相关工作岗位 2-3 年经验的,陷入没工作经验 => 没工作 => 没工作经验的套娃

项目内转岗,实际项目里的工作越来越细分和专业化,比如引擎的活也不会给 Gameplay 做,如前所说,没有需求驱动,进步是很慢的

心态的转变

  1. 进到岗位里,了解组里引擎岗的实际工作内容和水平,笔者对目前项目的引擎岗评价是,积累确实非常深厚,应该以此为目标,而不是校招八股文面试评价标准的好为目标,下次面试就不需要考八股文刷脸过了
  2. 没人能阻拦你学引擎,现在资料开源太多了,不过要谨慎选择路线,避免无用功
  3. 把手头的事情做好,自研引擎和其他技术当兴趣爱好学,硬卷引擎的损耗太大,前有非常专业的引擎前辈坐镇,后有校招后浪的后发优势,市场如此,暂且躺平

个人成长

  • 整体学习方法,没有太大改变,除了砍掉自研线
  • 个人做成了以前做不成的事情,是非常大的突破
  • 其他保密

#3 心态建设

心态建设,很重要很重要,比多写几行代码重要

前一年总结中说到,在低压力的环境下持续成长,这一年基本是保持住了,继续保持

Owner vs 打工人

做 ToolX 的时候,有种强烈的不同的感觉,就是作为 Owner 的自治开发体验

日常需求驱动,是打工人身份,是被动的

做 ToolX,是主动的,从发起,到排期每一步做什么,都是笔者控制的

第一年工作,工作中基本是 mere work,打工的被动感非常强,所以通过下班后高强度的自研路线,获得控制感进行中和

mere work 并非完全不好,它非常的稳定,没有创新,没有技术风险,因为都是市面上成熟的需求

这意味着对风险的控制,作为打工人,做 mere work 是不承担风险的,如果有尽力了还做不完做不好的情况,都是 Leader 的责任,对员工能力评估不准,对需求风险评估不准,还有就是 PUA 员工,因此作为打工人,应该心理压力小一点

这两种工作按照一定比例混合对冲一下,整体的工作节奏就很舒服

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29472.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python生成日报

目录 一&#xff1a;日报生成工具二&#xff1a;日报工具使用方式三&#xff1a;最终日报生成展示 一&#xff1a;日报生成工具 #!/usr/bin/python # coding:utf8class GetHtml(object):def __init__(self):self._html_head """<html><body style&qu…

线性神经网络

线性神经网络 我们应该从线性神经网络开始&#xff0c;去逐步了解深度神经网络&#xff08;深度学习&#xff09;的各种复杂结构和底层原理。 1. 线性回归 用一个线性的模型来拟合数据与它们的标签之间的映射&#xff0c;用于回归问题。 1.1 构造线性模型&#xff1a; y ω…

Hibernate框架【一】——HIbernate框架介绍

系列文章目录 Hibernate框架【三】——基本映射——一对一映射 Hibernate框架【四】——基本映射——多对一和一对多映射 Hibernate框架【五】——基本映射——多对多映射 Hibernate框架介绍 系列文章目录前言一、什么是HIbernate框架Hibernate架构图Hibernate提供的核心功能和…

MIT 6.S081 (BOOK-RISCV-REV1)教材第三章内容

MIT 6.S081 教材第三章内容 引言页表分页硬件内核地址空间物理内存分配代码&#xff08;物理内存分配&#xff09;kinit函数kfree函数kalloc函数 代码&#xff1a;创建一个地址空间kvminit 函数kvmmap函数walk函数kvminithart函数procinit函数 进程地址空间代码&#xff1a;sbr…

Java企业级开发学习笔记(4.4)Spring Boot加载自定义配置文件

一、使用PropertySource加载自定义配置文件 1.1 创建Spring Boot项目 创建Spring Boot项目 单击【创建】按钮 1.2 创建自定义配置文件 在resources里创建myconfig.properties文件 设置文件编码 设置学生的四个属性值 1.3 创建自定义配置类 在cn.kox.boot包里创建confi…

npm发布自己的包

按照上面流程操作

App 启动速度优化

前言​​​​​​​ APP打开的一瞬间速度快慢&#xff1b;就好比人的第一印象&#xff0c;快速的打开一个应用往往给人很舒服的体验。app经常性卡顿启动速度很慢&#xff0c;这无疑是对用户的流失。 启动方式介绍 APP启动的方式分为3种&#xff1a;冷启动、热启动、温启动。…

【服务器数据恢复】RAID5重建导致数据丢失的数据恢复案例

服务器数据恢复环境&#xff1a; HP某型号服务器&#xff0c;5块硬盘组建了一组raid5磁盘阵列。 服务器故障&分析&#xff1a; 服务器在工作过程中&#xff0c;raid5磁盘阵列中的一块磁盘掉线&#xff0c;由于raid5的容错特点&#xff0c;raid阵列未受影响&#xff0c;工作…

服务网格领域的百花齐放,是否存在一个更优解?

作者 lingsamuel&#xff0c;API7.ai 云原生技术专家&#xff0c;Apache APISIX Committer。作者 林志煌&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX contributor。 服务网格是一种技术架构&#xff0c;它用于管理微服务系统中各个服务之间的通信&#xff0c;旨在…

Spring MVC入门笔记

Spring MVC基础知识 1. 创建web应用 新建Maven项目 点击File -> Project Structure -> Facets -> 号 -> Web 修改文件描述符路径为硬盘:\项目名\src\main\存储页面的文件夹&#xff08;如&#xff1a;webapp&#xff09;\WEB-INF\web.xml 修改Web页面路径为硬盘…

Spring Security --- Thymeleaf 中 Spring Security 的使用

目录 初步 获取属性 权限判断 初步 Spring Security可以在一些视图技术中进行控制显示效果例如&#xff1a;JSP或Thymeleaf在非前后端分离且使用Spring Boot的项目中多使用Thymeleaf作为视图展示技术Thymeleaf对Spring Security的支持都放在thymeleaf-extras-springsecurity…

数据清洗、数据处理入门!R语言我来了,数据不再零散!

一、引言 数据清洗和预处理是数据科学中必不可少的一部分&#xff0c;它们能够帮助我们准确地分析和预测未来趋势。如果你曾经尝试过进行分析或建模&#xff0c;你会发现数据往往不像我们所想象的那样干净、整洁。需要对数据进行仔细的检查、清理和处理&#xff0c;才能真正把…

VR全景营销颠覆传统营销模式,让商企博“出圈”

在激烈的市场竞争中&#xff0c;营销成为了商企博“出圈”的重要课题&#xff0c;随着5G的到来&#xff0c;VR全景迈入了快速发展时期&#xff0c;随着VR全景的普及应用&#xff0c;商业领域也逐渐引入了VR全景营销。 时下&#xff0c;商企的营销是越发困难&#xff0c;传统的营…

git安装以及git小乌龟使用

一、下载git 打开git官网地址&#xff1a;https://git-scm.com/进行下载 下载完安装&#xff0c;一直next就好&#xff0c;如果愿意就可以改下安装路径&#xff0c;改在d盘。 具体可以参考&#xff1a;git安装教程 二、安装完下载小乌龟以及语言包 下载地址&#xff1a;小乌龟…

redis到底是怎么样进行渐进式Rehash的

Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。那么redis的底层是如何来存储数据的呢&#xff1f; 一、redis如何在存储大量的key时候&#xff0c;查询速度还能接近O(1)呢&#xf…

DAY 77 [ Ceph ] 基本概念、原理及架构

前言 在实现容器化的初期&#xff0c;计划使用 Ceph 作为容器的存储。都说存储是虚拟化之母&#xff0c;相对容器来说&#xff0c;存储也起到了至关重要的作用。 选用 Ceph 作为容器化存储理由如下&#xff1a; 方便后期横向扩展&#xff1b;Ceph能够同时支持快存储、对象存…

SF授权系统源码 V3.7全开源无加密版本

&#x1f389; 有需要的朋友记得关赞评&#xff0c;文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 2023全新SF授权系统源码 V3.7全开源无加密版本。网站搭建很简单&#xff0c;大致看来一下应该域名解析后上传源码解压&#xff0c;访问域名/i…

全志V3S嵌入式驱动开发(u盘写读)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于现在的soc来说&#xff0c;基本上usb是标配的。它一般需要支持usb host、device和otg三种模式。简单解释下&#xff0c;host模式&#xff0c;就…

STM32F407移植1588v2(ptpd)

硬件&#xff1a; STM32F407ZGT6开发板 软件&#xff1a; VSCode arm-none-eabi-gcc openOCD st-link 在github搜到一个在NUCLEO-F429ZI开发板上移植ptpd的example&#xff0c;因为和F407差别很小&#xff0c;所以就打算用这个demo移植到手头的开发板上。因为目前只需要…

ASP.NET MVC下的四种验证编程方式

ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表&#xff0c;但是在真正执行目标Action方法之前&#xff0c;还需要对绑定的参数实施验证以确保其有效性&#xff0c;我们将针对参数的验证成为Model绑定。总地来说&#xff0c;我们可以采用4种不同的编程模式来进行针…