我使用MFC开发了一个非常大的应用程序。 Naturaly,我使用GDI绘图,CCmdTarget用于事件路由,以及文档视图架构。 这是一条方便的发展道路。
现在,客户有兴趣将此应用程序转换为.Net。 我更愿意(也是他们)用C#编写新产品。
应用程序显示并与数千个图形对象交互,因此 我认为使用GDI +虽然看起来很自然,但可能导致性能问题, 所以我在考虑使用OpenGL,特别是OpenTK作为图形库(它是2D)。
我知道OpenGL与这些Windows API的工作方式不同,后者依赖于部分屏幕的无效化。 OpenGL有一个渲染循环,不断绘制到屏幕上。
我的问题是: 这是一种可以接受的方式,想到:
性能 - 用户是否需要特殊的图形卡(硬件?)。这是图形密集型,但它不是一个高端游戏
打印和打印预览 - 这些事情对于人们来说是否复杂?
多个选择和上下文菜单
这个库在Windows窗体中运行良好吗?
答案 0 :(得分:7)
我不这么认为。如果可以,请使用WPF,否则使用DirectX。
我知道这可能不公平,但如果我在Windows(微软)上使用.NET(微软)进行编程,我宁愿使用DirectX ......这也是来自微软。
作为旁注:不要重新发明轮子。如果您确实有充分的理由,那么在open-gl中重新编码用户控件可能非常耗时。
答案 1 :(得分:4)
根据我开发类CAD软件的经验,OpenGL和DirectX的优势在于快速深度测试,平滑旋转和平移,光照和强大的纹理功能。显然还有其他好处,但是,尽管大多数教程都会让您相信,使用这些API中的任何一个实现渲染系统是一项重大任务,不应掉以轻心。
具体做法是:
如果它是2D应用程序,并且您已经在GDI中实现了它,那么切换到GDI +将更容易 。此外,在现代硬件上,2D GDI或GDI +可以与2D OpenGL或DirectX一样快。最终,最终用户可能不会注意到差异,特别是在GDI +中提供双缓冲支持时。
您不需要(也可能不需要)应用程序的连续渲染循环。在OpenGL和DirectX中,您可以在场景发生变化时显式地使窗口无效。
如果使用OpenGL或DirectX,则需要考虑将对象放入显示列表或顶点数组(缓冲区)以便快速绘制。这并不困难,但以这种方式管理对象会增加系统的复杂性,并且很可能会显着改变渲染系统的体系结构。
在OpenGL或DirectX中打印也很繁琐。一方面,您可以渲染到位图并打印出来。但是,对于高质量的图像,您可能需要使用矢量化图像,而这些图像很难用这些渲染框架生成。
我也不会在OpenGL或DirectX中编写GUI ...除非你真的在寻找挑战;〜)
最后,从安装角度来看,这只是一个烦恼,必须安装在用户计算机上的Managed DirectX运行时库大约为100 MB。
答案 2 :(得分:0)
我没有使用C#的经验,但我曾经为使用openGL进行渲染的绘图程序构建了一个图层系统。
为了制作这个图层,我向openGL询问了当前的帧缓冲区,并将其转换为图像,以用作当前画布下的纹理。所以我想从那里很容易去打印和打印预览。
答案 3 :(得分:0)
直接X和Open GL比GDI +快得多。
答案 4 :(得分:0)
您还可以使用TAO framework替代OpenTK。