2008-11-26 34 views
1

我有一個C#.NET應用程序,我用它創建了一個自定義圖像顯示控件。每個圖像顯示代表自己的顯示上下文,並使用glDrawPixels繪製圖像(是的,我知道使用紋理會更好,我計劃在未來,但這個應用程序已經太長,我的時間有限)。在openGL中同時更新兩個顯示上下文

我現在試圖讓兩個圖像同時平移。也就是說,當一個圖像向下移動十個像素時,第二個圖像向下移動十個像素。像這樣:

imageOne.YPan -= 10; 
imageTwo.YPan -= 10; 
imageOne.Invalidate(); //This forces a redraw. 
imageTwo.Invalidate(); //This forces a redraw. 

好吧,所以這裏是我遇到的問題。只有其中一個圖像顯示正在重繪。如果我在兩次Invalidate調用之間放置一個暫停,並且使暫停持續時間至少爲110毫秒,則兩者都將重繪,但不會同時進行。所以看起來好像第二張圖片總是試圖趕上第一張。另外,110毫秒的停頓會減慢運動的速度。

我曾嘗試將每個圖像的更新和無效放置在其自己的線程中,但這並沒有幫助。

在繪圖的開始階段,我使適當的上下文是最新的,最後我調用了swapbuffers()。我嘗試在draw函數的末尾加入glFinish,但沒有任何變化。

難道是它的顯卡是問題嗎?我堅持使用只有openGL 1.4的集成GPU。

希望我已經提供了足夠的細節,可以找到我的問題的答案。

回答

1

很難說出你做了什麼錯,因爲你給了這麼少的細節。以下是可能有所幫助的一些提示。
- 在上下文中做某件事之前,請確保您使其成爲當前的一件。如果你想平移兩個上下文,使第一個當前,平移它,然後使第二個當前和平移它。這不是真正的理由,爲什麼這不應該工作。
- 如果看起來有時間問題,在戰略位置添加glFinish()可能有助於解決問題
- 應該一直這樣做,有時請撥打glError()並確保一切順利。
- 我不確定這是如何在你所說的框架中完成的,但你應該確保這兩個上下文都得到swapBuffers()每幀調用。

0

Invalidate不強制立即重繪。它將窗口標記爲無效,當消息隊列用完其他消息時,將創建並處理消息。但是,直到完成處理當前消息並返回到主消息循環,纔會發生這種情況,並且可能會比此延遲更多。

通常,OpenGL動畫是在Control.OnPaint(或在Control.Paint事件的處理程序中)執行所有繪製的規則的例外。

相關問題