【发布时间】:2016-03-19 20:32:14
【问题描述】:
我正在尝试重新创建非常简单的 GDI+ 功能,例如缩放和旋转图像。原因是一些 GDI 函数不能在多个线程上完成(我发现了一个使用进程的解决方法,但不想进入那个),并且在一个线程上处理数千个图像几乎没有削减它。 另外我的图像是灰度的,所以自定义函数只需要担心一个值而不是 4。
无论我尝试重新创建什么样的函数,即使经过高度优化,它总是慢几倍,尽管与 GDI 所做的相比已大大简化(我正在操作一维字节数组,每个字节一个字节)像素)
我想也许我旋转每个点的方式可能会有所不同,所以我将它完全取出,基本上有一个函数可以遍历每个像素并将其设置为已经存在的状态,这只是粗略的与 GDI 的速度相关,即使 GDI 正在执行实际旋转并且每个像素更改 4 个不同的值。
是什么让这成为可能?有没有办法使用你自己的函数来匹配它?
【问题讨论】:
-
Graphics Device Interface 应该很快。它是用原生 C/C++ 编写的,它甚至可以使用图形适配器的硬件功能来绘制例如线。这将比 C# 中的每像素迭代快得多。如果您也学习如何使用这些功能(例如托管 DirectX),您可以尝试获得几乎相同的性能。
-
Frobot 的好问题。希望知道的人回答。
-
位图操作具有基本的 O(n^2) 复杂性。这上升得非常快,一个适度的 n=1000 已经是一百万次操作。只有蛮力可以帮助保持哦足够小。 GDI+ 肯定会偷工减料,例如它不是像素完美的。并且很可能使用手动调整的 SIMD 代码。只有微软知道,来源不公开。
-
`我以为GDI根本不接触GPU`-not true。
-
这个问题有点类似于说:“我知道法拉利几十年来一直在生产跑车,并且在研发上花费了数百万美元,但我在我的车库,它的速度远没有那么快。我做错了什么?”