2013-08-29 123 views
3

我需要更新QPixmap 1024x128(數學函數繪製圖片)每秒30 ... 60次,我不想使用動畫框架 - 我認爲這是爲此目的矯枉過正。數學函數的工作速度比1/60秒快得多,並且需要不斷的工作時間,所以這不是問題。沒有動畫框架的Qt動畫

我應該使用Q ...每秒30 ... 60滴答(TPS)和調用計時器SLOT更新()?但QTimer沒有與實際的屏幕更新同步,QTimer也不準確。我的QTimer速率可能太低(不是平穩運動)或太高(吃太多的CPU) - 如何找到好的?我的實驗表明,我需要不同的QTimer間隔爲我的Linux和Windows測試機器獲得順利更新:Linux:30 TPS,窗口:50 ... 60 TPS(如果我設置1000/30毫秒,我會看到堅固的運動)。

或者,也許我誤解動畫框架,實際上這是非常簡單和適當的這項任務?

+0

Qt對於類似的東西並不是很好。爲了獲得平滑的結果,請嘗試Qt 5.1,QML,並最好使用着色器程序(GPU)計算圖像。我認爲這是您用Qt獲得平滑60fps的最佳選擇。或者只是在適當的時間間隔內滿足QTimer的要求:不完全平滑但可能適用於桌面應用程序... – hyde

回答

1

遠射,但排除了動畫框架,你不會留下很多選擇。一個想法,只有在你的數學函數可以事先計算所有幀時才起作用,就是在飛行中對動畫gif或mng進行加粗,然後用QMovie進行播放。但是從開銷來看,我不確定這比動畫框架更好。

1

您不需要動畫框架來做任何動畫,但它是一個可能對您有用的選項。

這聽起來像你認爲QTimer應該同步到繪畫事件,但實際上並不重要。

如果你想象的對象開始動畫像這樣在第一次時,從A移動到B.很多人,沒有框架,只會有一個更新功能,做這樣的事情: -

QPoint pos(pObject->getPos()); // get the current position 
pObject->setPos(pos + QPoint(2, 0); // set the position to previous + 2; 

在這種情況下,對象的更新取決於計算機運行的速度;無論渲染幀速率如何,對象的移動速度越快,對象的移動速度越快。要修復此問題,以使對象以相同的速率移動,而不管機器的計算能力如何,更新功能需要考慮到自上次更新和要素在: -

QPoint updateSpeed(30,0); // speed at which the object will move 
int deltaTime = m_timer.elapsed(); // how long since we last updated 

QPoint newPos = pObject->getPos() + QPoint(updateSpeed.X() * deltaTime, updateSpeed.Y()); 
pObject->setPos(newPos); 

所以,現在該對象的動畫是時間依賴,無論在哪個渲染器將繪製對象的速度,它總是在運行相同的速率。在較慢的機器上,兩次更新之間的時間間隔更長,因此與更快的機器相比,對象移動的距離更多是在更新之間。兩臺以不同速度運行的機器將在相同的時間內保持物體的移動距離相同。

回到你的問題,你說你是從一個數學函數計算圖像,只要圖像根據時間更新,就像上面例子中的動畫對象是動畫一樣,然後您只需要一個計時器以每秒30或60幀的速度調用QPixmap上的update()函數,並且無需將其鏈接到圖像數據計算的更新。

最後,如果這沒有回答你的問題,據我瞭解,請張貼一個如何生成QPixmap數據的例子。

+0

**在較慢的機器上,更新之間的經過時間更長,因此對象的距離更新在更新之間更進一步,與更快的機器相比**並且這不會在極端情況下導致波濤洶涌的移動效果? – Greenflow

+1

@Greenflow,你是對的,如果機器跟不上,你會看到對象跳躍。這與你在玩網絡視頻遊戲時所獲得的滯後程度相同,但它是基於時間而不是固定數量來完成動畫的。所有的運動物體都會根據時間行進一段距離,但不應該因爲我們觀察運動物體而發生變化。如果我看着你以恆定速度奔跑,閉上眼睛一秒鐘,那麼當我睜開眼睛時,你不會在我看到你的最後一個地方。 – TheDarkKnight

+0

@ Merlin069與我的問題不太相關。由於QTimer接口以毫秒爲單位工作,並且封裝了與機器速度相關的代碼,因此我不必考慮您所解釋的快速緩慢問題。我更新了我的問題,並創建了新的主題:http://stackoverflow.com/questions/18528300/choppy-scrolling-of-qpixmap-using-qt-animation-framework – pavelkolodin