Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在更新之间在Elm中保留画布内容_Elm - Fatal编程技术网

如何在更新之间在Elm中保留画布内容

如何在更新之间在Elm中保留画布内容,elm,Elm,我有一个关于Elm canvas的问题。是否有方法防止在每个帧上擦除/重新插入DOM中的画布 我试图通过更改粒子系统(模型)并绘制它来动态生成图像。伪代码看起来像贝娄 我唯一的“解决办法”不是改变粒子,而是不断添加,但我对这种方法不满意 type alias Particle = { ... } type alias Model = List Particle update msg model = List.map updateParticle model view model =

我有一个关于Elm canvas的问题。是否有方法防止在每个帧上擦除/重新插入DOM中的画布

我试图通过更改粒子系统(
模型
)并绘制它来动态生成图像。伪代码看起来像贝娄

我唯一的“解决办法”不是改变粒子,而是不断添加,但我对这种方法不满意

type alias Particle = { ... }

type alias Model = List Particle 

update msg model =
  List.map updateParticle model

view model = 
  collage 900 900
    ((rect 900 900 |> filled bg) :: (List.map drawParticle model))


-- later edit
drawParticle p =
  segment p.start p.end
  |> traced defaultLine
[编辑]
为了弄清楚DOM包含什么,我在上面的代码中添加了
drawParticle
函数。

我在评论中被要求回答我自己的问题。虽然这不是我问题的答案,但这是一个变通办法,而且不是很有效

type alias Particle = { ... }

type alias Model = { particles : List Particle, lines : List Form } 

update msg model =
  let 
    newParts = List.map updateParticle model.particles
    newLines = List.map particleToLine newParts
  in 
    Model newParts (model.lines ++ newLines)


view model = 
  collage 900 900
    ((rect 900 900 |> filled bg) :: model.lines)
什么改变了?首先,
Model
现在保留要绘制的行列表。
update
函数在每个步骤中生成一组新的行,并将其附加到已生成的行中。
view
函数不再渲染粒子,而只是将线条添加到拼贴中

就性能而言,这是一个糟糕的“解决方案”,因为模型中的行数随着每个
AnimationFrame
不断增加

更好的方法是在每次渲染后保存画布的图像数据,并将其用作下一次渲染的背景。但我不知道怎么做


希望这有帮助

评论中要求我回答我自己的问题。虽然这不是我问题的答案,但这是一个变通办法,而且不是很有效

type alias Particle = { ... }

type alias Model = { particles : List Particle, lines : List Form } 

update msg model =
  let 
    newParts = List.map updateParticle model.particles
    newLines = List.map particleToLine newParts
  in 
    Model newParts (model.lines ++ newLines)


view model = 
  collage 900 900
    ((rect 900 900 |> filled bg) :: model.lines)
什么改变了?首先,
Model
现在保留要绘制的行列表。
update
函数在每个步骤中生成一组新的行,并将其附加到已生成的行中。
view
函数不再渲染粒子,而只是将线条添加到拼贴中

就性能而言,这是一个糟糕的“解决方案”,因为模型中的行数随着每个
AnimationFrame
不断增加

更好的方法是在每次渲染后保存画布的图像数据,并将其用作下一次渲染的背景。但我不知道怎么做


希望这有帮助

你能观察到画布被移除/重新插入吗?我希望virtualdom保留画布和所有未更改的粒子,只删除/重新渲染实际移动的元素。不,我没有观察到(不过我可以看一看)。这是我的猜测,但没关系。我希望它能使绘图保持在这一点上,只需添加。不。它没有从DOM中删除。在这种情况下,我不确定Elm在做什么,你不想做?我得到了关于Slack的答案。视图是模型的一个函数。所以历史应该是模型的一部分。你能观察到画布被移除/重新插入吗?我希望virtualdom保留画布和所有未更改的粒子,只删除/重新渲染实际移动的元素。不,我没有观察到(不过我可以看一看)。这是我的猜测,但没关系。我希望它能使绘图保持在这一点上,只需添加。不。它没有从DOM中删除。在这种情况下,我不确定Elm在做什么,你不想做?我得到了关于Slack的答案。视图是模型的一个函数。所以历史应该是模型的一部分。