【学习方法随笔】如何学习大工程中的某一功能
前言:这篇文章也许给刚入行的小白们做一个参考,也算我的随笔,记录下学习历程。入行已久大佬们请出门右拐谢谢。。。
最近在师傅的带领下搞 UE4 自动曝光功能的移植,研究功能就看了两周,但还是云里雾里。直到今天师傅给点拨(点拨了好多次)才总算理解流程和各实现的用法。。。
也发现了自己的问题:面对到 UE4 这样体量的工程,在研究新功能的时候完全束手无策,跟无头苍蝇一样先去钻研各种细节,但弄了半天也不明白为什么要这么搞,所以在这里记录一下如何学习一个新的功能。
在一开始了解一个新功能时,要学会利用调试环境,下断点,看堆栈。第一遍看代码要以理解整个功能流程的目标去看!!!不要像我开始一样一进去就钻细节,尽管实现细节都知道,但完全不明白其中意义一点用都没有。
师傅建议我可以记录堆栈图,看整个流程中每个环节的输入输出,参数在哪里被调用,函数何时出栈等。总之是大概的流程。可以用以下的方式记录下来:
/** 树状图记录堆栈流程 */ //* Function 1 (一般是最外层执行,可选择不记录输入输出) //* //* -->* Function 1_1 (记录输入,输出) //* -->* Function 1_1 END (1_1 运行完出栈) //* //* -->* Function 1_2 //* //* **** --> Function 1_2_1 //* **** --> Function 1_2_1 END (1_2_1 运行完出栈) //* //* -->* Function 1_2 END //* //* ... //* //* Function 2 //* ... (程序继续运行)
以上是示例记录的方法,实际情况可以有所不同,但要保证能记住,能看懂。直到了解大概流程前,一直循环这一步。
以 UE4 4.21 中的 Auto Exposure(也叫 Eye Adaptation)为例,在第一次学习时,应该在处理所有移动端后期的总流程 FPostProcessing::ProcessES2 函数中去看:
1)在这里可以看到在 BloomSetup 过程中,会生成一个亮度图存在 Render Target 1 中,然后进行多次 Down Sampling。
2)Down Sample 操作结束后,引擎会在实际计算自动曝光的地方用到 Down Sampling 之后的结果,用这个 RT 进行整个渲染界面平均亮度的计算。然后结合计算出的结果和前一帧的亮度计算出新的亮度。
3)然后将新的亮度传递给 Tonemapper 进行色调映射。流程结束。
在了解了基本流程以后,则要进入流程中的函数内部看对输入输出的具体操作,更细的层面则要去研究算法,看看为什么要这么做。这需要我们在后续的调试中下更多的断点,并且尽可能一步步的往代码深处挖掘。也要记住时刻记录自己的疑问,但不用太过纠结;很多疑惑会在对代码了解更深之后自然解开。
以上就是我最近的收获体验,感谢刚入行就碰到了很好的师傅带着我学习 ^v^ 受益良多。
如果还有新的想法我会随时补充。