【问题标题】:Is it possible to optimize this floodfill algorithm any further?是否有可能进一步优化这个洪水填充算法?
【发布时间】:2016-05-21 13:31:41
【问题描述】:

这是它的小提琴:https://jsfiddle.net/rujbra6y/3/

我已经记录了速度,因此请进行任何更改,然后重新运行几次,看看性能是否有所提高。

已经为此工作了几个小时,但我想不出还有什么可以改变的以使其更快。我希望它尽可能快,因为目前当用户使用floodfill 时会有一个小的延迟,并且为了获得适当的用户体验,我希望该延迟尽可能短。

我可以使用更多优化或技巧来提高速度吗?

【问题讨论】:

  • 如果你能描述一下这个算法应该做什么,那就太好了。您能否向我们介绍一下您的实现并用最重要的代码示例进行说明?
  • 是的,有可能,但它可能更适合姐妹网站codereview.stackexchange.com
  • @procrastinator:这只是一个标准的洪水填充。 en.wikipedia.org/wiki/Flood_fill
  • @procrastinator:我不明白。你还想要什么信息?我花了一段时间制作这个小提琴,这样人们就可以很容易地知道我在做什么,并立即测试他们所做的任何优化。这个问题需要一段时间来准备......
  • 如果有兴趣,你可以看看这个小提琴:jsfiddle.net/gamealchemist/gTa4r 你会发现威廉马龙的洪水填充实现,和我的。 Rq :我的实现使用Uint32Array 来加快速度。

标签: javascript html canvas optimization flood-fill


【解决方案1】:

您可以一目了然地做几件事:

  • Uint8ClampedArray 替换为Uint32Array。这将使您免于不必要的移位和 ANDing 操作
  • 将 push/pop 替换为堆栈指针,这样您只需更新实例
  • 您可以使用固定大小为堆栈定义类型化数组 (Int16Array)(确保足够大)

对于 Uint32Array,您唯一需要注意的是字节顺序是 little-endian,这意味着您需要以 0xAABBGGRR 格式提供目标颜色(或者进行初始位移,给出 r,g,b作为单独的值)。

通过这些更改(最后一项除外),我的计算机(目前为 i5)上的代码从大约 69-75 毫秒降至 58-61 毫秒。

Updated fiddle

我将把类型化数组留给堆栈作为练习。 :-)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多