Re: [请益] 大学期间自学游戏程式的方向与一些问题

楼主: cjcat2266 (CJ Cat)   2019-04-28 11:35:37
继续回昨天没有写到的
"继续自学的话怎么规画学习路径"
游戏开发主题和领域五花八门
呈网状分布,又互相关联
我就以我所知
尽量把想得到的主题、关键字、和例子整理起来
中间推荐的学习资源也都是非教科书格式,能在家自行吸收的
从原文可以看出你的自主研究动力相当足够
所以就依照你的兴趣挑主题,逐步展开发展技能树吧,加油
另外,原文有提出"是否该从0开始造轮子"这个问题
我认为,能够有奢侈的闲暇时间从0开始造轮子练功打底,就只能趁还是学生的时候
有时间有干劲,就冲一发吧,不会后悔的
当你开始工作的时候,就较难找到正当理由重造轮子,而失去打好扎实根基的机会
<软件工程>
基础一定要打稳
常用资料结构、常用算法、软件设计一定要熟
实作游戏游戏系统时,依照需求选对资料结构很重要
例如连结物件ID与物件参考,了解为何用hashtable会较有效率
软件设计方面可以参考设计模式(design pattern)
推荐Head First Design Pattern这本书
但是切记不要掉入"凡事一定要套用pattern"这个思考陷阱里
过度套用设计模式反而会造成不必要的设计阻力
较低阶概念如virtual table实作、内存配置(memory layout),快取(cache)也很重要
光是在除错的时候有能力看裸内存(raw memory)数值,加以解析和操作
就能够打趴一堆人了
组合语言(assembly)不用熟到能够随手写出程式的地步
但是最好知道运作原理和几个常用的命令(instruction)
如此一来便可以有能力开发和除错游戏脚本引擎(script engine)
而且有时候除错时symbol file没有对应到原始档或者根本不存在
只能看组合语言来除错时,有时候还能够继续除错下去,相当有用
很多人遇到这个情况就直接放弃了,这个时候有办法继续除错下去的人竞争力就大
了解compiler怎么把高阶语言转换成组合语言也很有帮助
例如知道switch statement会被转成jump table之后
便可以理解为什么只有case数字连续的情况下分歧复杂度才会是O(1)
若case数字不连续则分歧复杂度与一连串if else一样是O(n)
Compiler Exploerer是个很棒的学习工具
https://godbolt.org/
现在CPU都是multi-core了,去了解各种游戏的平行化(parallelization)运算技巧
例如job system (Unity 2018开始也内建这个概念)
https://www.gdcvault.com/play/1022186/Parallelizing-the-Naughty-Dog-Engine
单执行序的游戏系统,无法用于需要高运算效率的游戏
尽早认知到如raycast这种询问(query)
能够在这个frame发出运算要求(kick request),下个frame处理结果(gather results)
或是同个frame早点kick,同个frame晚点gahter
有助于与其他系统共用平行运算资源,对开发高效能游戏很有帮助
<工程数学>
并不是要学到能够考100分的程度(想当年我微积分也才6x刚好及格XD)
而是要学到理解每个数学工具的运作原理、几何意义、和应用时机
(当年期末考好几题刁钻题其他人解出来,但我自己没解出来,心情相当低落
但同学安慰我说"反正以后老板也不会因为你这几题不会解,就不录用或开除你"
现在想想真是有道理,我的微积分是熟悉到能够在游戏开发方面解题应用自如
为了增加"鉴别度"而设计的考题解不出来,对工作上一点影响也没有)
就算平时游戏开发不一定会用到,多学总是对理解能力有帮助
不然技术文章看不懂,就会落入只能套用人家的公式的境地
游戏需求一有变化,就没办法融会贯通而自己解决稍微有些不同的问题
并且,工程数学底子打好,能够增加自己的"数理胆量"与自信
不会在读技术文章的时候看到数学算式就怕到放弃
我自认很讨厌看过于学术的技术文章
但当必要的时候,因为不会怕复杂的数学算式,还是能咬牙读下去
微积分和线性代数是两个各种paper上都会用到的工具,学好绝对不吃亏
线性代数务必学到完全内化基底转换(change of basis)、奇异值(eigen values)的意义
对于学好游戏graphics有莫大助力
若是能够掌握到矩阵相乘其实是在对行和列做线性组合的概念,会轻松很多
http://bit.ly/2DDFPCy
<游戏应用数学>
高中几何、三角函数、和向量非常有用
能够解决如"两角色过度靠近要如何推开"、"追迹导弹到底是要往左还是往右转"这种问题
进一步能够应用到碰撞侦测(collision detection)
你已经会分离轴定律(separating axis theorem, SAT)了
有兴趣的话可以进一步研究GJK(Gilbert-Johnson-Keerthi)
http://allenchou.net/2013/12/game-physics-collision-detection-gjk/
碰种侦测只是用来回答"两个物体是否在空间中有重叠"这个是非题
如果要进一步将互相碰撞的物体分开,会需要生成碰撞点(contact generation)
GJK搭配EPA(Expanding Polytope Algorithm)可以做到
http://allenchou.net/2013/12/game-physics-contact-generation-epa/
有了碰撞点,碰撞点解析(contact resolution)是真正将物体分开的步骤
做法有很多种,Eric Catto (Box2D作者)倡导的做法是sequential impulse
可以参考他各GDC讲座录影和投影片
理解到sequential impulse其实是在12D平面上反复做平面投影,是内化的关键
http://allenchou.net/2013/12/game-physics-constraints-sequential-impulse/
碰撞侦测又可透过broad phase利用空间资料结构(spacial data structure)进行优化
你已经接触quad tree了
其他值得研究的还有
explicit grid, implicit grid, spatial hash, KD tree, dynamic AABB tree
就算没时间一一实作,研究并了解他们之间的特性与使用时机,也非常有用
常常并非游戏物理直接相关的次系统(subsystem)也会需要用空间资料结构加速
若是轻量级需求,有办法直接inline植入一个空间资料结构是很有用的技能
tween和easing equations也是个不错的主题
这是用内插(interpolation)让各种数值游戏资料圆滑渐变的工具
参考现成open source tweening engine并自己试着实作tween,是个很好的练习
你有提到动画这个主题,这也相当有趣且值得研究
写个能解析并将3D工具输出的动画格式转换成自己引擎能高效能利用的格式
也是个很有趣且有用的练习
途中可以顺便学习四元数(quaternion)其特性与各种内插比较(如lerp, slerp, nlerp)
http://allenchou.net/2014/04/game-math-quaternion-basics
又可以研究叠加式动画混和(additive animatoin blending)
这是能透过组合少量动画素材而生出多样结果的技术,现在大部分工作室都已采用
另一值得研究的主题是locomotion
这个主题要解决的问题是
"给定移动路线,怎么组合动画来让角色跟着路线走,并且要看起来顺畅"
能够让玩家角色和NPC走得好看是门很大的学问
直到几年前,所有工作是都还是用状态机(state machine)实作
从Ubisoft的For Honor开始,越来越多团队开始研究一个叫做motion matching的新技术
其与机器学习又融合出一个新的技术叫phase-functioned neural network
网络上都有影片和文章可以学习
还有个有趣的主题是反向动力(inverse kinematics, IK)
是能够以直接给定骨架肢体末端的目标位置,而反推剩余骨骼该如何旋转的工具
主要的做法有CCD(cyclic coordinate descent)和Jacobian
其中Jacobian结果较准确,但也因为需要用到偏微分的概念,较少人选择使用
读懂Jacobian原理是3D几何与偏微分结合应用的良好练习
利用程式而动态产生动画的技术,统称程序动画(procedural animation)
用这个关键字可以搜寻到很多有趣的主题
再丢一些跟procedural animation有关的关键字
perlin noise / simplex noise (with & without octaves)
numerical springing
<游戏AI>
这领域太广了
所以我就稍微偷懒一下只写现在能想到、感觉有趣且值得研究的关键字吧
behavior tree
steering behavior (pursue, avoid, flock, etc.)
pathfinding
navigation mesh
environmental analysis (heat map, influence map, exposure map, etc.)
audio spatial occlusion
group/squad behavior
<游戏图像(game graphics)>
我推荐看看Real-Time Render这本书
这本像是高阶百科全书,把游戏图像的原理、硬件、数学、各种常见现代技术都介绍一遍
绘图流程(render pipeline)和GPU擅长与不擅长的运算,要了解
遇到有兴趣的主题,可以再自行找资料深究
跟之前一样,我偷个懒只写当下能想到的一些关键字供参考
principle component analysis (PCA) & oriented bounding box (OBB)
hald-edge adjacency structure (这在collision detection也用得上)
triangle/polygon clipping
camera frustum culling
vertex & fragment/pixel shaders
shadow maps
normal maps
forward shading / deferred shading
GPU particles
compute shaders
smooth particle hydrodynamics (SPF)
global illumination (ambient occlusion, reflection, light bounce, etc.)
ray tracing
ray marching
marching boxes / marching cubes / metaballs
visual occlusion
transparency sorting
dithered transparency
order-independent transparency (OIT)
spherical harmonics
light baking / texture baking
imposter
physically-based rendering (PBR)
bidirectional reflectance distribution function (BRDF)
以上,先写到这边
这个量应该够研究好一阵子了
说实在的,若能在毕业以前把上述这些主题都了解一遍(不一定要实作)
毕业即战力与竞争力应属上级
还不去直接申请顶尖的游戏工作室就是浪费才能了
(后60%的主题,我大四毕业的时候还几乎听都没听过咧)
我认为你做得到,加油
[补充]
补推荐Shadertoy
这是个很多高手分享顶尖shader技术与实验的游乐场
https://www.shadertoy.com/
有问题要去哪里问?
想吸收新知要去哪里找?
https://www.reddit.com/r/gamedev/
https://www.gamedev.net/
https://gamedev.stackexchange.com/
https://forums.tigsource.com/
https://www.gdcvault.com/
作者: BeStronger ( )   2019-04-28 11:37:00
佛心来的
作者: md9830415 (DavidHsu)   2019-04-28 12:43:00
以前写分离轴+向量的程式时候写了3个礼拜,一直在想是不是不够聪明之类的,但看完第一篇回复让我觉得,真的先做就对了,做了才知道哪边有问题,把遇到的问题铭记在心,只要持续学习的话总会找到解法第二篇这些关键字跟技术很多都是之前从没听说过的,越看觉得还有好多要学。真的真的非常感谢,第一次收到这么认真的回复,我已经不知道该怎么回应才能表达感谢了。我一定会好好学习,希望有朝一日能追上cjcat的脚步
作者: BeStronger ( )   2019-04-28 15:40:00
Real-Time Rendering会建议看第4版的吗?
楼主: cjcat2266 (CJ Cat)   2019-04-28 15:47:00
我不知道新版有什么不同,不过有新版就看新版吧
作者: willier15987 (Tuantuan)   2019-04-28 18:57:00
跪了
作者: coolrobin (泳圈)   2019-04-28 20:42:00
如果早个十年看到这篇有多好 QAQ
作者: BeStronger ( )   2019-04-28 21:17:00
真希望我现在才大一XD
作者: wix3000 (痒,好吃)   2019-04-28 22:00:00
看不懂推
作者: jackyT (Ubuntu5566)   2019-04-29 00:22:00
CJ猫大大太神 先存一波
作者: kindamark (ㄇㄗ)   2019-04-29 00:43:00
推,获益良多
作者: art1 (人,原来不是人)   2019-04-29 06:07:00
上次看了一本讲游戏破解的书,后面提到Bz在这方面很强应该说bz在侦测破解技术的能力很强,但市面上有这能力的公司好像很少?
作者: eric6300 (死亡旋律)   2019-04-29 10:42:00
作者: NCTU87 (八七)   2019-04-29 14:49:00
推推
作者: newhandfun (新手方)   2019-04-29 19:03:00
厉害。推个。
作者: lanpadick (懒又如何趴又如何)   2019-04-30 07:36:00
这篇有够营养((嚼嚼
作者: riveranb (River)   2019-04-30 18:14:00
朝圣
作者: superweak   2019-04-30 21:48:00
作者: stucode   2019-04-30 23:45:00
作者: RoastSaury (香烤秋刀鱼)   2019-05-01 04:11:00
真希望我大一能看到这篇XD
作者: levelC (LvC)   2019-05-02 01:52:00
太神了
作者: nickchu35 (尼克邱)   2019-05-03 03:35:00
推神解析跟推荐,早个几年看到该有多好哈哈
作者: zseineo (Zany)   2019-05-03 09:38:00
作者: mabinogi805 (焚离)   2019-05-03 16:17:00
26 才看到这篇(叹
作者: Petrichor (莱因哈特利)   2019-05-03 23:57:00
作者: FukadaKyoko (小毛哥)   2019-05-09 10:34:00
到进坟墓都无法理解这么多XD不过推~~
作者: greenick (绿茶)   2019-05-11 11:44:00
羡慕大一就能看到这神回文 营养满满
作者: alibuda174 (阿哩不达)   2019-05-26 12:34:00
推 神...

Links booklink

Contact Us: admin [ a t ] ucptt.com