2011-07-06 59 views
1

我正在構建一個歌曲可視化,我需要計算每個〜50ms一個新的位圖,並通過在一個圖片框上繪製來顯示它。使用XNA/DirectX的DrawImage/DrawLine

不幸的是,使用DrawImage/DrawLine時,此圖像的渲染/繪製性能不是很快。

有沒有辦法通過使用XNA/DirectX進行改進?

哪一個更適合這項任務?

任何示例?

回答

2

XNA在後臺使用DirectX。你也不能直接在C#中使用普通的DirectX,因爲ManagedDX由於XNA而停止使用。例如,slimdx有其他替代方案。 XNA更接近使用directx的引擎。你需要的是一種更低層次的方法,看起來繪圖性能不是真正的問題,而是管理內存操作。我會建議使用Direct2D(也是slimdx的一部分),它使用硬件加速並更適合2D渲染。您也可以嘗試this並完全手動操作位圖。

+0

嗯所以實際上沒有使用第三方框架沒有直接的解決方案? – nr1

+0

@ nr1 XNA是第一方框架。查找App Hub上的XNA WinForms示例,瞭解如何將XNA與WinForms一起使用。 –

+0

@ Nr1查看最後一個鏈接,你仍然可以選擇直接寫入位圖,也許它足夠快。我仍然確定,您的問題不在於繪圖性能,而在於訪問和修改託管內存的方式。使用XNA,SlimDX等,你會得到很多開銷,只是爲了填充圖像...我相信,通過適當的優化,你可以使用普通的位圖來完成。當然,取決於位圖的大小。 – dowhilefor

0

我同意以類似於winforms示例的方式使用xna。

我認爲你可能通過渲染位圖或使用SpriteBatch而不是通過創建一個動態頂點緩衝區來包含所有行的所有端點來獲得最佳外觀和性能。然後使用DrawUserPrimitives()並指定primitiveType參數爲PrimitiveType.LineList。

這會將所有這些點發送到GPU,您可以在線上創建各種效果(着色器),而GPU則完成所有繁重工作。

應用程序中心的教育部分中的一些示例使用這種渲染來製作網格。想到的是perPixelLighting sample。你可能(或可能不需要)在3D空間中工作。