user-interface - 像 Photoshop 这样的程序是如何渲染的?

标签 user-interface graphics multiplatform

关于 Photoshop 或 Sony Vegas 等常见商业编辑软件的结构的简单问题:

虽然我知道这些应用程序的 UI 是如何实现的,但我不清楚其他更高级的图形是如何开发的?

我非常了解用于 2D 和 3D 渲染的 OpenGL 和 DirectX 等库。我还知道使用软件渲染(集成显卡)可以做很多事情。但这些程序使用哪个选项呢?

我知道 Photoshop 有一个 GPU 加速渲染选项。这意味着他们必须编写两次渲染代码,一次用于软件渲染,另一次用于使用 GPU 渲染。这甚至没有考虑到这样一个事实:通常在 Windows 计算机上使用 DirectX 更好,而 OpenGL 与其他操作系统兼容。

这些应用程序的开发人员是否真的花时间为所有这些可能性重新编写图形代码,或者是否使用了一些库/更容易的转换?

谢谢!

最佳答案

我不确定 Photoshop 和 Vegas 是如何做到的;但在我工作的地方,我们开发了几个独立于操作系统的成像应用程序。有一些框架声称与系统无关,可以帮助绘制图形,Qt、Firemonkey 是我使用过的两个。但这是一个很大的麻烦,因为您仍然必须在各处包含代码或编译器指令来区分您运行的操作系统。每个图形应用程序只有几个共同的绘图基元。

对于 2D 应用程序,如果您可以绘制直线,那么您也可以使用自己的库绘制曲线。如果可以填充多边形,那么也可以填充曲线。此外,如果您可以绘制线条和填充多边形,那么您也可以进行 3D 绘制。由于这些基元的集合很小,因此您可以创建自己的图形上下文对象 (OOP) 来执行所有这些功能。该图形上下文可以(如您所说)在使用 DirectX、GDI、OpenGL、Metal、Vulkan 或您自己的软件渲染器之间切换。

对于每个操作系统,您必须弄清楚如何获取窗口对象的句柄及其用于绘制的缓冲区。您还必须弄清楚如何将该缓冲区链接到您的显卡(如果适用)。

这种创建自己的图形上下文的方法唯一不太有效的地方是当涉及到某些图形卡功能(例如 AA 或着色器的编程方式)时。由于额外的工作,我从未尝试过自己编写这些功能。这就是为什么在 Maya、3d Studio Max、Blender 等 3D 程序中,如果未设置为软件渲染,视口(viewport)总是看起来更好。大多数图形程序员喜欢依赖他们的图形 API。

总结一下:

如果您可以以与操作系统无关的方式绘制线条、填充多边形并访问像素数据,那么您可以自己完成 80% 的图形编程。这些函数可以封装到您自己的库中,该库可以在不同的系统上以不同的方式绘制这些基元。

关于user-interface - 像 Photoshop 这样的程序是如何渲染的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37805480/

相关文章:

java - 图形 2d 形状的 Action 处理程序?

java - 在 JPanel 内绘画

c# 填充除 GraphicsPath 以外的所有内容

mercurial - 您使用哪种持续集成软件?

android - 用于带有推送通知的 B2C 应用程序的 Sybase 无线平台

user-interface - WiX 编译错误创建自定义对话框

javascript - 如何从 facebook 等文本框中检测 url?

c++ - 在运行时生成 C++ 代码,编译并运行它

android - 如何允许用户对列表中的项目重新排序?

matlab - 在 MATLAB 中使用 surf 创建沿 z 轴的堆叠二维矩阵