在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像素坐标计算 数据中的实际像素位置。为了简单起见,我坚持使用32 bpp,这意味着设置一个像素就像下面这样简单:*(surfacePointer +(y * pitch + x))= Color.FromARGB(255,0,0);
- 完成绘图时,
Unlock
后台缓冲区表面。呈现表面。 - 根据需要重复步骤5。
请注意,采取这种方法时,您需要非常小心地检查目标表面的当前显示模式(螺距和位数)。此外,您还需要制定策略来处理窗口大小调整或在程序运行时更改屏幕格式。
答
托管DirectX(Microsoft.DirectX命名空间)可以获得更快的3D图形。它是DirectX API的稳定.NET包装器,具有创建性能的一点点。NET对象和编组。除非您正在编写全功能的现代3D引擎,否则它将正常工作。
窗口演示基础(WPF)(Windows.Media命名空间) - 二维图形的最佳选择。也具有有限的3D能力。旨在用矢量替换Windows窗体,硬件加速解决方案独立框架。非常方便,支持几种风格的自定义控件,资源,数据绑定,事件和命令......也有一些WTF。速度通常比GDI更快并且比DirectX速度更慢,并且很大程度上取决于你如何做事(以合理的方式重写之后,看到某些工作快了60倍)。我们成功地在一台(而不是最好的)个人电脑上实现了3个1280x1024屏幕,其中充满了实时指标,图表和图表。
大卫,刚刚注意到你的问题“理解指针”。伟大的问题,伟大的答案!在这篇文章中提到的所有观点也适用于我下面的“不安全”答案。 – Ash 2008-09-12 03:34:21