Как оптимизировать код вывода изображения?

Здраствуйте, помогите оптимизировать и доработать (по вашему мнению).
Предисловие, посмотрел видео с канала Vectozavr. У меня не получилось (делал как в статье). Решил по теории делать и сделал. Однако следующие видео было про текстуры. Он использовал библиотеки я решил без них. Вышло так себе.

Помогите пожалуйста
Graphics a = pictureBox1.CreateGraphics();
            base.OnResize(e);
            Bitmap bmp = new Bitmap("C:\\(*Путь)\\1.png");
            int[,] Data = new int[,] {
                    {0,0,100,100,  0,0,100,100,  45,45,0, 200},
                    {0,0,100,100,  0,0,100,100,  45,45,45, 0},
                };
            /*
             * 0,1,2,3 - 4 координаты на плоскости.
             * 4,5,6,7 - 4 координаты на текстуре.
             * 8,9,10 - 3 координаты углы поворота.
             * 11 - 1 координаты смещение по z
             * 
             */

            int x_1 = 0;
            int y_1 = 0;
            while (true) {
                int x = Cursor.Position.X;
                int y = Cursor.Position.Y;

                if ((x_1 != x) && (y_1 != y))
                {
                    x_1 = x;
                    y_1 = y;
                    a.Clear(Color.White);
                    for (int n = 0; n < Data.GetLength(0); n++)
                    {
                        int[,] texture = new int[(Data[n, 2] - Data[n, 0] + 1) * (Data[n, 3] - Data[n, 1] + 1), 6];

                        int u = 0;
                        for (int j = Data[n, 4]; j < Data[n, 6]; j++)
                        {
                            for (int i = Data[n, 5]; i < Data[n, 7]; i++)
                            {
                                Color s1 = bmp.GetPixel(j, i);

                                texture[u, 3] = s1.R;
                                texture[u, 4] = s1.G;
                                texture[u, 5] = s1.B;

                                u++;
                            }
                        }

                        u = 0;
                        for (int j = Data[n, 0]; j < Data[n, 2]; j++)
                        {
                            for (int i = Data[n, 1]; i < Data[n, 3]; i++)
                            {

                                texture[u, 0] = j;
                                texture[u, 1] = i;

                                u++;
                            }
                        }

                        for (int i = 0; i < u; i++)
                        {
                            texture[i, 2] = Data[n, 11];
                        }

                        for (int i = 0; i < u; i++)
                        {
                            turn.X(texture[i, 0], texture[i, 1], texture[i, 2], Data[n, 8], out texture[i, 0], out texture[i, 1], out texture[i, 2]);
                        }
                        for (int i = 0; i < u; i++)
                        {
                            turn.Y(texture[i, 0], texture[i, 1], texture[i, 2], Data[n, 9], out texture[i, 0], out texture[i, 1], out texture[i, 2]);
                        }
                        for (int i = 0; i < u; i++)
                        {
                            turn.Z(texture[i, 0], texture[i, 1], texture[i, 2], Data[n, 10], out texture[i, 0], out texture[i, 1], out texture[i, 2]);
                        }

                        for (int i = 0; i < u; i++)
                        {
                            turn.X(texture[i, 0], texture[i, 1], texture[i, 2], x, out texture[i, 0], out texture[i, 1], out texture[i, 2]);
                        }
                        for (int i = 0; i < u; i++)
                        {
                            turn.Y(texture[i, 0], texture[i, 1], texture[i, 2], y, out texture[i, 0], out texture[i, 1], out texture[i, 2]);
                        }
                        for (int i = 0; i < u; i++)
                        {
                            turn.Z(texture[i, 0], texture[i, 1], texture[i, 2], 0, out texture[i, 0], out texture[i, 1], out texture[i, 2]);
                        }



                        int h = pictureBox1.ClientSize.Height;
                        int w = pictureBox1.ClientSize.Width;

                        for (int i = 0; i < u; i++)
                        {
                            texture[i, 0] = texture[i, 0] + (w / 2);
                            texture[i, 1] = texture[i, 1] + (h / 2);
                        }

                        for (int j = 0; j < u; j++)
                        {
                            int q = Convert.ToInt32(Math.Sqrt(Math.Pow(texture[j, 0], 2) + Math.Pow(texture[j, 1], 2) + Math.Pow(texture[j, 2], 2)));
                            int r, g, b;
                            r = texture[j, 3] - q / 20;
                            g = texture[j, 4] - q / 20;
                            b = texture[j, 5] - q / 20;
                            if (r < 0) { r = 0; }
                            if (g < 0) { g = 0; }
                            if (b < 0) { b = 0; }
                            SolidBrush brush = new SolidBrush(Color.FromArgb(r, g, b));
                            a.FillRectangle(brush, texture[j, 0], texture[j, 1], 2, 2);
                        }





                    }
                }
            }
.
Класс.
class turn
    {
        public static void X(int x, int y, int z, int l, out int x1, out int y1, out int z1)
        {
            double q = l * (Math.PI / 180.0);
            x1 = x;
            y1 = Convert.ToInt32(y * Math.Cos(q) + z * Math.Sin(q));
            z1 = Convert.ToInt32((-1) * y * Math.Sin(q) + z * Math.Cos(q));
        }
        public static void Y(int x, int y, int z, int l, out int x1, out int y1, out int z1)
        {
            double q = l * (Math.PI / 180.0);
            x1 = Convert.ToInt32(x * Math.Cos(q) + z * Math.Sin(q));
            y1 = y;
            z1 = Convert.ToInt32((-1) * x * Math.Sin(q) + z * Math.Cos(q));
        }
        public static void Z(int x, int y, int z, int l, out int x1, out int y1, out int z1)
        {
            double q = l * (Math.PI / 180.0);
            x1 = Convert.ToInt32(x * Math.Cos(q) - y * Math.Sin(q));
            y1 = Convert.ToInt32((1) * x * Math.Sin(q) + y * Math.Cos(q));
            z1 = z;
        }
    }


Изображение использовал 602ab69a9bfc1908625477.pngтакое (но можно любое).

Как можно оптимизировать это?
Заранее благодарю, за конструктивный ответ.
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
@youngMaster
Для начала избавься от использования bmp.GetPixel в каждом кадре.
Вот эту часть нужно вынести перед циклом отрисовки:
//
  int[,] texture = new int[(Data[n, 2] - Data[n, 0] + 1) * (Data[n, 3] - Data[n, 1] + 1), 6];

  int u = 0;
  for (int j = Data[n, 4]; j < Data[n, 6]; j++)
  {
      for (int i = Data[n, 5]; i < Data[n, 7]; i++)
      {
          Color s1 = bmp.GetPixel(j, i);

          texture[u, 3] = s1.R;
          texture[u, 4] = s1.G;
          texture[u, 5] = s1.B;

          u++;
      }
  }

Без тестирования сложно сказать, но скорее всего это самый медленный участок твоего кода.
Хотя последний цикл с выводом на экран, тоже достаточно медленный, но его просто так не ускорить в шарпе.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы