萤火之森

萤火之森

马上订阅 萤火之森 RSS 更新: http://frankorz.com/atom.xml

2019 年的收获与成长

2019年12月4日 18:50

今年发生了很多事情,博客也因此从七月停更到了现在,实在惭愧…现在趁着年终,赶紧抓住 2019 年的尾巴了,来总结下我的这一年。

本文真的会很啰嗦,但是希望能帮到希望用 Unity 恰饭或者其他技术恰饭的同学。

毕业

今年的上半年完成了研究生的学业,结束了留学生涯。

我的专业课程比较松,总共两年要修 16 节课的学分,但是必修课只有四节,因此我可以尽可能的选择有实战的课程。这边课程的大作业大多需要团队协作,但是有些 IT 研究生同学是跨专业过来的,不是很能写代码,所以有时候挺考验自身能力的(笑。 我组完队一般都希望能把大作业的规模做大些,一方面是作业能拿比较好的分数,另一方面是求职的时候可以拿出能往简历上放的项目经验。

毕业后我发现这种选择是对的,我的队友在毕业后还问我们的线上项目怎么开不起来了,他们也到了找工作的时间,还让我帮忙看了看简历。澳洲工作是很休闲的,大部分下午五六点就能下班。身边同学也在努力地留下来,考 PTE、CCL 考试凑分拿 PR。自己因为还是想做游戏,澳洲环境不太好,就回了国。

从面试到工作

由于课程结束三个月后才能参加毕业典礼拿到毕业证,当时我对求职还不太上心,还想等着春招。但是又不想在家里混吃混喝,就开始每天刷刷面试题,学学感兴趣的,同时也开始在某直聘找工作,打算每周面试一次,接触下当前的就业形势,同时查漏补缺。

第一周

第一周面试了家一百多人的游戏公司,一上来要求三十分钟解一道 Leetcode hard 的题…好不容易解出来了,又要求递归改迭代,又问有没有能优化的点。之后还问了些逻辑题,这时候挺庆幸自己复习了《程序员面试经典(第5版)》第六版刚出噢),基本还能 hold 住场面,但是后来分析算法的时间复杂度分析的十分糟糕,于是就没有然后了…

当天十分沮丧,恰巧面试的地方和一个主美朋友工作的地方很接近,就约了个饭。他开导我说:”拿美术来说,不同公司也会需要不同的美术:古风游戏自然需求专精画古风的,科幻游戏需求的美术风格很明显也不一样。再面试几家就好,今天面试只代表公司不适合你。“我听了很有道理!于是继续不务正业学了喜欢的东西,简单复习复习算法,刷了刷题。

第二周

第二周又接到另一个游戏公司 HR 的面试邀请,面试时直接来了三个面试官,两个程序大佬一个制作人。很明显的,面试风格都不一样。他们事先看了我的简历,看了我的博客。刚好第一周的时候更新了一篇 DOTS 的博文,于是他们一开始就让我介绍下 Unity 的 DOTS 技术栈是什么,还有一些概念细节。后来的其他问题很明显能感觉他们在考察我知识的广度,例如图形学,我简历上提到的 C# 热更新等。

刚好那段时间”不务正业“地跟着《自己动手实现Lua》写了一半的 Lua 虚拟机,于是问到对 Lua 是否熟悉的时候,我就提了一嘴最近在学的东西,接着又展开新的问答。整个过程中,我觉得面试官的风格和第一周公司的面试风格完全不一样,但是有些地方还是答得不够好,于是又在家瞎学。

一周后,我拿到第二家公司的 Offer,成为了公司工具人。

我觉得从面试就能看出公司关注的是开发人员的哪些方面,如主美朋友所说,如果不愿意改变自己学习的风格,那就找到需求这种风格的公司,接下来的工作也印证了这一点。

上面提到的内容

了解代码的另一面

入职后,才发现公司写了一套自己的 C# 热更新,这种热更新是和 xLua 一样的注入式热更,跟 ET 框架分两个项目跑的还不一样(下文会解释)。有意思的是,在我入职过了几个月后,xLua 作者也开源了C# 注入式的热更新项目:InjectFix,作者还配套写了一套 IL 的运行时,听说性能还比 ILRuntime 更好些。

感兴趣的可以先看看 xLua 作者的讲解:

先前基于 ILRuntime 的热更新,例如 ET 框架,大多是分两个项目,主项目和热更项目,热更项目放一些需要经常修改的战斗逻辑、UI 界面等。这样可以直接把热更项目都放在 ILRuntime 上跑,整个项目都能热更,十分方便,但是这样十分依赖 ILRuntime 的性能。

那么注入式的热更有什么区别呢?我们给每个函数前加 if 判断,如果 ILRuntime 上跑的(能热更的)DLL里面有对应的方法,就执行热更的方法,这样 ILRuntime 的性能问题也能避免开来,因为我们可能只有需要热更的函数在 ILRuntime 上面跑,而不是整个项目。

那么,古尔丹,代价是什么呢?
——格罗玛什·地狱咆哮

代价就是能热更的东西极其局限,只能热更函数、和新增的类等。

在了解原因之前,我们先来看看例子,假设我们游戏就这么多代码:

1
2
3
4
5
6
7
8
9
10
// Unity 2019.2 之前,Scripting Runtime Version: .Net 3.5 Equivalent(Deprecated)
public class TestIL : MonoBehaviour
{
void Start()
{
int[] arr = {1, 2, 3, 4};
Action action = () => Debug.Log("Hello IL");
action();
}
}

上面是看上去如古天乐平平无奇的代码,当我们用 dnSpy 反编译 Library\ScriptAssemblies\Assembly-CSharp.dll 后会发现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26...

剩余内容已隐藏

查看完整文章以阅读更多