关于Mathematica图形中的闪烁和双缓冲的问题

时间:2011-08-12 14:44:11

标签: wolfram-mathematica wolfram-cdf

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

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

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

此示例围绕圆圈绘制一个点。动画运行时你会注意到闪烁。即球的运动不平滑。当减慢速率时,闪烁减少。但我认为即使速度很高,也应该减少闪烁?

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
 ]

enter image description here

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

我在Windows 7,64位上使用V 8.0.1。

感谢

更新1 我想我的问题可能不是很好。因为我没有直接使用Animate,所以不能责怪Mathematica foranything。我现在使用RunScheduledTask []来更新计时器,并在每个计时器实例中,我在Graphics中创建新的绘图。很难用一个小例子来发布这里,所以在上面,我只是用了Trigger。所以,我不能在这种情况下使用RefreshRate,因为我现在实际上并没有使用Trigger。

我正在查看不同的网页,讨论更新屏幕的这些问题,例如此page和其他人,这就是我问的原因。

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

以下是CDF

你也可以使用鼠标来改变摆锤的位置,以便更多地看到闪烁的效果。

感谢您指出RefreshRate,但看起来我不能在我当前的实现中使用它,因为我没有使用Trigger,因为所描述的问题here

我想我现在必须保持delta_t小。

更新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*)
....................

上面的'update'是我控制的每个time_interval由scheduledTask更新的变量。

更新

我以为我展示了一个applet,我看到它也在Java中制作了一个双摆,我觉得它的闪烁比我做的少得多,即使我以大约相同的速度运行我的闪烁。链接在这里 http://www.myphysicslab.com/dbl_pendulum.html

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

1 个答案:

答案 0 :(得分:1)

如果来自低帧速率的频闪效果与每帧中移动的相对较大的距离相比,就是“闪烁”的意思,那么您可能希望尝试更高的RefreshRate

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设置为与我的液晶显示器匹配,那么动画会在片刻或片刻后停止播放,但不应该播放。