1

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 を使用できません。

このページや他のページなど、画面の更新に関するこれらの問題について話しているさまざまな Web ページを見ていたので、質問しました。

これは、二重振子のアニメーションを作成するために、私が現在作成している CDF です。delta_t を大きくすると (これは、見つかった ODE に対する数値解の各間隔の間の時間です)、アニメーションが表示されます。画面にはたくさんのちらつきがあります (または、好きな用語を使用します)。ポイントは、目で見るのが簡単ではないということです。これを防ぐために何かできるかどうかを知りたいと思っていました。

CDFはこちら

マウスを使用して振り子の位置を変更し、ちらつきの効果をさらに確認することもできます。

RefreshRate を指摘していただきありがとうございます。

今のところ、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*)
....................

上記の「更新」は、私が制御する time_interval ごとに、scheduledTask によって更新される変数です。

アップデート

私が見たアプレットは、Java で二重振り子をアニメーション化するものでもあると思いましたが、ほぼ同じ速度で実行した場合でも、私が行ったものよりもはるかにちらつきが少ないと思います。ここにリンクがあり ます http://www.myphysicslab.com/dbl_pendulum.html

ですから、まだまだやるべきことがあると思います。このちらつき効果を減らす方法を見つける必要があります。

4

1 に答える 1

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 に一致させるかを設定すると、アニメーションは 1 ~ 2 秒後に再生を停止しますが、停止する必要はありません。

于 2011-08-12T21:52:47.153 に答える