IIS&基于服务的Web图像生成 - GDI,GDI +或Direct2D?

时间:2017-05-31 12:28:40

标签: c# gdi+ windows-server-2008-r2 windows-server-2012-r2

2017年5月。我的老板要我制作一些代码,根据用户输入浏览器的文字,在我们的网站上制作一些自定义网页图片。

服务器环境是运行IIS的Windows 2012,我熟悉C#。根据我的阅读,我应该能够使用GDI +创建图像,在其中绘制流畅的文本等。

然而,我的一位同事认为GDI +可能无法在Windows Server上运行,并且GDI +基于较旧的GDI(32位),因此很快就会被废弃,而且我应该使用DirectX。我觉得引入另一层会使写作更加复杂。支持。

有很多网页讨论这些主题以及每个主题的表现,但感觉不确定,所以我要求SO社区的经验。

所以,问题:GDI会在Windows Server上运行吗?

编辑:感谢您的回复。我从他们身上看到我在几点上有点模糊。具体来说,我们打算将渲染到图像处理作为基于队列的进程,其中一个服务运行GDI +图形代码。我刚刚阅读this from 2013,它表明GDI +不应该在服务中运行,并建议Direct2D是MS的首选方式。

编辑2:进一步研究发现this page。它说选项是GDI,GDI +或Direct2D。我复制了这里的密钥,虽然整个页面是一个快速阅读,所以如果你可以在源头查看上下文。

  

可用API的选项

     

服务器端渲染有三个选项:GDI,GDI +和   Direct2D的。与GDI和GDI +一样,Direct2D是原生的2D渲染API   这使应用程序可以更好地控制图形设备的使用。   此外,Direct2D唯一支持单线程和   多线程工厂。以下部分比较了每个API   绘制质量和多线程服务器端渲染的术语。

     

GDI

     

与Direct2D和GDI +不同,GDI不支持高质量   绘图功能。例如,GDI不支持抗锯齿   创建流畅的线条,并且对透明度的支持有限。   基于Windows 7和Windows 7上的图形性能测试结果   Windows Server 2008 R2,Direct2D比GDI更有效地扩展,   尽管在GDI中重新设计了锁。有关这些的更多信息   测试结果,请参阅工程Windows 7图形性能。在   此外,使用GDI的应用程序限制为每个10240 GDI句柄   进程和每个会话65536 GDI句柄。原因是   内部Windows使用16位WORD来存储句柄索引   为每个会话。

     

GDI + *

     

虽然GDI +支持抗锯齿和alpha   混合用于高质量绘图,是GDI +的主要问题   server-scenarios是它不支持在Session 0中运行。   由于会话0仅支持非交互功能,功能   与显示设备直接或间接交互的人   因此收到错误。功能的具体示例包括不   只有处理显示设备的人,还有那些间接的   处理设备驱动程序。与GDI类似,GDI +受其限制   锁定机制。 GDI +中的锁定机制是相同的   Windows 7和Windows Server 2008 R2与以前的版本一样。

     

的Direct2D

     

Direct2D是一种硬件加速的即时模式2-D图形API   提供高性能和高质量的渲染。它提供了一个   单线程和多线程工厂和线性缩放   课程粒度软件渲染。为此,Direct2D定义了一个根   工厂界面。通常,只能在工厂上创建对象   与从同一工厂创建的其他对象一起使用。呼叫者,召集者   可以在何时请求单线程或多线程工厂   它被创造了。如果要求单线程工厂,那么没有   执行线程锁定。如果呼叫者请求   多线程工厂,然后,获得工厂范围的螺纹锁   每当调用Direct2D时。另外,锁定了   Direct2D中的线程比GDI和GDI +更精细,因此   线程数量的增加对其影响最小   性能

在讨论了线程和一些示例代码之后,它得出结论......

  

结论

     

如上所述,使用Direct2D进行服务器端渲染非常简单明了。此外,它还提供高质量和高度可并行化的渲染,可以在服务器的低特权环境中运行。

虽然我将该片段的倾斜解释为pro-Direct2D,但关于GDI +的锁定点和会话0点是关注的。可以说,由于我们提出了一个基于队列的过程,锁定问题不那么严重,但如果对服务可以对GDI +做什么有直接和实际的限制,那么看起来Direct2D是我项目唯一可行的路径。

我是否正确解释了这一点,或者SO社区是否更新近?相关经验?

编辑:随着最初的一批响应放慢而且没有明确答案的迹象,我添加了这个编辑。这里的团队选择sharpdx作为MS DirectWrite的包装库,它本身就是Direct3D系列API的一部分。我们并不是100%肯定需要sharpdx,我们将把它与单独的DirectWrite实现进行比较,因为我们一直在寻找额外层所代表的好处或障碍。我们相信在这个时间点,这遵循MS在上面的文章中试图建议的方向,并且我们将在服务环境中摆脱GDI / +缺点,并且能够从DirectWrite中的性能和功能增益中受益。我们将看到。

编辑:在深入研究SharpDx之后,我们正在取得进展以及Mgetz提到的关于' WARP'现在有道理。 Direct3D是我们通过SharpDX API访问的基础技术。与所有低级图形工作一样,我们请求设备上下文(也称为dc),然后是绘图表面,然后我们绘制。设备上下文部分是WARP的用武之地。直流通常面向硬件设备 - 但在我的项目中,我的目标是服务器上的服务不太可能存在图形处理器,也许不是甚至是视频卡。如果它是一个虚拟服务器,那么视频处理器可能会被共享等等。所以我不想被绑定到一个物理的'硬件设备。输入WARP(good time to view the link for full context),这是一个完全软件实现的直流 - 无硬件依赖。甜。以下是链接页面的摘录:

  

当Direct3D 10硬件不可用时启用渲染

     

WARP允许在各种硬件情况下快速渲染   实现不可用,包括:

     

当用户没有任何支持Direct3D的硬件时当应用程序作为服务运行或在服务器环境中运行时

     

未安装视频卡时

     

当视频驱动程序不可用或无法正常工作时

     

当视频卡内存不足,挂起或占用太多系统资源进行初始化时

1 个答案:

答案 0 :(得分:2)

在您的情况下,我可能会尝试使用SkiaSharp(https://github.com/mono/SkiaSharp)从平台/ API详细信息中抽象出来