基于Web的图像生成
这是2017年5月。我的老板要求我产生一些代码,以便根据用户输入到浏览器中的文本在我们的网站上制作一些自定义网页图像。
服务器环境是运行IIS的Windows 2012,并且我熟悉C#。 从我阅读的内容中我应该可以使用GDI +创建图像,在它们中绘制流畅的文本等。
然而,我的一位同事建议GDI +可能无法在Windows Server上工作,而且GDI +是基于32位的旧GDI,因此将在不久的一天内被废弃,并且我应该使用DirectX。 我觉得引入另一层会让写和支持变得更加复杂。
有很多网页讨论这些主题以及每个主题的表现,但它感觉不确定,所以我要求SO社区的经验。
所以,问题:GDI会在Windows Server上工作吗?
编辑:感谢您的答复。 我从他们那里看到,对于几点来说,我有点含糊不清。 具体而言,我们打算将映像进程渲染为基于队列的进程,并使用运行GDI +图形代码的服务。 我刚刚从2013年开始读到这一点,这表明GDI +不应该在服务中运行,并且暗示Direct2D是MS首选的去路。
编辑2:进一步的研究发现了这个页面。 它说这些选项是GDI,GDI +或Direct2D。 我在这里复制关键字段,尽管整个页面都是快速阅读,所以如果可以的话,在源文件中查看。
可用API的选项
有三种服务器端渲染选项:GDI,GDI +和Direct2D。 与GDI和GDI +一样,Direct2D是一种本地2D渲染API,可让应用程序更好地控制图形设备的使用。 另外,Direct2D唯一支持单线程和多线程工厂。 以下部分根据绘图质量和多线程服务器端渲染比较每个API。
GDI
与Direct2D和GDI +不同,GDI不支持高质量的绘图功能。 例如,GDI不支持用于创建平滑线条的抗锯齿功能,并且对透明度的支持有限。 基于Windows 7和Windows Server 2008 R2上的图形性能测试结果,尽管重新设计了GDI中的锁,但Direct2D的扩展效率比GDI更高。 有关这些测试结果的更多信息,请参阅工程Windows 7图形性能。 另外,使用GDI的应用程序仅限于每个进程10240个GDI句柄和每个会话65536个GDI句柄。 原因在于Windows内部使用16位WORD来存储每个会话的句柄索引。
GDI + *
尽管GDI +支持抗锯齿和alpha混合以实现高质量的绘图,但对于服务器场景,GDI +的主要问题是它不支持在会话0中运行。由于会话0仅支持非交互功能,因此直接或间接与显示设备将因此收到错误。 功能的具体例子不仅包括那些处理显示设备的功能,还包括那些间接处理设备驱动程序的功能。 与GDI类似,GDI +受其锁定机制的限制。 在Windows 7和Windows Server 2008 R2中,GDI +中的锁定机制与以前版本中的相同。
的Direct2D
Direct2D是硬件加速的即时模式2-D图形API,可提供高性能和高质量的渲染。 它提供了单线程和多线程工厂,以及线程缩放的粒度级软件渲染。 为此,Direct2D定义了一个根工厂界面。 通常,工厂上创建的对象只能与从同一工厂创建的其他对象一起使用。 调用者可以在创建时请求单线程或多线程工厂。 如果请求单线程工厂,则不执行线程锁定。 如果调用者请求多线程工厂,则每当调用Direct2D时都会获取工厂范围的线程锁定。 此外,Direct2D中的线程锁定比GDI和GDI +更细化,因此线程数量的增加对性能的影响最小。
在对线程和一些示例代码进行了一些讨论之后,它总结了......
结论
从上面可以看出,使用Direct2D进行服务器端渲染非常简单明了。 此外,它还提供高质量和高度并行化的渲染,可以在服务器的低特权环境中运行。
虽然我将该片断的倾斜解释为亲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出现的地方.DC通常面向硬件设备 - 但在我的项目中,我的目标是服务器上的服务,在这种服务器上不太可能存在图形处理器,甚至可能不包括视频卡。 如果它是一个虚拟服务器,那么视频处理器可能会被共享等等。所以我不想被绑在一个“物理”硬件设备上。 输入WARP(查看完整上下文的链接的好时机),这是完全软件实现的直流 - 无硬件依赖关系。 甜。 以下是链接页面的摘录:
Direct3D 10硬件不可用时启用渲染
WARP允许在硬件实现不可用的各种情况下进行快速渲染,包括:
当用户没有任何支持Direct3D的硬件时应用程序作为服务运行或在服务器环境中运行
未安装视频卡时
当视频驱动程序不可用或无法正常工作时
当视频卡内存不足,挂起或需要太多系统资源进行初始化时
就你而言,我可能会尝试与SkiaSharp(https://github.com/mono/SkiaSharp)一起从平台/ API细节中抽象出一点
链接地址: http://www.djcxy.com/p/8883.html