Is Graphics.DrawImage too slow for bigger images?

前端 未结 4 685
抹茶落季
抹茶落季 2020-11-29 23:56

I\'m currently working on a game and I wish to have a main menu with background image.

However, I find the method Graphics.DrawImage() really slow. I ha

4条回答
  •  攒了一身酷
    2020-11-30 00:38

    Although this is an ancient question and WinForms is an ancient Framework, I would like to share what I have just discovered by accident: drawing a Bitmap into a BufferedGraphics and rendering it afterwards to the graphics context provided by OnPaint is way faster than drawing the Bitmap directly to OnPaint's graphics context - at least on my Windows 10 machine.

    That's surprising because intuitively I had assumed that it would be slightly slower to copy data twice (and so I thought that this is usually only justified when one wants to do double-buffering manually). But obviously there is something more sophisticated going on with the BufferedGraphics object.

    So create a BufferedGraphics in the constructor of the Control that shall host the Bitmap (in my case I wanted to draw a fullscreen bitmap 1920x1080):

            using (Graphics graphics = CreateGraphics())
            {
                graphicsBuffer = BufferedGraphicsManager.Current.Allocate(graphics, new Rectangle(0,0,Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height));
            }
    

    and use it in OnPaint (while voiding OnPaintBackground)

        protected override void OnPaintBackground(PaintEventArgs e) {/* just rely on the bitmap to fill the screen */}
    
        protected override void OnPaint(PaintEventArgs e)
        {   
            Graphics g = graphicsBuffer.Graphics;
    
            g.DrawImage(someBitmap,0,0,bitmap.Width, bitmap.Height);
    
            graphicsBuffer.Render(e.Graphics);
        }
    

    instead of naively defining

        protected override void OnPaintBackground(PaintEventArgs e) {/* just rely on the bitmap to fill the screen */}
    
        protected override void OnPaint(PaintEventArgs e)
        {   
            e.Graphics.DrawImage(someBitmap,0,0,bitmap.Width, bitmap.Height);
        }
    

    See the following screenshots for a comparison of the resulting MouseMove event frequency (I am implementing a very simple bitmap sketching control). At the top is the version where the Bitmap is drawn directly, at the bottom BufferedGraphics is used. I moved the mouse at about the same speed in both cases.

提交回复
热议问题