針對那些經典的像素遊戲設計的自動切圖工具裏用到種子填充算法的實現。算法
一開始是用遞歸實現的,後來遇到一些頭像之類的比較大一點的圖素,運行的時候常常佔滿C#默認的1M線程棧內存而崩潰。嘗試使用各類多線方式改造並無成功,因而乾脆改爲迭代形式,建立一個Stack本身徹底精確控制其中的數據操做。多線程
這裏截取一段改爲迭代後的代碼,這是窗體的事件處理用cs代碼。由於只是個小工具,沒有徹底把界面和邏輯分離。app
總結一下遞歸轉迭代的操做步驟:函數
- 初始化函數調用前用到的類的成員變量和常量,放在類的成員變量或者常量直接初始化就能夠。
- 初始化在本次調用不變的數據好比這裏的延伸距離distance,放在進入迭代循環以前。
- 把遞歸函數的參數合成一個類型Frame,建立一個Stack<Frame>來代替運行時提供的棧內存。這個Stack根據具體狀況能夠是類的成員變量也能夠是函數的局部變量。
- 壓入初始的傳入參數幀
- 進入迭代循環,迭代循環基本就是本來函數的遞歸執行體改造過來。
- 迭代循環中把全部遞歸調用自身的函數換成新參數構建成幀而且壓入Stack。
- 原有的return改爲對迭代循環的continue。
- 若是有跳出全部原來遞歸的須要,在迭代循環中加入break。
- 其餘操做順序維持不變。