Эффективный способ изменить одно значение в массиве repa

Я пытаюсь использовать 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, делаю свои первые шаги, чтобы не знать что-либо или сделать что-то не так (ни в своем коде репо, ни в попытках профилирования) - поэтому я прошу помощи:)

Есть ли какой-нибудь эффективный способ изменить одно значение в массиве repa на каждом кадре? Или, если я хочу добавить 500 баллов на каждый кадр - каков будет ответ?

0 ответов

Другие вопросы по тегам