【问题标题】:question on flicker and double buffering in Mathematica graphics关于 Mathematica 图形中闪烁和双缓冲的问题
【发布时间】:2011-08-12 14:44:11
【问题描述】:

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
 ]

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

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

谢谢

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

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

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

这里是CDF

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

感谢您指出 RefreshRate,但由于 here 中描述的问题,我不再使用 Trigger,因此我似乎无法在当前的实现中使用它。

我想我现在只需要保持较小的 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*)
....................

上面的“更新”是由 scheduleTask 在我控制的每个 time_interval 更新的变量。

更新

我想我展示了一个我看到的小程序,它也在 Java 中为双摆设置动画,我认为它的闪烁比我做的要少得多,即使我以大致相同的速度运行我的程序也是如此。链接在这里 http://www.myphysicslab.com/dbl_pendulum.html

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

【问题讨论】:

  • 以你的例子,在 mma7 上,我看不到闪烁本身。由于每帧移动的距离,动画当然有频闪质量,也有抖动,大概是因为帧率与屏幕的垂直刷新率不同步。你到底关心什么?

标签: wolfram-mathematica wolfram-cdf


【解决方案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 应该与我的 LCD 匹配,动画会在一两分钟后停止播放,而实际上不应该。

【讨论】:

  • 感谢您的回复。我不熟悉频闪这个词。但是现在看,我想是的,这就是我的意思。当我的 delta_t 太大时,我的动画在眼睛上并不流畅,并且正在寻找一种避免这种情况的方法。请参阅更新 1。
  • @Nasser - 这也是我一直在努力解决的问题,所以感谢您的提问...您尝试过 UpdateInterval 吗? (我认为可能还有一个与动态刷新方式有关的全局选项,但记不清了。)另外,我似乎记得在某处读过 LCD 的刷新率通常略低于 60。这个数字通常是四舍五入的由操作系统呈现。
  • 是的,我实际上尝试了 UpdateInterval,但没有帮助。请参阅更新 2,了解我绘制图形的代码部分。
猜你喜欢
  • 2016-04-04
  • 2015-05-01
  • 1970-01-01
  • 2010-10-05
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 2013-01-17
相关资源
最近更新 更多