C#でグラフィックスをレンダリングする別の方法はGDI+とXNAを超えていますか? (タイルマップエディタの開発のために。)C#でグラフィックスをレンダリングする
答えて
はい、DirectX 9.0をラップするWindowsフォームコントロールを作成し、ビデオサーフェスのピクセルレベルの操作を直接行います。
私は実際に他のより良いアプローチがあるかどうかを尋ねるスタックオーバーフロー上の他の記事を書いた:それは、比較的高性能ですが、それは効率的にメモリにアクセスするためのポインタを使用してUnsafe C# and pointers for 2D rendering, good or bad?
、それは危険なコンパイラオプションが必要です。したがって、この以前の投稿の理由。
これは、必要な手順のハイレベルです:
- は、DirectX SDKをダウンロードしてください。
- 新しいC#Windows Formsプロジェクトを作成し、インストール済みの Microsoft DirectXアセンブリを参照してください。
- 必要なプレゼンテーションパラメータ (ウィンドウ付き、バックバッファリングなど)で新しいDirectXデバイスオブジェクトを初期化します。
- 表面を「ピッチ」で記録し、現在の表示モード(ピクセルあたりのビット数)を に注意してデバイスを作成します。
- 何かを表示する必要があるときは、
Lock
バックバッファー サーフェスを返し、返されたポインタをサーフェス メモリの先頭に格納します。 - ポインタ演算を使用して、 データ内の実際のピクセル位置を、表面ピッチ、ピクセルあたり ビットおよび実際のx/yピクセル座標に基づいて計算します。
- 簡単にするために、私はbppに固執しています。ピクセルの設定は次のように簡単です:*(surfacePointer +(y * pitch + x))= Color.FromARGB(255,0,0);
- 描画が終了すると、
Unlock
バックバッファーの表面。表面を提示する。 - 必要に応じて手順5から繰り返します。
この方法では、ターゲットサーフェスの現在の表示モード(ピッチとビット/ビット)を確認する必要があります。また、プログラムの実行中にウィンドウのサイズ変更や画面フォーマットの変更に対処するための戦略が必要です。
Visual Studioおよび/またはExpression Blendを使用して、WPFを調べることができます。どの程度洗練されているのかよく分かりませんが、単純なエディタを扱えるはずです。詳細はMSDN Articleをご覧ください。
高速3Dグラフィックスのための管理DirectX(Microsoft.DirectX名前空間)。これは、DirectX API上の固い.NETラッパーです。これには、作成のために少しのパフォーマンスヒットがあります。NETオブジェクトとマーシャリング。完全な機能を備えた最新の3Dエンジンを作成していない限り、正常に動作します。
Window Presentation Foundation(WPF)(Windows.Media名前空間) - 2Dグラフィックスに最適です。 3D能力も限られています。 Windows Formsをベクトル、ハードウェアアクセラレータによる解像度独立フレームワークで置き換えることを目指しています。非常に便利で、カスタムコントロール、リソース、データバインディング、イベント、コマンドのいくつかのフレーバーをサポートしています...また、いくつかのWTFがあります。スピードは通常GDIよりも速く、DirectXよりも遅く、あなたのやり方に大きく依存します(賢明な方法で書き直してから60倍も速く動作することがわかります)。我々は、リアルタイムのインジケータ、グラフ、およびプロットが3つの1280x1024のスクリーンを1つの(そして最高のものではない)PCに実装することに成功しました。
Cairo graphics libraryをご覧ください。 MonoプロジェクトにはC#のバインディングがあります。
Cairoはオプションです。私は現在、GDI +とCairoの両方を使ってマッピングソフトウェアを書き直しています。それは他の特徴の中でもタイルマップジェネレータを持っています。
- 1. DirectX 3Dグラフィックスを画像に直接レンダリングするC#
- 2. C#でグラフィックスをクローンするには?
- 3. C++グラフィックスとmmorpg?
- 4. C#クラスとグラフィックス
- 5. グラフィックス・パネルin c#
- 6. グラフィックスがJFrameにレンダリングされない
- 7. 透明パネルのグラフィックスをクリアするC#
- 8. c#PDFでグラフィックスを作成し、ラスタライズ
- 9. グラフィックス上のC++ピクセルレベルのコントロール
- 10. グラフィックスがC#で表示されない
- 11. C#のシンプルなグラフィックスでデフォルトのSystem.Drawing
- 12. C#のグラフィックスで色を設定する方法
- 13. Turbo C++グラフィックスでオブジェクトのカスタムボーダー幅を設定する方法は?
- 14. Javaはフレームをグラフィックスにレンダリングしません
- 15. グラフィックス変数を印刷するグラフィックス変数をコピーする
- 16. Androidに3Dグラフィックス+ HTML 5をレンダリングするAPIはありますか?
- 17. 次の画像のような3Dグラフィックスをどのようにレンダリングできますか? 3D水彩レンダリング
- 18. PDFページコンポーネントのレンダリング時間(解析、フォント、グラフィックスなど)
- 19. C# - WInForms - 再描画イベントで古いグラフィックスを破棄します
- 20. C++でグラフィックスのないpanda3dを使用していますか?
- 21. C#より良いUIグラフィックスの管理
- 22. C#グラフィックスの奇妙な回転
- 23. Android NDK C++、incのシステムオーバーレイウィンドウ。グラフィックス用OpenGL-ES
- 24. C++とQt - 2Dグラフィックスの問題
- 25. グラフィックスとスクロールのためのC#パネル
- 26. C#単純なグラフィックスのもの
- 27. Objective-Cグラフィックスの描画速度
- 28. C#でVMLをビットマップにレンダリングする
- 29. ExportStringでグラフィックスを変換する
- 30. ggplotでグラフィックスを複製する
David、あなたの質問に "ポインタを理解する"と気づいただけです。素晴らしい質問、素晴らしい答え!その投稿に記載されているすべてのポイントは、私の「安全でない」回答にも適用されます。 – Ash