2011-08-12 46 views
1

Mathematica如何處理圖形顯示的雙緩衝?它是否自動完成?關於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的任何事情。我正在使用RunScheduledTask []來更新一個計時器,並且在每個計時器實例中,我都使用Graphics來創建新的繪圖。很難做一個小例子,使用它在這裏發佈,所以在上面,我只是用Trigger代替。所以,在這種情況下我不能使用RefreshRate,因爲我現在沒有實際使用Trigger。

我在看不同的網頁,討論更新屏幕的這些問題,比如這個page等,這就是爲什麼我問。

這是我現在製作的一個CDF,用來製作一個雙擺的動畫,你可以看到,如果你使delta_t變大(這是ODE發現的數值解的每個區間的時間間隔),在屏幕上的動畫顯示有很多閃爍(或任何你喜歡使用的術語),問題是,要看眼睛並不容易,並且想要找到我能做的事情來防止這種情況發生。

這裏是CDF

您也可以使用鼠標來改變擺的位置看到更多閃爍的效果。

感謝您指出的刷新率,但它並不像我可以在我的當前實現,因爲我沒有使用觸發更多的是由於問題描述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*) 
.................... 

「更新」以上是由所述scheduledTask在每個TIME_INTERVAL更新變量的代碼的部分,其餘控制。

更新

我想我展示一個小程序,我看到也動畫在Java中的雙擺,我認爲它有一個比我做的閃爍要少得多,甚至當我在跑礦有關相同的速度。這裏是鏈接 http://www.myphysicslab.com/dbl_pendulum.html

所以,我想我還有更多的工作要做。我需要找到一種方法來減少這種閃爍效應。

+0

用你的例子,在mma7上,我看不到閃爍本身。由於在每幀中移動的距離,動畫當然具有選通質量,並且還存在抖動,這大概是因爲幀速率不與屏幕的垂直刷新速率同步。你究竟關心什麼? –

回答

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相匹配,那麼動畫會在一兩秒後停止播放,但不應該。

+0

感謝您的回覆。我對頻閃這個詞不熟悉。但現在看,我猜是的,這就是我的意思。當我的delta_t過大時,我擁有的動畫並不流暢,並且正在尋找避免這種情況的方法。請參閱更新1. – Nasser

+0

@Nasser - 這是我一直在努力的問題,所以謝謝你問...你有沒有嘗試UpdateInterval? (我認爲也可能有一個與動態刷新相關的全局選項,但不能完全記住它。)另外,我似乎回憶起某些地方,LCD的刷新率通常略低於60.該數字通常爲四捨五入當由操作系統提交時。 – telefunkenvf14

+0

是的,我實際上嘗試UpdateInterval,但沒有幫助。請參閱更新2,瞭解繪製圖形的代碼部分。 – Nasser