我尝试使用Gloss.Raster.Array
有效地在屏幕上绘制一组点。它使用一个Array D DIM2 Color
作为点的容器来绘制。目前它是一个 500x500 的数组,代表一个“位图”。
假设每一帧我生成 1 个新点来显示。
我没有找到另一种方法来调整现有的 repa 数组以包含单个新点,而不是执行 repa 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 生态系统有点陌生,迈出了第一步,所以我可能不知道什么或做错了什么(在我的 repo 代码或我的分析尝试中) - 因此寻求帮助:)
是否有一些高效的方法可以在每帧上更改 repa 数组中的单个值?或者,如果我想在每一帧上加 500 分,那么答案是什么?