簡體   English   中英

Direct 2D在將線渲染到屏幕外緩沖區時會比Qt好嗎

[英]Will Direct 2D be better than Qt at rendering lines onto a off screen buffer

我有一個數據可視化應用程序(平行坐標)。 這涉及在屏幕上繪制線的負載。 該應用程序適用於龐大的數據集。 測試數據集涉及約250萬條線(精確為2527700條)。 屏幕將變得雜亂無章,但顯示出一些圖案。 該應用程序具有沿X和Y縮放的功能。在典型的縮放級別上,它會繪制30萬條線。 該應用程序是用Qt編寫的,渲染所花費的時間是可觀的。 典型數字是(以毫秒為單位的時間)

花費時間:496抽獎1003226行

花費時間:603 Drew 1210032行

花費時間:112抽簽344582行

花費時間:182抽簽387960行

花費時間:178抽簽361424行

花費時間:222 Drew 676470線

花費時間:171抽簽475652行

花費時間:251抽簽318709行

花費時間:5條Drew 14160行

花費時間:16抽簽27233行

以下代碼段用於對繪制的線段進行計時和計數。 渲染發生在屏幕外圖像(格式為Format_ARGB32_Premultiplied的QImage)上。 QImage的大小最大為1366 x768。線段類型為QVector。

QTime m_timer;
m_timer.start();
painter.drawLines(segments);
qDebug() << "Time taken: " << m_timer.elapsed();
painter.end();
qDebug() << "Drew " << segments.size();

緩存此QImage以保存將來的抽獎。 我從未使用過DirectX。 Direct 2D渲染將提供比我已經擁有的更多的性能優勢。 有什么辦法可以改善這些數字?

如果Direct 2D渲染可以改善這些數字,則使用什么技術堆棧? 使用C#/ SharpDX會更好嗎? 我之所以這樣問,是因為Qt只能通過翻譯完成DirectX(不確定費用是多少),並且由於該應用主要是Windows C#,因此可以簡化開發人員。 處理。

不了解Qt,但對於Direct2D,在Windows 7上繪制數百萬個抗鋸齒線(沒有最新的IE10 / SP更新)時,您將無法獲得良好的性能。 在Windows 8上,Direct2D有了一些改進,但是我不確定它是否可以處理這樣的速度。 如果要獲得更好的性能,則必須直接將Direct3D與MSAA表面一起使用,或者可能對某些screespace后效應(例如FXAA)使用,或者使用幾何感知的抗鋸齒技術(例如GPAA / GBAA)。 選中“ 實時抗鋸齒的過濾方法 ”,以獲取最新的實時抗鋸齒技術的完整列表。

創建自己的線條繪制功能,直接在QImage內存緩沖區上操作,可能是最佳選擇。 在那里,您可以做一些假設,Qt的畫家可能無法做到,並且可以獲得更好的性能。 然后使用QGLWidget對圖像進行反鋸齒處理(並可能縮放?)。

好的線條圖代碼: http : //en.wikipedia.org/wiki/Bresenham%27s_line_algorithm#Simplification 盡管對於C ++和內存緩沖區的實現,可以通過用單個指針替換x0y0坐標來進一步優化。

最重要的是,您可以在線條循環中內嵌線條繪制,並在迭代超過一百萬條線條時調用零個函數。

如果讓blitting部分進行抗鋸齒,則只需為每個像素設置一個存儲字,而無需檢查它是哪種筆等等。

此外,還可以將硬件放大到任何所需的目標分辨率,您可以自由地優化QImage大小以獲取所需的圖案,而不必在屏幕上顯示。

如果您可以讓行主要按Y坐標排序,那么這將有助於緩存,因為連續行的設置像素將在QImage緩沖區的內存中更近。

但是,您可以這樣做,加快優化速度(對於gcc為-O3標志,不確定MS編譯器),至少對於gcc默認不是max。

您可以做的另一件事是在每個圖像級別並行化圖形,即使使用QPainter也可以使用。 允許在主線程以外的其他位置上繪制QImage,並且Qt使得將QImage作為信號參數從繪制線程發送到GUI線程變得容易。 您要做的是大量占用CPU和內存,因此最好使繪圖線程數與實際核心數相同,而不是計算超線程數。

也許我不會直接回答您的問題,但是:

  • 我猜想,Qt使用標准的系統例程來執行圖形操作,因此此處表示GDI和/或GDI +。 這些都不快,都可以在CPU上進行所有計算。 另一方面,DirectX11 +的Direct2D嘗試盡可能使用GPU來加速圖形,因此它可能會更快地工作。

  • 我不太了解Qt,但是我想,您應該能夠以某種方式獲取要繪制的窗口(= control)的句柄(即使那意味着使用WinAPI-總是有一種方法)。 如果是這樣,您可以繞過所有Qt機制,並使用DirectX直接在該窗口上繪制,而不會產生額外開銷。

  • 至於SharpDX-我不知道,這樣的庫存在,感謝您提供信息。 他們發表了一篇有關操作性能的報告,您可能想查看一下: http : //code4k.blogspot.com/2011/03/benchmarking-cnet-direct3d-11-apis-vs.html 無論如何,它似乎是DirectX標頭的一個或多或少簡單的包裝器,因此它不應該給您的應用程序增加太多開銷(除非性能真的很關鍵)。

暫無
暫無

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

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