Unity客户端学习路线¶
和朋友一起合作给工作室后辈写的路线,在这里存个档
前言¶
注:先叠个甲,作者水平一般很多东西都是写着给个参考,一切以自身实际情况为准,深入的东西需要需要自己单独去看
unity跟ue的宝宝都可以看看,有一些八股的共同知识是一样的,只是在引擎上的学习会有区别
因为客户端现在基本要求全栈了,所以这个文章内容干嘛的都可以看一下,爱你呦
本文会加入一些可以了解,但是不是很重要的知识,从重要到不重要会从SSS->SS->S->A->B(就是我们无敌崩坏三的分类👍),六个等级做划分,后面的更多是有些面试官喜欢给你玩压力测试搞你加入的,感谢大家的观看,啵啵😘
注:有些内容没有标注等级,是因为其内容要不是为了找工作必看的,要不是可以干脆直接不学的,我都会专门在开头提及
第一步:C语言¶
首先C语言是非常重要也是非常经典的一门语言,必须说的是电科开始直接让大家学C语言是很有说法的,但是很多人对C语言的学习是一知半解的,就会导致后面根基不稳的问题,至少大家在看这个文章的时候,希望能把我列出来的知识点自己好好想一下,自己到底会不会。
学C语言最重要的是需要理解编程的基本逻辑。
包括说
- 指针和数组(SSS)
数组指针,指针数组,函数指针,const跟指针,sizeof和指针和数组,strlen和字符数组,上面就是基础中的基础,一定要懂内存大小,怎么定义,有什么区别
- 库函数模拟实现(SS)
memcpy,memmove,strstr,strcpy/strlen/strcmp(这三个少,前面三个出现相当频繁,还会出这些函数的变体让你实现)
- 动态内存分配(SSS)
malloc,calloc,realloc,最重要的是malloc跟free的底层实现,这个就牵涉到内存池与地址空间等问题,同时要注意跟new的对比
- 位运算(A)
这个常见于做算法题的时候使用,有很多巧妙的做法需要认识
- 数据存储(S)
整形存储规则,原反补,大小端与如何判断,浮点数IEEE754(这个其实基本没人考),类型提升和截断(腾讯考了两年了,题都不带改变的)
这个有些人可能觉得是计组的玩意,不过我本人觉得应该放在这里更合适,属于不知道的话有人问你就完蛋的程度。
- 自定义类型(SSS)
内存对齐(必考!!!),联合(也会问你联合的内存大小)
其实本来想SS后来想到有个内存对齐。。。
- 认识文件操作函数(A)
fopen,fclose,fprintf,fscanf,fwrite,fread,ftell,rewind,fseek等等
客户端对于文件我目前体感要求一般,不过还是建议多做了解
- 编译链接(SS)
编译链接过程(预处理,编译,汇编,链接),其中牵涉到符号表,全局变量冲突,跟模板声明定义一般不分离也有关系,宏(宏函数怎么写,有什么用,跟inline什么区别等等)
感觉很多面试官都会顺口问你一句编译链接过程()
- void*指针转换(A)
万能类型转换的鼻祖,需了解其设计和弊端,以及在数组中如何做到分配不同类型的内存。为后续了解C++的改进奠定基础。
其他比较基础的函数定义啊,循环,条件怎么写啊,我就不写出来了,相信这个肯定还是会的👍
第二步:数据结构与算法基础¶
大一下要学的就是数据结构与算法基础,这时候学的都是数据结构基础,学校的老师只会给你讲理论不会讲实践,这是非常不好的行为,我个人认为这个时候你们的代码能力相对来说是很薄弱的,需要自己去实现一些十分基础简单的数据结构,一是锻炼你们的代码能力,二是能更深入地理解这些数据结构。
注:现在默认大家只会C语言的状态,所以我说的手撕是C语言做,所以更加复杂的数据结构我会放到后续的面向对象语言中。
同时关于算法我是建议在最后找工作的时候大量刷力扣突破的,所以更多更有实际意义的算法。
关于手撕默认的就是增删改查的操作,所以这个就不每一个都写一遍了
我比较推荐这个时候其深入理解并实现的数据结构包括:
- 顺序表(SSS)
相当的基础,相当的重要,能将这个熟练使用是很多复杂逻辑必不可少的。
- 链表(SSS)
包括单向双向,带不带头结点和十字链表
其实链表用的没顺序表多,但是链表的算法笔试题是真的多就姑且先写个SSS
- 栈(SS)
其实面试没几个人问他的,但是有些笔试题用它有奇效,而且有些神人面试官会不让你用递归,用栈模拟递归
- 队列(SSS)
一定要认识一下循环队列,而且是BFS不可少的
- 堆(SS)
大小堆,topK问题,堆排序
这里插入一个栈帧吧,感觉看过数据结构后了解比较舒服。
extra:栈帧(A)
建议专门去了解一下,可以加深对语言的理解,但是别太纠结,不同编译器的做法都完全不一样,了解就行👍
以下的建议是理解这个结构,建议后面懂面向对象语言后再做实现,只懂面向过程写这几个太折磨自己了()。
后面会再次提到的,当然你电的课会让你背一堆树跟图的算法跟结构,我们就按照自己的节奏来就好
- 树(SSS)
知道概念和结构就好
- 图(S)
知道概念和结构就好
这个时候实际算法会的也很少,但是我建议要学会排序、二分查找、遍历二叉树这种基础操作。
我觉得所有的算法中,排序是最重要的无人可媲美的,所以这里建议可以先做认识
- 排序(SSS)
插入排序,希尔排序,冒泡排序,快速排序,选择排序,归并排序,堆排序,计数排序,基数排序,桶排序
其中快排跟归并是重中之重!
- 二分查找(SSS)
一定要会
- kmp(A)
其实没几个人问,而且实际情况也没多少人用kmp,不过支持学习
注:其中快排跟归排有的时候会考不用递归实现,让你用栈去实现,这个需要注意一下。
这时候算法的基础就打下来了;自己要学的话建议拿着专门的名词去网上搜文章,或者看B站视频
第三步:C#/C++¶
可能有人会问,我不是学unity的吗,这么久了我连引擎都没看到啊,本人倾向于基础大于天,所以会更看重这个方向,大家当然可以根据自身情况做安排👍
不过其实C#大概学一下继承知识语法就可以进入unity的学习了,一起齐头并进是没有问题的。
必须说明一下,我建议unity跟UE都要学c++,c++很接触底层,学习这个对语言的底层逻辑的认知是有很大的帮助的。而且,现在面试客户端c++就是默认必备项目,基本不要想着逃开这个问题。必须说明的是,语言的学习是很无止境的,他的很多底层逻辑可能学明白要很多年,但是也不用那么死磕就是了()
具体这两个语言怎么学,建议是B站找个课看看,或者说是找个书看看。我就简单列一下知识点然后做一下基础说明,同时,等你把语言学明白要的时间太久了,这个过程中你是可以开始后面的进程的,我也建议多个一起学,一直埋头学语言太难受了。
注:希望大家在学习的过程中要时刻思考一个问题:面向对象跟面向过程到底有什么区别?
C++:
- 函数重载(SS)
实用性更大,资料库中有关于函数重载的具体实现方法,可以去看看一下
- 引用和指针(SSS)
指针和引用的区别,引用做参数跟返回值的场景与价值
没话说绝对的重点
- 用const enum inline去代替宏(SS)
宏的缺点,inline跟宏做对比
偷一下侯捷老师的话,不过我感觉写的有点战力崩坏了()
- class和struct的区别(S)
如果是C#他就是SS了。这个最近感觉挺多人问的
- 类的大小计算(SS)
跟上面结构体一个道理,内存对齐,注意空类大小(c++跟c#完全不一样)
- this指针(SSS)
类型,delete this,储存位置,能否修改,类的大小计算算不算上他,怎么传const this指针
有些人会问怎么取消const对象个别成员的const属性,可以去认识一下mutable
- 8个默认成员函数(SSS)
构造和析构,拷贝构造和赋值,移动构造和移动赋值,取地址跟const取地址
cpp的构造屁事一堆,又要考虑初始化列表,又要考虑初始化顺序,还有三类成员必须在初始化列表初始化等等
- 运算符重载(SS)
哪些不能重载?和函数重载啥区别?意义何在?C++的重载原理?为什么要使用extern"C"转C的重载方式?
- new/delete和malloc/free(SSS)
认识区别,认识底层,注意new[]跟delete[]的底层也有些许区别,都要懂。了解operator new和placement new。
-
越界跟野指针等等问题(SS)
内存泄漏,野指针,泄露危害,how to 解决
-
模板(S)
语法格式,模板原理,特化,偏特化,为啥模板声明定义不分离
仿函数没地方写,就放这里了()相当有用,建议学一下
使用价值更大,懂模板的人可以将代码写的神乎其神,最有实际价值的玩意之一,慢慢感悟比较好👍
-
继承(SSS)
什么是继承?切片是什么(切片只支持public继承,很多人都不说我专门提一下)?隐藏,默认成员函数在继承时的情况,多继承,菱形继承,虚继承(虚基表),继承和组合
相当重要啊相当重要
-
多态(SSS)
概念,静态多态与动态多态(也有叫静态绑定跟动态绑定的),什么情况会触发多态,虚函数重写,协变,多态调用条件,析构函数建议是虚函数,构造为什么不行,构造跟析构内为什么不能多态调用,静态函数可以多态吗,内联函数呢,纯虚函数抽象类,多态原理,多继承,虚继承
最想写SSSS的一集,不过别研究虚继承加多态(说的就是菱形继承)的内存结构,没啥必要
-
树(SSS)
为后面STL做铺垫,我们先扭头学一下树👍
定义,递归遍历,层序遍历,二叉树,二叉搜索树,AVL,红黑树,还有数不胜数的二叉树算法题
手撕吧,最好的学习方法
-
哈希表(SSS)
哈希函数,闭散列,开散列,都是怎么解决哈希冲突的,可以去了解一下哈希切分,认识一下海量数据的操作问题
开散列(哈希桶)用的多
还可以认识一下位图跟布隆过滤器
-
STL常见容器(SSS)
序列式容器:string,vector,list,deque
知道底层学会手撕,deque倒是没必要非要写一遍,有人可能会质疑string不是STL的,确实,但是很重要就专门放这里了,这里确认一下,string确实不是STL的,他是STL的祖宗
关联式容器:map/set,unordered_set/unordered_map(C++11),bit_set
前面两组至关重要,同时这个时候你要开始学树跟哈希表了,前面两项其实放在这里比较好,不过结构上不好处理()
容器适配器:stack,queue,priority_queue
了解一下适配器模式,而且这三个都是特定场景有奇效的容器
-
迭代器(SSS)
C++我觉得做的最好的东西,一定要非常懂,手撕STL容器的时候把迭代器也实现了,你会感悟颇丰的👍
面试客户端确实没人问,但是从学习的角度相当有意义,资料库中有相关的实现可以去看看
-
STL常见算法(S)
find,reverse,sort,swap,lower_bound/upper_bound,new_permutation
使用价值更大,做算法题常用
-
C++11(SSS)
体感是问的人挺多的,经常就是,你知道什么c11以及之后的新特性吗?c14后面的看个人兴趣想了解的自己查一下吧,我专门说一下c11的
范围for,右值引用与移动语义(什么是左值引用,什么是右值引用,使用场景,如何提高效率?完美转发,万能引用,move,push跟emplace区别),lambda(用法,原理),function/bind(没人问,但是特别有用),线程库(后面操作系统之后会专门再写一下,不懂线程学习线程库没有意义),STL的更新与变化
-
异常(S)
用法,优缺点
C++的异常库写的太垃圾了,其实没人很关心这个
-
智能指针(SSS)
RAII,auto_ptr/unique_prt/shared_ptr/weak_ptr特点,循环引用是什么,底层实现
现在人把智能指针卷的人均懂底层了,懒得喷
-
类型转换(SS)
四种类型转换
平时背一下就行,有些公司会强制要求必须用这个
-
线程库(S)
操作系统学完了解线程后再看
原子操作, lock_guard与unique_lock,mutex,future,条件变量,无锁队列(可以看看),新特性shared_lock共享锁也可以了解下
-
空间配置器(A)
一级空间配置器,二级空间配置
想了解的可以学学,没啥必要
-
static,全局变量,extern(SS)
补充的笔者喜欢把这些东西放在一起记忆。static、全局变量的作用域,以及如何将变量extern导出到外部使用,感觉还是需要多了解了解的。还有个extern"C"在一些特殊情况下也会使用。
-
其他(未知)
还有内部类,友元等等小的知识点不列举了,大家自行学习吧
请原谅我把C#放到C++后面,因为基于可能ue跟unity的宝宝都会看这个文章,所以先把共有的逻辑放前面了,有些在C++中会学到的共有逻辑在C#就不过多解释了。
说一下,建议大家学之前可以了解一下.net的历史与版本问题,net/.net core,.net framework,.net standard
ps:上面要是我拼写错了,大家可以意会就行(),写的时候实在没想起来这些单词怎么拼()
C#:
- C#基础(SSS)
数据类型与内存大小,数组(二维,交错),访问修饰符,switch,ref out,params等等
专门大概列了几个跟C/C++不太一样的地方,大家记得做一下区分。其实C++也有ref()
- 值类型与引用类型(SSS)
区别,什么数据类型分别是值类型还是引用类型,注意struct
- 装箱拆箱(SSS)
概念,危害,如何避免和优化
这个其实还挺重要的,平时很容易忽略
- struct与class(SSS)
结构体不支持继承与多态,可以实现接口,区分两者关系
想了想还是单独列一下,这两个区别还是挺大的
- 函数重载与运算符重载(SSS)
用法,概念与重写,重定义区分,同时注意区分函数重载与运算符重载
- 属性Property与索引器(SSS)
前面用的特别多,也相当有用,不想分开写太多干脆放一起了。
- 默认周期函数(SS)
构造函数,静态构造函数,析构函数
C#的析构一般不推荐使用,重要的是前面两个,析构建议用IDisposable接口
- using(S)
C#中RAII思想的体现,内部资源非托管,半手动的内存管理方式。
- 继承与多态(SSS)
base与this的使用,密封类,抽象类,虚函数重写,认识一下Object类
毕竟只有单继承,相对要容易很多
- 接口和抽象类(SSS)
接口作用,定义方法,可以有什么类型的字段,支持多继承。C#相比C++还多了个抽象类,有间接实例化、部分抽象、单继承的特点最好记一下。
-
String与StringBuilder(SSS)
注意区别,底层实现逻辑,使用场景,常见api等等。string的一些抽象区分:string.Empty、""、null,为什么避免多次string+=。
-
集合类(SSS)
ArrayList,List,LinkedList,Stack,Queue,Hashtable,Dictionary,HashSet,SortedDictionary,SortedSet,SortedList等等
了解底层,认识api,建议手撕实现一边(如果C++干过了看一下底层代码即可)
C#在实现集合类的时候常常会有两个版本,存储 object 类型(非泛型)与存储指定类型 T(泛型),做好区分,推荐使用泛型版本,非泛型存在大量的装箱拆箱。
而且存在一些线程安全的集合类在System.Collections.Concurrent中,可以自行了解一下
-
泛型约束(S)
定义,组合用法
自行了解一下,在写代码的时候可以用一下
-
委托与事件(SSS)
用法,区别,多播委托,delegate、event。泛型委托Action,Func等
感觉这个才是C#最常见的问题
-
lambda表达式(SS)
用法,延伸的闭包问题
对于写代码帮助挺大的
-
协变逆变(A)
概念,结合里氏替换原则理解
-
多线程(SS)
Thread,ThreadPool,Task,async/await,lock,mutex,Interloacked,Semaphone等等
与C++同理,希望在学完操作系统的线程后再学习这个,更能理解这到底是在干嘛
-
反射(A)
System.Type、System.Reflection.Assembly和 System.Activator
C#非常有特点的一个地方,用的场景可能会稍微少一点,但可以通过这个了解认识一下元数据的概念。有些地方会通过反射信息动态获取对象执行函数。
-
特性Attribute(S)
定义,底层原理
跟上面的反射一起可以认识认识元数据,一些特殊情况会通过自定义特性去实现。
-
网络库(SSS)
Socket的用法,常用api,原理(去看计网再回来)
跟线程同理,建议学完计网再回来学,很羡慕C#有自带的网络库啊。(没有epoll的多路复用,建议还是和C++放一起看)
-
LINQ,XML与Json操作(A)
用法,语法
了解即可
-
P/Invoke(S)
定义,用法
现在做游戏用pinvoke调用C++代码的情况还挺多的,可以专门去学一下
-
GC(SS)
.net的GC,Unity的GC
现在很多面试官莫名其妙会问你.net的GC具体是什么样的,虽然我始终觉得没必要特别懂.net,但是这部分内容建议去详细的了解学习一下
-
C++与C#交互(A)
当你C++与C#都学会了,可以从从底层理解一下C#动态库的本质,并且自己制作C#库、C++库,相互之间调用一下。
-
IL2CPP的大致原理(A)
为了更深入底层、可以了解Mono、CLR、il2cpp等原理,知道JIT、AOT是怎么运作的。、
-
其他(未知)
一些比较细小的点没有多将,比如sealed,readonly,?等等,还有C#要学的更底层是不可避免地要去了解.net底层框架的,这个其实对于游戏开发的意义不算特别大,感兴趣可以自行了解
注:语言的学习一定不要拘泥于怎么用,更多的需要你明白为什么。
C#是C++后写的,很多总感觉C++学过了,C#会纠结要不要再写一遍导致有些结构上混乱这里致歉了()
第四步:Unity基础¶
这里在你C#的基础语法学的差不多就可以开始了。虽然是Unity基础,但其实也没那么基础()
因为Unity的知识相当的多,我就简单说一些相对重要的
- 常用API(SSS)
事件函数(生命周期函数),GameObject,Transform,Vector2/3,Input访问输入系统的接口类,Message,Animator动画组件,Time时间信息的接口类,、Mathf数学函数类,Random生成随机数的类,OnMouseEventFunction鼠标回调事件,Coroutine协程,Invoke延时调用,Rigidbody刚体等等
大家能看到这里肯定是经历过招新,做过几个自己的游戏项目的,但可能只是认识几个基础的api,可以趁机进行一下知识的复查
- UGUI的基本学习(SS)
RectTransform基础概念,Anchor相关知识,,Canvas三种渲染模式,最常用的UI适配,渲染层级的基本概念,九宫格切割操作,lmageType参数和应用,Text、Button、 Toggle、 ToggleGroup、 Slider,Scrollbar、 Dropdown、 InputField的使用,水平及垂直布局常见问题
- 学习动画系统(SS)
动画参数,混合树,动画器重载,根变换身体变换,动画事件,状态机,动画过渡,动画层同步
先知道上面暂时是够的,进阶的话去认识:目标匹配、IK.,PlayableAPl. 定义状态机、动画系统优化等
其实我建议用DOTween,而且Unity的动画系统做的太烂了。。
- 常用插件(SS)
DOTween,UniTask,TextMesh Pro,Cinemachine,Odin,Toolkit等等
有些插件因为过于好用已经被unity官方招安了()
- 存读档(SSS)
二进制,XML,Json
现在常用的还是二进制,做存档的话后面两个已经被抛弃了
第五步:操作系统¶
先说一下虽然他在语言后面,但是不代表他是必须在你学明白语言之后学,建议是学明白多态继承之后
就可以开始看看操作系统了,这门课很多东西初期会让你觉得用不上,没啥用,但是他算是一个连接器,连接上你学过的不同知识,也可以为你们的一些曾经的疑问做解答,而且Linux中有相当多的数据结构的实现,如果你了解的话完全可以抄到自己的项目中去用,都是成熟经过长期验证的方法,非常好用👍
操作系统跟计网都面对一个问题,有些知识点可能几百年没人问,但可能突然哪个面试官想给你玩压力面试就恶心你一下,所以这里会做大量的分级,大家酌情进行学习就好
因为我比较建议大家去配一个Linux环境进行学习,所以最开始会说一些Linux的一些使用问题,真不想整跳过就会好
- Linux基础(S)
首先,请了解一下系统调用的概念,区分与库函数的区别,理解库函数的跨平台问题
因为要学会使用Linux,所以建议去认识一下Linux相关指令,进而牵涉到关于Linux权限的认识
这里建议是去组个服务器然后使用Linux去一边实操一边学习
-
进程(SSS)
-
PCB(SSS)
概念,可以去认识一下里面的一些变量结构,最重要的在于硬件上下文的理解,次要的可以了解一下进程状态,进而认识关于僵尸进程,孤儿进程
-
进程调度(SS)
这个课本上一般会将几种常见的思路,但是都不是具体的真实的情况,感兴趣的可以去了解一下Linux 2.6引进的O(1)调度算法,其中会考虑到优先级,进程饥饿问题去保证整体的效率
-
进程地址空间(SSS)
区分不同的区域,
如果好奇的话可以去认识一下里面的内核空间是什么,进程地址空间与可执行程序的编址,后面的动态库链接等等都有密不可分的关系,同时可以思考一下页表的结构
-
进程控制(S)
创建(fork),终止(exit),等待(wait),替换(exec*)
创建牵涉到os的写时拷贝与缺页中断的逻辑,终止牵涉到一个程序最重要的退出码与异常信号相关内容,等待牵涉对于子进程资源回收的问题,替换解释了将代码加载到内存的逻辑
-
进程通信(SSS)
匿名管道,命名管道
System V IPC(本地通信):System V 消息队列,System V 共享内存,System V 信号量
POSIX IPC(网络通信与线程通信使用):消息队列,共享内存,信号量,互斥量,条件变量,读写锁
System V基本被淘汰了,所以建议大家可以把侧重点放到对POSIX 的学习
-
进程信号(A)
信号产生方式,处理流程,底层的block,pending,handler表
想了解的可以了解一下,在处理信号的时候可以认识认识关于内核态与用户态的概念
-
虚拟内存(SSS)
区分虚拟内存与物理内存,认识一下页表,快表,这个非常重要。虚拟内存的作用原理最好也完整的了解一遍
- 页面置换(SSS)
常见的页面置换算法,重点LRU会手写,了解缺页中断的时机与原因
- 软硬链接(S)
了解概念,使用场景,注意这里不是说的链接动静态库
- 动态库与静态库(SSS)
区别,链接加载过程,动态库相关有fPIC,GOT等等的一些概念,可以做一下了解
-
线程(SSS)
-
概念(SSS)
跟进程做好区分,Linux是没有线程的,只有原生线程库,理解线程的优缺点,认清楚一个进程中的不同线程的共享资源与私有资源是什么,尤其是注意线程是有独有的线程栈的
-
线程控制(S)
看一下Linux的线程库函数都有啥,也对后面了解C++与C#的线程库函数有帮助
-
线程的互斥与同步(SSS)
互斥,同步,临界区,临界资源,原子性,锁,条件变量,生产者消费者模型,信号量,线程池,自旋锁,读写锁(读者写者问题)
-
线程安全问题(SS)
引发原因,什么是可重入不可重入,STL容器是否线程安全?智能指针呢?
-
死锁(SSS)
死锁四大条件,银行家算法,死锁检测算法
-
文件管理(B)
内存文件(认识文件标识符,缓冲区之类的),磁盘文件(ext2的文件系统等)
后面网络有个五大IO模型更加重要一点,因为我发现客户端对这个的要求基本没有,就不多提了
- 设备管理/IO管理(B)
I/O控制方式(轮询、中断、DMA)、设备分配策略、SPOOLing技术
这个我真没见谁问过,就不特别谈论了
-
高速缓存(SSS)
数组为什么比链表读着快,L1、L2、L3的位置,各部分高速缓存又存了什么,如何提高缓存命中率,什么又是缓存一致性?
注,操作系统一般是进程管理,内存管理,文件管理,设备管理去进行学习,内存学习我进行拆分画在了进程与页面置换上,同时一般也会学习一些系统调用的用户接口,这些都分化在不同的功能中,就没有特别提及具体接口,目前展现出来的大概就是这样的结构,可能设计上不太好,有意见的可以随时私聊跟我进行探讨。
操作系统零零碎碎的东西太多了,有很多内容属于我不知道要不要写进来的水平,所以先写几个特别核心的,更加深入就看大家自己了,这里推荐一本《Linux内核源码与设计》可以去看看。
第六步:Unity进阶知识¶
这时候一般客户端就会开始进一步接触游戏项目如何完整去写,会尝试用自己已经有的储备知识创造合适的一套逻辑,用不起眼的算法和缓存改善性能,这时候就需要学很多游戏相关的逻辑了。
从面试找工作的角度将,这些内容一般都没人问,而且相对来说难度都不小,所以时间紧迫直接跳过到下一步也可以,但是这确实是unity的一些进阶知识,从学习的角度上来讲都是值得去了解一下的内容
注:其实如果感兴趣可以去了解一下手机游戏的制作,因为创建安装项目是牵涉到Java的,如果时间充裕且感兴趣是可以去了解一下的
- 进一步学UGUI跟UGUI的优化(S)
Canvas和Graphic的关联,网格重建的逻辑,UI射线的执行逻辑,UGUI合批规则,计算,排序,UI和3D之间的渲染关系,图集的意义跟如何制作
- Unity性能优化(SS)
DrawCall相关知识,UnityProfiler性能分析器,模型贴图优化,LOD技术,光照贴图LightMapping,Mesh合并等等
这些很多牵涉到图形学的理解,在unity中会用其实就可以如果想了解原理,后面的图形学学习可以进行callback
- AssetBundle包(S)
AssetBundle的定义跟作用,AssetBundle的加载跟使用,资源依赖关系和依赖打包,Manifest文件,从内存加载AssetBundle,AssetBundle的卸载
- Unity资源热更及代码热更(SS)
ILRuntime,HybridCLR,xLua等等
有些人可能会问Lua,Lua的语法与相关知识非常简单,需要关心的也就是一个元表跟GC的内容,以及如何用Lua实现面向对象,自行了解就好
- ECS与DOTS(S)
ECS的理念,可以用DOTS开发一些游戏项目
- 物理引擎原理(S)
虽然你看不到源码,但基本的功能设计得知道。3D是Phyx,2D是Box2D,也可以去看看网上的一些文章讲解。
本人水平有限,有很多可能不太了解的()别来骂我()
第七步:网络¶
根据这些年的一个趋势,相比第一版我把网络的优先度提前了,做了一些调整。
对于网络问的深度与重视程度很多取决于你面试的项目组采用的网络同步方案,如果是帧同步这种更偏向客户端逻辑的,对网络的要求就会比较高,相反如果是状态同步这种偏向服务器逻辑的就基本没啥要求,可能会问你带你八股相关的问题等等
- 网络基础(SSS)
OSI七层模型,协议,七层模型与操作系统的对应关系,报文,socket编程的api,序列化反序列化,json
注意这里都是认识一下简单的概念就行,socket的api认识完可以简单的去写个upd/tcp的服务器,其他的只是为了后面做更详细的学习打下基础,七层模型与操作系统的对应关系:应用层,表现层,会话层是用户层,也就是用户自己编写的,传输层与网络层就在操作系统里面实现,数据链路层在底层的网卡驱动程序中,最底层的硬件就是物理层。
- 应用层(B)
HTTP的报头格式,各字段作用,cookie与session,
因为是客户端,这些属于是了解就行,甚至不了解都行()
- 传输层(SSS)
UDP/TCP的报头跟各字段作用(特别说一下,不用关心那个16位校验和),TCP的确认应答机制,超时重传,快重传,紧急指针,滑动窗口,流量控制,拥塞控制,拥塞窗口,慢启动,延迟应答,捎带应答,保活定时器,三次握手,四次挥手,TIME_WAIT,CLOSE_WAIT
除了三次握手,四次挥手基本不是特别重要,基本就是问你TCP的机制是什么,我单纯的全写上了罢了()
会有一个经典问题是用UDP实现可靠传输,基本就是在应用层抄一下TCP机制就行,了解全面会更好
- 网络层(A)
IP的报头跟各字段作用,子网划分,子网掩码,区分公网与私网IP到底是什么,为了解决什么提出来的,NAT技术,内网穿透,内网打洞,报文分片
NAT之前的可以具体了解一下,后面的单纯列出来了,不学也可以
- 数据链路层(A)
Mac协议,ARP,RARP,认识一下MTU限制,以太网,令牌环网,无线Lan,交换机原理
其实我觉得这个跟应用层做一桌的,学不学都行
- 五种IO模型(SS)
阻塞IO,非阻塞IO,信号驱动IO,多路复用,异步IO
这个主要是想让你们学一下多路复用,就是select,poll,epoll,可以写一下相关的服务器逻辑
- 网络同步(SSS)
帧同步,状态同步,状态帧同步
最后那个了解一下就行,前面的可以具体学一下,做几个demo去亲身体会一下,不写代码只看概念很难真的学明白网络同步,最后会有个做项目的说法,那里就建议大家选一个同步方法做个大型项目
网络编程方面始终要记住,不动手写一个具体的方案永远都是纸上谈兵,不可能真的学会
后面的内容我就不标等级了,要不是为了找工作必看的,要不是可以干脆直接不学的,我都会专门提及,就不特别说明了。
第八步:设计模式¶
其实我一直在犹豫将设计模式放在哪里比较好,在没有写过见过大量代码前,设计模式是一个不可能理解的内容,所以我最后选择不断的滞后,放在这里,这个东西很多确实无法理解,十分考验大家的代码量
其实很多面试也不会问你设计模式,但是我还是建议大家多了解一下
- 七大面向对象设计原则
开放-封闭原则、依赖倒置原则、里氏替换原则、单一职责原则、接口隔离原则、合成复用原则、迪米特法则
- 设计模式
外观模式,单例模式,中介者模式,桥接模式,策略模式,模板方法模式,状态模式(有限状态机FSM),厂模式(简单工厂、厂模式、抽象工厂),建造者模式, 元模式,组合模式, 命令模式,责任链模式,观察者模式,备忘录模式,访问者模式,设配器模式,代理模式,装饰模式,享元模式
(二创作者吐槽:没必要全了解,理解几个常用的就行了,有些设计模式根本不是在游戏开发中会用的)
- MVC
这个专门列出来,Unity相关的面试会比较经常的问这个,有可能延伸到MVVM。
可以去看看资料库,都做了相关的说明
第九步:高阶数据结构¶
这一步属于是可学可不学吧,看个人想法,有一些比较进阶的数据结构,可能后面刷算法题会用到,也可以当作跟面试官聊天的资本,看个人情况,不过其中有个LRU是建议大家一定要看看的
- 图
储存结构,邻接表邻接矩阵,图的遍历BFS,DFS,最小生成树,最短路径
-
并查集
-
LRU
这个我很建议去学一下,有些面试官会让你手撕这个,而且这个是个经典的笔试题
- B树
概念,实现,B+树,B*树,应用
了解就行,随便找个视频看看就行
- 跳表
个人建议就是看一下前三个,后面两个看个人兴趣
第十步:算法进阶¶
这个时候要学的就很杂了,比如最常见的比如A*、FSM、背包等等;然后你就要开始在力扣刷的题不能
跳过困难题了(但是太难了还是跳),而且需要知道一些技巧性算法(哈希、BFS、DFS等等)
必须说明,算法还有比如递归,搜索,回溯,动规,贪心都是要长期学习的。
然后你差不多把我下面列的算法大概都刷懂一半多,就可以去找个工作试试了,你现在的水平已经可以秒杀绝大数应聘者了
因为这个就是为了过笔试必须做的,我就不写等级了
注:资料库有我写的算法题目推荐,也是这几个知识点,可以去参考着做一下
-
双指针
-
滑动窗口
-
二分查找
-
前缀和
-
位运算
-
模拟
-
分治——快排,归并
-
链表
-
哈希表
-
字符串
-
栈
-
队列+bfs
-
堆
-
BFS
解决FloodFill算法,解决最短路问题,多源BFS,拓扑排序
-
递归
-
深搜,回溯,剪枝
-
记忆化搜索
-
路径问题
-
动态规划
多状态dp,两个数组dp,背包问题(01,完全)
-
子数组,子串,子序列
-
回文串
-
贪心算法
建议去看资料库的算法题目推荐,比这个写的更加详细,这里一笔带过了
第十一步:图形学¶
图形学我不是专业户,所以我也就只能说建议看一下Games101就行,看个光栅化,光线追踪什么的其实就行
二创作者来补充一下:
客户端就是需要了解一下整套渲染管线流程:
- 应用阶段:准备数据,提交DrawCall,交给显卡处理
- 几何阶段:顶点着色器、曲面细分着色器、几何着色器、裁剪、屏幕空间变换
- 光栅化阶段:生成图元:比如扫描线法,重心坐标法(这个经常会问你如何判断一个点在三角形内)。可能顺带问一下MSAA反走样
- 像素处理阶段:片元着色器、透明测试、深度测试、模版测试、透明度混合
知道前面每个阶段主要干点啥就行了,再不济你自己去做一个简单渲染器上手也差不多能了解了。
注意:其实图形学你真不学前面的内容可以学好是没有问题的,不用游戏引擎也可以学。再深一点就是引擎和TA的路子了,这个主要面向客户端就不讲了。
第十二步:计算机组成原理¶
这部其实是最难的,也是绝大部分时候真的用不上的,叫计算机组成原理,其实可以直接跳过不学,学的话,内容包括冯诺依曼机、存储器原理、指令原理、CPU、IO与中断,汇编语言等等,这些在实际工作中用的地方无限接近0,面试会考但是不会刁难(除非想挂),考试倒是考的难但是正常面试不会考那些计算,自己斟酌就好。
推荐和OS一起学,也没必要将其单独区分成一个独有的概念。
第十三步:做项目¶
这里是建议大家有空可以做一个大型的项目卸载简历上,可以用之前你们会的所有的知识,C++做个服务器,C#用在Unity客户端,用上网络同步方案,用上框架,用上ECS、ACT动作系统、完善的技能系统等等,做一个属于你自己的大型游戏,写个渲染器啥的也可以加分。
至于gamejam的作品其实没啥可参考的,体现不出技术水平。可以作为奖项写在简历上,但面试时问的很少了。
第十四步:看自己¶
这时候(或者跳过计组)就已经对计算机基础掌握80%了,记不住都没啥关系,除非你考研,不然很多计算都不会被问,问的绝大部分都是理论(而且和实际工作关系不大),这时候你就可以理解更高级的算法了线段树、树状数组、各种图论算法、各种树算法都得记住;在游戏方面,这时候完全可以跳开传统的各种逻辑框架,根据游戏项目灵活调整逻辑,自己创造逻辑。
后面的就都不是必修了,而且每个人根据兴趣都不一样,可能是软件工程、游戏引擎、编译原理等等,这就靠自己想不想学了(但是时间成本摆在这了)
大概整个思路就是这样,也欢迎大家批评指正