程序出问题,一般有三种:一种是纯粹的软件问题,比如程序奔溃;第二种是性能问题,比如速度慢,内存消耗大等;第三种是质量问题,就是功能达不到想要的效果。
解决问题一般三个步骤:首先问题要能够重现;然后再定位问题;知道哪里出了问题以后,解决问题就是自然而然的事情了。
问题重现分为两类:自己能重现问题和让别人能重现问题。
图形程序的问题定位,一定要可视化每一步的输入和输出。特别是流水线很长的操作,更要可视化每一步中间结果。定位问题是一个实践性很强的能力,需要多思考,多试验。下面聊聊几种常见问题的定位:
图形程序的一个特点是可以可视化功能结果。有些功能的步骤比较长,程序员一口气写完功能,然后运行失败。如果没有图形化显示中间步骤的结果,那是很难调试的。即使功能最终调试成功,如果遇见结果不理想,那也是无法分析原因的。
数据太大的时候,调试模式下程序运行会很慢。可以尝试用小数据来调试程序。
大概分两部分,先找出程序的瓶颈(bottleneck),然后再做出优化决策。
瓶颈位置应该从时间和空间上进行分析。时间方面,找出程序运行慢的时间块;空间方面,找出是CPU还是GPU的瓶颈。思路上有了宏观的把握,下面就是工具的应用了。这里的工具其实很简单,主要是程序运行过程中的各种关键变量的计数器(performance counter)。我们所要做的就是根据这些计数器的数据来分析出瓶颈所在的位置,当然这包括时间和空间上的位置。从计数器上入手分析的前提是你对当前GPU和CPU的性能十分了解和熟悉,比如我的应用程序中每帧有4000个多边形,那么这个数量级的多边形到底是多还是少呢,而且性能与多边形大小,位置等等都有关系,光从这些计数器的数据分析是很难准确定位出性能瓶颈的位置的。常用的分析方法是改变程序的一些参数或者数据大小,再看看程序性能的改变,从而推测出瓶颈的位置,比如增大渲染窗口的大小,如果程序性能急剧下降,那么很有可能是GPU中Pixel Shader和Pixel Engine的瓶颈。这里面有一些常用的方法技巧来定位瓶颈的位置,具体的内容在以后慢慢分析,毕竟从宏观上泛泛而谈才是合适的,微观上具体的技巧需要实验来支持。
定位出瓶颈位置后,下一步就是优化决策:要么改善瓶颈处的性能,要么提升非瓶颈处的消耗,使其在同等性能的情况下拥有更好的质量。具体的做法属于细节部分了。