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的硬件时当应用程序作为服务运行或在服务器环境中运行时
未安装视频卡时
当视频驱动程序不可用或无法正常工作时
当视频卡内存不足,挂起或占用太多系统资源进行初始化时