Wolfram mathematica Mathematica图形中的闪烁和双缓冲问题

Wolfram mathematica Mathematica图形中的闪烁和双缓冲问题,wolfram-mathematica,wolfram-cdf,Wolfram Mathematica,Wolfram Cdf,Mathematica如何处理图形显示的双缓冲?是自动完成的吗 我问这个问题的原因是,当我做一些动画时,根据动画的速度,我注意到屏幕上的图形正在更新时,令人讨厌的闪烁。当我放慢速度时,我可以减少这个 我将在下面展示一个简单的例子来说明我的意思,并询问专家是否有关于如何减少闪烁的建议 此示例围绕一个圆绘制一个点。在动画运行时,您会注意到闪烁。i、 球的运动不平稳。降低速率时,闪烁减少。但我认为应该有远离,以减少闪烁,即使是什么率高 Manipulate[ ( pt = {Cos[n], Si

Mathematica如何处理图形显示的双缓冲?是自动完成的吗

我问这个问题的原因是,当我做一些动画时,根据动画的速度,我注意到屏幕上的图形正在更新时,令人讨厌的闪烁。当我放慢速度时,我可以减少这个

我将在下面展示一个简单的例子来说明我的意思,并询问专家是否有关于如何减少闪烁的建议

此示例围绕一个圆绘制一个点。在动画运行时,您会注意到闪烁。i、 球的运动不平稳。降低速率时,闪烁减少。但我认为应该有远离,以减少闪烁,即使是什么率高

Manipulate[
 (
  pt = {Cos[n], Sin[n]};
  Graphics[
   {
    {Blue, Thickness[0.01], Line[{{0, 0}, pt}]},
    {PointSize[.08], Red, Point[pt]}
    }, PlotRange -> {{-1.5, 1.5}, {-1.5, 1.5}}, ImageSize -> 200]
  ),

 Control[{{n, 0, "Run"}, 0, 1000, ControlType -> Trigger, 
   DisplayAllSteps -> True, ImageSize -> Tiny, AnimationRate -> 1, 
   AppearanceElements -> {"ProgressSlider", "ResetPlayButton", 
     "PauseButton", "StepLeftButton", "StepRightButton", 
     "ResetButton", "FasterSlowerButtons"}}],

 SynchronousUpdating -> True
 ]

所以我的问题是:事情应该是这样的吗?或者,即使速率未设置为“最优”,是否也可以使用技巧和提示使动画更新运行更平稳(减少闪烁),Mathematica是否在内部使用双缓冲来更新图形

我在Windows7上使用的是V8.0.1,64位

谢谢

更新1 我想我的问题可能提得不好。由于我没有直接使用Animate,所以任何事情都不能怪Mathematica。我现在使用RunScheduledTask[]来更新计时器,并且在每个计时器实例中,我在图形中绘制新的绘图。很难用它来做一个小例子,所以在上面,我只是用了触发器。所以,在这种情况下,我不能使用RefreshRate,因为我现在并没有实际使用触发器

我在看不同的网页,讨论更新屏幕的这些问题,比如这个和其他,这就是我问的原因

这是我现在制作的一个CDF,用来制作一个双摆的动画,你可以看到,如果你把delta_t变大(这是找到ODE的数值解的每个间隔之间的时间),屏幕上的动画显示有很多闪烁(或者你喜欢使用的任何术语),重点是,这是不容易看到的眼睛,并希望找到如果我可以做些什么来防止这一点

这是你的电话号码

您还可以使用鼠标更改钟摆的位置,以便更清楚地看到闪烁的效果

感谢您指出RefreshRate,但在我当前的实现中似乎无法使用它,因为我不再使用Trigger,原因是如上所述的问题

我想我现在只需要保持较小的增量

更新2

这是我用来更新图形的代码部分

.......
Dynamic[Refresh[Graphics[
   {
    Line[{{0, 0}, bob1}],
    Line[{bob1, bob2}],
    {PointSize[.05], Red, Point[bob1]},
    {PointSize[.05], Red, Point[bob2]}
    }, graphicsOptions
   ], TrackedSymbols -> {update}, UpdateInterval -> v]] 
   (*updateInterval does not help with flicker*)
....................
上面的“更新”是scheduledTask在我控制的每个时间间隔更新的变量

更新

我想我展示了我看到的一个小程序,它在Java中也可以制作一个双摆的动画,我想它的闪烁比我做的要少很多,即使我以大约相同的速度运行我的程序。这里是链接


所以,我想我还有更多的工作要做。我需要找到一种方法来减少这种闪烁效应。

如果低帧速率加上每帧中移动的距离相对较大而产生的频闪效应就是您所说的“闪烁”,那么您可能希望尝试更高的刷新率。:

Manipulate[(pt = {Cos[n], Sin[n]};
  Graphics[{{Blue, Thickness[0.01], 
     Line[{{0, 0}, pt}]}, {PointSize[.08], Red, Point[pt]}}, 
   PlotRange -> {{-1.5, 1.5}, {-1.5, 1.5}}, ImageSize -> 200]), 
 Control[{{n, 0, "Run"}, 0, 1000, ControlType -> Trigger, 
   DisplayAllSteps -> True, ImageSize -> Tiny, RefreshRate -> 50, 
   AnimationRate -> 3, 
   AppearanceElements -> {"ProgressSlider", "ResetPlayButton", 
     "PauseButton", "StepLeftButton", "StepRightButton", 
     "ResetButton", "FasterSlowerButtons"}}], 
 SynchronousUpdating -> True]

有趣的是,如果我设置了与我的LCD相匹配的
RefreshRate->60
,动画会在一两分钟后停止播放,而它本不应该停止播放。

如果低帧速率加上每帧中移动的相对较大距离所产生的频闪效果就是你所说的“闪烁”然后,您可能希望尝试更高的刷新率:

Manipulate[(pt = {Cos[n], Sin[n]};
  Graphics[{{Blue, Thickness[0.01], 
     Line[{{0, 0}, pt}]}, {PointSize[.08], Red, Point[pt]}}, 
   PlotRange -> {{-1.5, 1.5}, {-1.5, 1.5}}, ImageSize -> 200]), 
 Control[{{n, 0, "Run"}, 0, 1000, ControlType -> Trigger, 
   DisplayAllSteps -> True, ImageSize -> Tiny, RefreshRate -> 50, 
   AnimationRate -> 3, 
   AppearanceElements -> {"ProgressSlider", "ResetPlayButton", 
     "PauseButton", "StepLeftButton", "StepRightButton", 
     "ResetButton", "FasterSlowerButtons"}}], 
 SynchronousUpdating -> True]

有趣的是,如果我设置了
RefreshRate->60
,它应该与我的LCD相匹配,那么动画会在一两分钟后停止播放,而它本不应该播放。

以您的示例为例,在mma7上,我看不到闪烁本身。当然,由于在每一帧中移动的距离,动画有一个频闪质量,并且也有一个抖动,可能是因为帧速率与屏幕的垂直刷新率不同步。你到底关心什么?以你的例子,在mma7上,我看不到闪烁本身。当然,由于在每一帧中移动的距离,动画有一个频闪质量,并且也有一个抖动,可能是因为帧速率与屏幕的垂直刷新率不同步。你到底关心什么?谢谢你的回复。我不熟悉频闪这个术语。但现在看来,我想是的,这就是我的意思。当我的delta_t太大时,我的动画在眼睛上是不平滑的,我正在寻找一种方法来避免这种情况。请参阅更新1。@Nasser-这也是我一直在努力解决的问题,所以感谢您的提问。。。你试过UpdateInterval吗?(我认为可能还有一个全局选项与dynamics刷新方式有关,但我记不清了。)此外,我似乎记得在某个地方读到过,LCD的刷新率通常略低于60。这个数字通常在操作系统显示时向上取整。是的,我实际上尝试了UpdateInterval,但没有帮助。请参阅更新2的部分代码,我有画的图形。谢谢你的答复。我不熟悉频闪这个术语。但现在看来,我想是的,这就是我的意思。当我的delta_t太大时,我的动画在眼睛上是不平滑的,我正在寻找一种方法来避免这种情况。请参阅更新1。@Nasser-这也是我一直在努力解决的问题,所以感谢您的提问。。。你试过UpdateInterval吗?(我认为可能还有一个全局选项与dynamics刷新方式有关,但我记不清了。)此外,我似乎记得在某个地方读到过,LCD的刷新率通常略低于60。这个数字通常在操作系统显示时向上取整。是的,我实际上尝试了UpdateInterval,但没有帮助。请参阅更新2了解我的代码部分