在repa数组中更改单个值的有效方法

时间:2016-03-27 22:02:31

标签: arrays haskell repa gloss

我尝试使用Gloss.Raster.Array在屏幕上有效地绘制一组点。它使用Array D DIM2 Color作为绘图点的容器。目前它是一个500x500阵列,代表一个'位图'。

假设每帧我生成1个新点来显示。

我没有找到另一种方法来调整现有的修复数组,以包含一个新的点,而不是像traverse那样看起来像这样:

{-# INLINE traverseFn #-}
traverseFn px py = (\lookupfn i@(Z :. x :. y) -> 
    if x == px && y == py then red else lookupfn i)

newarr px py = R.traverse oldarr id (traverseFn px py)

我怀疑这可能会变得相当低效:为了一点而遍历整个500x500阵列。但我想也许ghc会做一些优化魔术并且它赢了。

原来是这样的。我试图描述,它说newarr需要97.2%的时间。它也很慢。

我对整个haskell和修复生态系统都有点新意,采取我的第一步,所以我可能不知道某事或做错事(无论是在我的回购代码还是在我的分析尝试中) - 因此寻求帮助:)

是否有一些高效的方法可以在每个帧上更改repa数组中的单个值?或者,如果我想在每一帧上添加500点 - 那么答案是什么呢?

0 个答案:

没有答案