今天跟大家伙儿聊聊我这几天折腾的“闪电侠16”,这名字是我自己起的,因为这玩意儿我搞了整整16遍才最终跑通,简直要吐血。
事情是这样的,最开始我想搞一个速度非常快的图像处理程序,灵感来源于之前看的《闪电侠》,那速度,啧啧,简直了。所以我就想着能不能用代码也实现类似的效果,不是真的跑那么快,而是让我的程序在处理图像的时候,也能“嗖”的一下就搞定。
我直接上手,想着先把图片读进来,然后随便做点处理,比如灰度化啥的,看看速度怎么样。结果,代码写出来,跑了一下,我去,慢的跟蜗牛爬一样。这不行,完全达不到“闪电侠”的效果。
然后我就开始各种查资料,看看有没有什么优化的方法。想到的就是用多线程,把图片分成好几块,然后同时处理。这个方法确实有点用,速度提升了一些,但还是不够快。
接着我又研究了一下图像处理的算法,发现有些算法在处理速度上会更快。我就尝试换了一些算法,比如用一些SIMD指令集优化的算法,这个提升还是挺明显的。
但是,问题又来了,这些算法虽然快,但是在某些情况下,效果却不太比如颜色失真,噪点增多等等。这就让我很头疼,既要速度,又要效果,真是太难了。
后来我又尝试用GPU加速,把图像处理的任务放到GPU上跑。这个方法理论上来说应该很快,但是实际操作起来却遇到了很多问题,比如驱动不兼容,显存不够等等。
我各种百度,各种Google,各种尝试,折腾了好几天,总算是把GPU加速跑起来了。速度确实提升了很多,但是代码也变得非常复杂,而且可移植性很差。
就这样,我一遍又一遍地修改代码,优化算法,调整参数,尝试各种不同的方法。每一次修改,都希望能让程序更快一点,更好一点。
期间,我遇到了无数的BUG,有些BUG很简单,比如拼写错误,变量名搞错等等。但是有些BUG却非常隐蔽,比如内存泄漏,线程同步问题等等。
为了解决这些BUG,我各种调试,各种打印日志,各种用工具分析。有时候,一个BUG就要花我好几个小时甚至一整天的时间。
最让我崩溃的是,有时候我以为已经解决了所有问题,结果跑一段时间后,又出现新的BUG。简直是防不胜防。
就这样,我反反复复地折腾,一共搞了16遍,才最终把这个“闪电侠16”搞定。虽然速度还达不到真正“闪电侠”的水平,但是相比最初的版本,已经提升了很多。
我把代码整理了一下,加了一些注释,方便以后维护。虽然这个过程很痛苦,但是也学到了很多东西。以后再遇到类似的问题,应该会更有经验了。
还没有评论,来说两句吧...