针对那些经典的像素游戏设计的自动切图工具里用到种子填充算法的实现。算法
一开始是用递归实现的,后来遇到一些头像之类的比较大一点的图素,运行的时候常常占满C#默认的1M线程栈内存而崩溃。尝试使用各类多线方式改造并无成功,因而干脆改为迭代形式,建立一个Stack本身彻底精确控制其中的数据操做。多线程
这里截取一段改为迭代后的代码,这是窗体的事件处理用cs代码。由于只是个小工具,没有彻底把界面和逻辑分离。app
总结一下递归转迭代的操做步骤:函数
- 初始化函数调用前用到的类的成员变量和常量,放在类的成员变量或者常量直接初始化就能够。
- 初始化在本次调用不变的数据好比这里的延伸距离distance,放在进入迭代循环以前。
- 把递归函数的参数合成一个类型Frame,建立一个Stack<Frame>来代替运行时提供的栈内存。这个Stack根据具体状况能够是类的成员变量也能够是函数的局部变量。
- 压入初始的传入参数帧
- 进入迭代循环,迭代循环基本就是本来函数的递归执行体改造过来。
- 迭代循环中把全部递归调用自身的函数换成新参数构建成帧而且压入Stack。
- 原有的return改为对迭代循环的continue。
- 若是有跳出全部原来递归的须要,在迭代循环中加入break。
- 其余操做顺序维持不变。