簡體   English   中英

C#PictureBox控制閃爍/性能問題

[英]C# PictureBox control flickering / performance issues

我目前正在使用Windows Form Apps ,我正在制作一款基本上是游戲的地圖編輯器。 我的方法是通過一個中央TabControl ,其中每個TabPage包含一個自定義PictureBox控件,所有其他UI控件都圍繞這​​個中央TabControl PictureBox使用其Paint事件繪制放置在地圖上的所有內容,因此將多個大小,旋轉和比例等圖像繪制到單個PictureBox 到目前為止,這一切都進展順利。 TabPage基本上用作PictureBox的視圖窗口,大小(1280x720)。

問題在於地圖的生成規模。 屏幕上的平均(也是最大)地圖大小約為19200x10800px ,可以在任何一個點上由數百個項目組成。 當僅繪制尺寸為19200x10800px的背景圖像時, PictureBox在重繪時開始閃爍並使程序無法使用。 由於地圖太大,你可以在它們周圍平移,這就是閃爍真正顯示的地方。 另外,我不想為了文件大小而使用19200x10800px圖像源,並且縮放圖像質量根本不是問題。

我已經大量閱讀了為什么會這樣,並且覺得我已經嘗試了一切,直到這一點。 到目前為止,我試過:

  • 背景圖像僅為1920x1080,並將其縮放10倍
  • 從1920x1080圖像開始,以編程方式調整大小並繪制此圖像
  • 將背景切片成多個片段(我嘗試了許多不同的量)並僅繪制視圖窗口可以看到的片段(對於小型(1080p)和大型(108000p)圖像都嘗試過此操作)
  • 使用圖形剪輯,以便只繪制屏幕上的內容
  • 在圖片框和圖片框所在的表格上使用雙緩沖
  • 將初始化時的圖像轉換為具有更快格式化的“優化位圖”,然后繪制位圖

我可能嘗試了其他一些事情以及一些小的優化,但它花了很長時間我忘記了其余的事情。 從我所看到的最有可能的事情與控制重繪太慢因某種性能原因或圖片框的限制,然而正是由於缺乏表單應用程序控件的經驗我無法分辨。

目前在Paint事件中繪制背景我有:

g.DrawImage(image, new Rectangle(0, 0, (int)(image.Size.Width * levelScale), (int)(image.Size.Height * levelScale)));

要么

g.ScaleTransform(levelScale, levelScale);
g.DrawImage(image, new Rectangle(0, 0, (int)(image.Size.Width), (int)(image.Size.Height)));

其中g是Graphics對象。

我是否達到了Win表單應用程序功能的限制,還是有些東西可能會丟失?

任何和所有幫助贊賞,

提前致謝。

只是為了形式我雖然id回答我自己的問題,以防萬一其他人想知道結果。

根據壓倒性的共識,winforms只是沒有做我想做的事情我決定我必須轉移到其他平台。 建議我使用的是WPF,DirectX和OpenGL,但經過一番廣泛的搜索后,我發現了我認為最佳的解決方案。

為了利用DirectX硬件加速的強大功能,MS已經使它能夠將XNA圖形設備嵌入到winforms應用程序中。 基本上,您可以創建以正常winform樣式運行的自定義控件,這些控件可以訪問更高級別的圖形控件。 以這種方式(有一些額外的工作)我已經用我自己使用的圖片框替換了處理所有繪圖的自定義圖形控件。 這非常有效,而且從好的方面來說,我不必為我的開發時間付出太多的打擊。

對於那些尋找更多信息的人,請參閱問題, 問題還有其他可能有用的鏈接。 再次感謝所有提出建議的人!

這是來自底部URL的引用答案。 底部的鏈接有代碼示例。 希望這有用; 不確定你是否嘗試過這個,也許它可以幫助你從現有的圖片盒控件中獲得更多的果汁。 正如在其他答案中解釋的那樣,聽起來你將在不久的將來被迫使用更強大的解決方案(DirectX / OpenGL或WPF)

**部分引自http://social.msdn.microsoft.com/Forums/en-US/68ecd1f6-2eeb-45ce-a881-24c62145ab0e/c-picturebox-problems

“我猜真正的問題是重繪圖像需要很長時間.GDI +非常慢,它不使用任何視頻硬件加速。為了加快速度,請務必避免重新縮放圖形並使用Format32PArgb格式。它比任何其他格式快10倍。將圖像加載到具有正確格式的位圖中。“

如果您有很多項目(可能實現為控件),請忘記Windows窗體的標准事件機制。 前段時間,我編寫了一個邏輯門編輯器/模擬器,它在編輯器中支持了成千上萬的門,而且非常快。 在那里,我使用畫布並將門繪制為自定義“圖像”,而不是將它們作為控件。 你必須編寫一個自定義的GetUnderlyingGate函數,它從坐標數組中解析當前的門/圖塊(你的編輯器是一個瓦片圖編輯器嗎?)。 此外,還有一些可見區域優化。

也許,當我回到家時,我會上傳一些源代碼並通知你。

暫無
暫無

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

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