C # Actualizar mapa de bits en PictureBox

Estoy trabajando en un proyecto para compartir pantalla y recibo pequeños bloques de imagen de unSocket constantemente y necesito actualizarlos en un cierto mapa de bits de escritorio inicial que tengo.

Básicamente, leo constantemente los datos del socket (datos que se almacenan como imágenes JPEG), usandoImage.FromStream() para recuperar la imagen y copiar los píxeles de bloque recibidos en el mapa de bits primario completo (en una posición específicaX yY que también obtengo del socket): así es como se actualiza la imagen inicial. Pero luego viene la parte donde necesito mostrarlo en unPicturebox Yo manejo elPaint evento y volver a dibujar todo de nuevo: toda la imagen inicial, que es bastante grande (1920X1080 en mi caso).

Este es mi código:

    private void MainScreenThread()
    {
        ReadData();//reading data from socket.
        initial = bufferToJpeg();//first intial full screen image.
        pictureBox1.Paint += pictureBox1_Paint;//activating the paint event.
        while (true)
        {
            int pos = ReadData();
            x = BlockX();//where to draw :X
            y = BlockY();//where to draw :Y
            Bitmap block = bufferToJpeg();//constantly reciving blocks.
            Draw(block, new Point(x, y));//applying the changes-drawing the block on the big initial image.using native memcpy.

            this.Invoke(new Action(() =>
            {
                pictureBox1.Refresh();//updaing the picturebox for seeing results.
                // this.Text = ((pos / 1000).ToString() + "KB");
            }));
        }
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        lock (initial)
        {
            e.Graphics.DrawImage(initial, pictureBox1.ClientRectangle); //draws at picturebox's bounds
        }
    }

Debido a que mi objetivo es el rendimiento a alta velocidad (es una especie de proyecto en tiempo real), me gustaría saber si no hay ningún método para dibujar el bloque recibido en el cuadro de imagen en lugar de dibujar todoinitial mapa de bits de nuevo, lo que me parece muy ineficiente ... Este es mi método de dibujo (funciona extremadamente rápido, copiando bloque conmemcpy):

     private unsafe void Draw(Bitmap bmp2, Point point)
    {
        lock (initial)
        {  
            BitmapData bmData = initial.LockBits(new Rectangle(0, 0, initial.Width, initial.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, initial.PixelFormat);
            BitmapData bmData2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp2.PixelFormat);
            IntPtr scan0 = bmData.Scan0;
            IntPtr scan02 = bmData2.Scan0;
            int stride = bmData.Stride;
            int stride2 = bmData2.Stride;
            int Width = bmp2.Width;
            int Height = bmp2.Height;
            int X = point.X;
            int Y = point.Y;

            scan0 = IntPtr.Add(scan0, stride * Y + X * 3);//setting the pointer to the requested line
            for (int y = 0; y < Height; y++)
            {
                memcpy(scan0, scan02 ,(UIntPtr)(Width * 3));//copy one line

                scan02 = IntPtr.Add(scan02, stride2);//advance pointers
                scan0 = IntPtr.Add(scan0, stride);//advance pointers//
            }


            initial.UnlockBits(bmData);
            bmp2.UnlockBits(bmData2);
        }
    }

Aquí hay algunos ejemplos de un mapa de bits primario completo y otros bloques pequeños que estoy obteniendo y necesito dibujar sobre el mapa completo.

Mapa de bits completo: bloque pequeño:

bloque pequeño:

bloque pequeño:

Estoy obteniendo una gran cantidad de pequeños bloques por segundo (30 ~ 40) a veces sus límites son realmente pequeños (rectángulo de 100X80 píxeles, por ejemplo), por lo que volver a dibujar todo el mapa de bits nuevamente no es necesario ... Actualizar rápidamente una imagen de pantalla completa mataría el desempeño...

Espero que mi explicación haya sido clara.

Esperando una respuesta.

Gracias.

Respuestas a la pregunta(3)

Su respuesta a la pregunta