如何模仿Picasa渲染质量降低的图像来加速绘制

我有一个所有者绘制的控件,其中性能是快速重绘期间的问题,如对象拖动,调整大小和绘制选择器正方形。 我注意到,包括Picasa在内的其他几个应用程序将在快速重绘场景中临时绘制质量较差的图像,然后在UI“安定下来”时使用更高质量的版本更新图像。

我应该如何(可以吗?)在发生许多快速重绘时产生质量较低的图像? 是否有其他类似的策略可以用来提高性能(或假的提高性能)。

额外信息:

这是一个类似于表单设计器的应用程序,它会大量使用所有者绘图。 它运行良好,但当客户区域需要将三个或四个以上的图像绘制成矩形时,它才开始停滞。 (最终用户可以创建不同类型的元素,其中图像占用最大的绘图费用。)

我正在使用DrawImageUnscaled GDI +方法来绘制应该比DrawImage更高效的图像,但性能分析表明DrawImageUnscaled仍然是瓶颈。 我认为我唯一的办法就是想出一些聪明的方法来减少。

PS与此问题相关的前一个问题为我赢得了Tumbleweed徽章,因此我采取了另一种方法:如何通过GDI的DrawImage(非标定)提高性能?


等等 - 你错过了一块低垂的果子。 那些在重新调整大小的操作过程中可能根本不会重新绘制图像。 他们可能会使用StretchBlt调整视频RAM中的现有图像的大小 - 这可以通过视频驱动程序/硬件进行优化,从而可以非常快速,快速地完成重绘质量降低的图像。

战略:
-image对象具有最后位置/大小(rect)的成员变量
- 对图像对象的修复吸引了全面的质量
- 更新图像更新的最后位置
在拖动时,请执行以下操作:
* StrechBlt从最后的位置/大小到当前位置/大小
*更新最后的位置/大小
*如果超过几秒。 自上次鼠标移动后的图形和/或> 0.2s,请调用重绘(不仅仅是无效 - 您现在需要它)以获得新的全质量图像。 如果您检测到其他对象的重叠(也会得到StrechBlt'd)

示例代码我在一个类似的应用程序中使用(放大效果可以放大可能有100个对象的窗口 - 看起来像ipad演示程序只会更平滑):

Declare Function StretchBlt Lib "gdi32.dll" _
   (ByVal hdcDest As IntPtr, _
    ByVal nXOriginDest As Integer, _
    ByVal nYOriginDest As Integer, _
    ByVal nWidthDest As Integer, _
    ByVal nHeightDest As Integer, _
    ByVal hdcSrc As IntPtr, _
    ByVal nXOriginSrc As Integer, _
    ByVal nYOriginSrc As Integer, _
    ByVal nWidthSrc As Integer, _
    ByVal nHeightSrc As Integer, _
    ByVal dwRop As Int32) As Boolean

    Using g As Graphics = f.pb.CreateGraphics
        ' parm of True says draw plain view - no text = looks bad Zooming.
        f.DrawAll(g, True)
        For i As Integer = iSteps To 1 Step -1
            Dim HDC1 As IntPtr = g.GetHdc
            Try
                ' Size of bite will not be right, but by re-adjusting 
                ' with each iteration, it will make it to full-screen.
                ' Looks as good as having it right to start with, only much easier.
                TopBite = objTop  i
                BottomBite = h - ((h - objBottom)  i)
                ' Stretch/move the stuff.
                StretchBlt(HDC1, 0, 0, w - LeftBite, h, _
                  HDC1, LeftBite, TopBite, w - LeftBite, BottomBite - TopBite, 13369376)
                ' Calculate where MyEntry would be after each stretch. Then the Bite 
                ' size calcs above will ensure its closer next time. 
                SimulateStretch(objTop, objBottom, TopBite, BottomBite, h)
            Finally
                g.ReleaseHdc(HDC1)
            End Try
            ' Clear exposed/invalid area to the right.
            g.FillRectangle(br, w - LeftBite, 0, LeftBite, h)
            ' Sleep will make Swells close in duration between small/big window.
            ' (Can I actually sleep this short of a time?)
            System.Threading.Thread.Sleep(5)
        Next
    End Using

当然,如果有人把它改成小图像然后备份,它会是超级低质量和像素化的 - 所以如果不调整大小,你可以使用更聪明的algorythm偶尔在mousedrag中激发真正的onpaint。

注意这个的具体细节取决于具体的实现。 你应该提供你的应用程序的更多细节,这样我就可以正确地做它(它究竟是什么样子的?)我假设一个大的平方用户控件带有许多所有者素描元素,所有这些元素都一次调整大小。 如果你让它们从小尺寸开始调整大小,以便它们开始重叠,那么在鼠标调整大小操作期间,您必须定期进行更频繁的全面重绘。

链接地址: http://www.djcxy.com/p/1427.html

上一篇: How to mimic Picasa's rendering of reduced quality image to speed up drawing

下一篇: Pattern for Wrapping Shell Commands in a Class