2008-09-12 90 views
7

是否有另一種方式在C#中渲染圖形超出GDI+XNA在C中渲染圖形#

(對於瓷磚的地圖編輯器的發展。)

+0

大衛,剛剛注意到你的問題「理解指針」。偉大的問題,偉大的答案!在這篇文章中提到的所有觀點也適用於我下面的「不安全」答案。 – Ash 2008-09-12 03:34:21

回答

8

SDL.NET是解決方案,我來愛。如果您需要3D,可以使用Tao.OpenGL在其中進行渲染。它速度很快,行業標準(即SDL)和跨平臺。

+0

太棒了!我其實對SDL很熟悉。我要研究這個。 – 2008-09-12 03:04:27

3

是的,我寫了一個包裝DirectX 9.0的Windows窗體控件,並提供對視頻表面的直接像素級別操作。

其實我寫了一篇關於堆棧溢出的另一篇文章中,詢問是否有其他更好的方法:Unsafe C# and pointers for 2D rendering, good or bad?

雖然這是比較高的性能,它需要的不安全編譯器選項,因爲它使用指針來有效地訪問內存。因此之前這篇文章的原因。

這是一個高層次的需要的步驟:

  1. 下載了DirectX SDK。
  2. 創建一個新的C#Windows Forms項目並參考安裝的 Microsoft DirectX程序集。
  3. 用您需要的演示參數 (窗口化,後臺緩衝等)初始化新的DirectX設備對象。
  4. 創建設備,注意記錄表面「間距」和當前顯示模式(每像素位數)。
  5. 當你需要顯示東西時,Lock緩衝器 表面和存儲返回的指針表面 內存的開始。
  6. 使用指針算術,根據每個像素的表面間距, 位數和實際的x/y像素座標計算 數據中的實際像素位置。爲了簡單起見,我堅持使用32   bpp,這意味着設置一個像素就像下面這樣簡單:*(surfacePointer +(y * pitch + x))= Color.FromARGB(255,0,0);
  7. 完成繪圖時,Unlock後臺緩衝區表面。呈現表面。
  8. 根據需要重複步驟5。

請注意,採取這種方法時,您需要非常小心地檢查目標表面的當前顯示模式(螺距和位數)。此外,您還需要制定策略來處理窗口大小調整或在程序運行時更改屏幕格式。

1

您可以嘗試使用Visual Studio和/或Expression Blend查看WPF。我不確定你有多複雜,但它應該能夠處理一個簡單的編輯器。查看MSDN Article瞭解更多信息。

2
  • 託管DirectX(Microsoft.DirectX命名空間)可以獲得更快的3D圖形。它是DirectX API的穩定.NET包裝器,具有創建性能的一點點。NET對象和編組。除非您正在編寫全功能的現代3D引擎,否則它將正常工作。

  • 窗口演示基礎(WPF)(Windows.Media命名空間) - 二維圖形的最佳選擇。也具有有限的3D能力。旨在用矢量替換Windows窗體,硬件加速解決方案獨立框架。非常方便,支持幾種風格的自定義控件,資源,數據綁定,事件和命令......也有一些WTF。速度通常比GDI更快並且比DirectX速度更慢,並且很大程度上取決於你如何做事(以合理的方式重寫之後,看到某些工作快了60倍)。我們成功地在一臺(而不是最好的)個人電腦上實現了3個1280x1024屏幕,其中充滿了實時指標,圖表和圖表。

0

Cairo是一個選項。我目前正在使用GDI +和Cairo重寫我的地圖繪製軟件。它有一個瓷磚地圖生成器,以及其他功能。