簡體   English   中英

即使使用雙緩沖,GDI +也會閃爍

[英]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.Graphicse.Graphics參考。

因此,看來我做了本書所要做的一切,以得到超平滑無閃爍的圖形,而且我仍然可以看到物體有點卡塞。

因此,基本上剩下兩種可能性:調用.Invalidate(DirtyRect)的Timer未能以恆定的間隔精確觸發,從而導致對象出現.Invalidate(DirtyRect) ,或者BitBlt無法正常工作。

有誰知道可能是什么問題?

更新:經過深思熟慮,它看起來更像是撕裂,而不是結巴或閃爍。 因為有時對象似乎錯過了最后幾個像素。 我將研究使用VSYNC的可能性。

這可能完全無濟於事,但是我遇到了類似的問題,我花了很長時間才弄清楚,所以我會提一下。 我有一個特定於硬件的問題,由於我的CPU管理多個內核上的性能計數器的方式而使計時器的准確性混亂。

長話短說,我必須在單個內核上運行主要的OpenGL循環,直到升級計算機為止。 如果在屏幕上移動字形之前運行以下代碼(或類似代碼)會有所幫助,那么您將遇到相同的問題。 這是C#版本。

Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)1;

我希望這有幫助。 但是,我也希望這不是您的問題。 照顧自己。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM