[英]GDI+ flickers even with double-buffering
我試圖將小圖像從左側移動到屏幕右側。
我將用戶控件的樣式設置為:
this.SetStyle(ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
在我的OnPaint
處理程序中,我將對象繪制到BufferedGraphics
實例(這是我的屏幕外緩沖區),然后使用一次調用將結果BitBlt e.Graphics
到e.Graphics
參考。
因此,看來我做了本書所要做的一切,以得到超平滑無閃爍的圖形,而且我仍然可以看到物體有點卡塞。
因此,基本上剩下兩種可能性:調用.Invalidate(DirtyRect)
的Timer未能以恆定的間隔精確觸發,從而導致對象出現.Invalidate(DirtyRect)
,或者BitBlt無法正常工作。
有誰知道可能是什么問題?
更新:經過深思熟慮,它看起來更像是撕裂,而不是結巴或閃爍。 因為有時對象似乎錯過了最后幾個像素。 我將研究使用VSYNC的可能性。
這可能完全無濟於事,但是我遇到了類似的問題,我花了很長時間才弄清楚,所以我會提一下。 我有一個特定於硬件的問題,由於我的CPU管理多個內核上的性能計數器的方式而使計時器的准確性混亂。
長話短說,我必須在單個內核上運行主要的OpenGL循環,直到升級計算機為止。 如果在屏幕上移動字形之前運行以下代碼(或類似代碼)會有所幫助,那么您將遇到相同的問題。 這是C#版本。
Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)1;
我希望這有幫助。 但是,我也希望這不是您的問題。 照顧自己。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.