Photoshop(或绘图程序)如何进行blit操作?

8
我正准备在Windows上开发一个绘图应用程序。我想知道,绘图程序是否有一个内存位图来锁定,然后设置每个像素,然后进行位块传输?
我不明白Photoshop如何在没有使用硬件加速的情况下移动整个图层而不会出现延迟或闪烁。在像Expression Design这样的程序中,我可以拥有200个形状并一次性移动它们而不会出现延迟。我真的很想知道这是如何在没有GPU帮助的情况下完成的。
此外,我认为超级高效的算法也无法解释这种情况。
3个回答

1

如果可用的话,现代Photoshop 使用GPU加速。另一个可能的工具是DMA。您还可以阅读现有程序(如GIMP)的源代码,这可能会对您有所帮助。


但我的问题实际上是它如何在没有的情况下完成它。 - jmasterx
DMA不是另一个工具。它帮助GPU在不使用CPU的情况下传输数据。 - Kirill V. Lyadvinsky
1
我认为这里有一些误解。你真正谈论的是总线主控,而不是DMA(DMA已经过时很多年了)。 - Jerry Coffin
@Jerry,我的理解是总线主控是DMA的一种形式。 - Matthew Flaschen
@Matthew:相反的说法更准确:DMA是总线主控的原始形式。 DMA是一个相当特定的术语,指的是一种与ISA(和类似的总线)配合使用的特定技术。在PC上,它在8088/8086机器中普遍存在,但仅用于286开始的软盘传输(因为DMA控制器比CPU传输慢,即使设置DMA控制器进行传输通常也需要比不使用它进行传输更长的时间)。 - Jerry Coffin
显示剩余2条评论

1
看看这个问题:

使用GDI+和C++减少闪烁

如果没有GPU,你所能做的关于DC绘图的只有减少闪烁。其他任何事情都取决于填充内存位图的速度。在这里,你可以使用高效的算法、多线程和任何你需要的东西。


好的,最终关键在于我能够填充内存位图的速度。我想我会使用OpenGL来获得简单的不透明度,只需将纹理绘制到四边形即可。谢谢。 - jmasterx

1

双(或更多)缓冲是游戏中的一种方式,我们在“后”缓冲区中绘制大量内容,而“前”缓冲区正在显示。然后,在绘制完成时,交换缓冲区(指针交换,而不是复制!),并在新的前缓冲区和后缓冲区中继续该过程。

三重缓冲提供了另一个优势,即可以在下一帧完成时开始绘制两帧,但不会在屏幕刷新中间强制进行缓冲区交换。许多游戏在刷新中间进行缓冲区交换,但您有时可以在屏幕上看到它作为可见的伪影(撕裂)。

无论如何,对于将位图绘制到窗口中的应用程序,如果您有一些“慢”的操作,请将其放入未显示的缓冲区中,同时向呈现API(例如GDI)呈现已显示的版本。让系统软件处理所有花哨的更新。


谢谢,我已经使用双缓冲技术了,这是一个非常有用的技巧! - jmasterx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接