【学习方法随笔】如何学习大工程中的某一功能

前言:这篇文章也许给刚入行的小白们做一个参考,也算我的随笔,记录下学习历程。入行已久大佬们请出门右拐谢谢。。。


最近在师傅的带领下搞 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^ 受益良多。

如果还有新的想法我会随时补充。