Тормозит при малом количестве объектов???

И снова добрый вечер) в этот раз проблема является производительности, неизвестно по каким причинам, при более 1 объекта (простейшего, к прим. куб) в сцене, увеличивается нагрузка на цп. Вот рисую 10 текстурированных кубиков и тормозит очень сильно =(

Собственно весь код :
/*http://esate.ru, OniKy*/


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Tao.DevIl;
using Tao.FreeGlut;
using Tao.OpenGl;
using Tao.Platform.Windows;

namespace Engine_0._1
{
   public partial class Form1 : Form
   {
      public Form1()
      {
        InitializeComponent();
        Gr_Win.InitializeContexts();
      }

      int rot=0;
      private bool mnogo = false;

      private void Form1_Load(object sender, EventArgs e)
      {
        toolStripStatusLabel1.Text = "Loading..";
        comboBox1.SelectedIndex = 0;
        Gl_Init();
      }

      private void pictureBox1_Click(object sender, EventArgs e)
      {
        if (pictureBox1.BorderStyle == BorderStyle.Fixed3D)
        {
           pictureBox1.BorderStyle = BorderStyle.FixedSingle;
        }
        else
        {
           pictureBox1.BorderStyle = BorderStyle.Fixed3D;
        };
      }

      private void button1_Click(object sender, EventArgs e)
      {
        tabControl1.SelectTab(tabPage2);
      }

      private void Gl_Init()
      {
        Glut.glutInit();
        Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
        Il.ilInit();

        Il.ilEnable(Il.IL_ORIGIN_SET);


        Gl.glClearColor(255, 255, 0, 1);

        Gl.glViewport(0, 0, Gr_Win.Width, Gr_Win.Height);

        Gl.glMatrixMode(Gl.GL_PROJECTION);
        Gl.glLoadIdentity();

        Glu.gluPerspective(45, (float)Gr_Win.Width / (float)Gr_Win.Height, 0.1, 200);

        Gl.glMatrixMode(Gl.GL_MODELVIEW);
        Gl.glLoadIdentity();

        Gl.glEnable(Gl.GL_DEPTH_TEST);
        Gl.glEnable(Gl.GL_LIGHTING);
        Gl.glEnable(Gl.GL_LIGHT0);

        Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
        Gl.glEnable(Gl.GL_BLEND);
        Gl.glEnable(Gl.GL_LINE_SMOOTH);
        Gl.glLineWidth(1.0f);

        // опиции для загрузки файла
        //openFileDialog1.Filter = "ase files (*.ase)|*.ase|All files (*.*)|*.*";
      }

      private void Draw()
      {

        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

        Gl.glLoadIdentity();
        Gl.glColor3i(255, 0, 0);

        Gl.glPushMatrix();
        Gl.glTranslated(0, 0, -10);

        if (mnogo == true)
        {
           for (int i = 0; i < 10; i++)
           {
              Box(0+(i*2), 0, 0, "C:/Users/Kiira/Desktop/export/Crate.jpg");
           };
        }
        else
        {
           Box(0, 0, 0, "C:/Users/Kiira/Desktop/export/Crate.jpg");
        };

        Gl.glPopMatrix();

        Gl.glFlush();

        Gr_Win.Invalidate();
      }

      private void Box(double X, double Y, double Z, string url)
      {
        int imageId = 0;
        uint mGlTextureObject = 0;
        // создаем изображение с индификатором imageId
        Il.ilGenImages(1, out imageId);
        // делаем изображение текущим
        Il.ilBindImage(imageId);

        if (Il.ilLoadImage(url))
        {
           // если загрузка прошла успешно
           // сохраняем размеры изображения
           int width = Il.ilGetInteger(Il.IL_IMAGE_WIDTH);
           int height = Il.ilGetInteger(Il.IL_IMAGE_HEIGHT);

           // определяем число бит на пиксель
           int bitspp = Il.ilGetInteger(Il.IL_IMAGE_BITS_PER_PIXEL);

           switch (bitspp) // в зависимости оп полученного результата
           {
              // создаем текстуру используя режим GL_RGB или GL_RGBA
              case 24:
                mGlTextureObject = MakeGlTexture(Gl.GL_RGB, Il.ilGetData(), width, height);
                break;
              case 32:
                mGlTextureObject = MakeGlTexture(Gl.GL_RGBA, Il.ilGetData(), width, height);
                break;
           }

           Il.ilDeleteImages(1, ref imageId);


        }

        // включаем режим текстурирования
        Gl.glEnable(Gl.GL_TEXTURE_2D);
        // включаем режим текстурирования , указывая индификатор mGlTextureObject
        Gl.glBindTexture(Gl.GL_TEXTURE_2D, mGlTextureObject);

        Gl.glPushMatrix();

        Gl.glTranslated(X,Y,Z);
        Gl.glRotated(rot, 1, 1, 0);
        // отрисовываем полигон 
        Gl.glBegin(Gl.GL_QUADS);

        // Передняя грань
        Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f);  // Низ лево
        Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f);  // Низ право
        Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f);  // Верх право
        Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f);  // Верх лево

        // Задняя грань
        Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f);  // Низ право
        Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f);  // Верх право
        Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f);  // Верх лево
        Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f);  // Низ лево

        // Верхняя грань
        Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f);  // Верх лево
        Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f);  // Низ лево
        Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f);  // Низ право
        Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f);  // Верх право

        // Нижняя грань
        Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f);  // Верх право
        Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f);  // Верх лево
        Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f);  // Низ лево
        Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f);  // Низ право

        // Правая грань
        Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f);  // Низ право
        Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f);  // Верх право
        Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f);  // Верх лево
        Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f);  // Низ лево

        // Левая грань
        Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f);  // Низ лево
        Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f);  // Низ право
        Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f);  // Верх право
        Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f);  // Верх лево

        Gl.glEnd();

        Gl.glPopMatrix();

        // отключаем режим текстурирования
        Gl.glDisable(Gl.GL_TEXTURE_2D);
      }

      private static uint MakeGlTexture(int Format, IntPtr pixels, int w, int h)
      {
        // индетефекатор текстурного объекта
        uint texObject;

        // генерируем текстурный объект
        Gl.glGenTextures(1, out texObject);

        // устанавливаем режим упаковки пикселей
        Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);

        // создаем привязку к только что созданной текстуре
        Gl.glBindTexture(Gl.GL_TEXTURE_2D, texObject);

        // устанавливаем режим фильтрации и повторения текстуры
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
        Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
        Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_REPLACE);

        // создаем RGB или RGBA текстуру
        switch (Format)
        {
           case Gl.GL_RGB:
              Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB, w, h, 0, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, pixels);
              break;

           case Gl.GL_RGBA:
              Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, w, h, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, pixels);
              break;
        }

        // возвращаем индетефекатор текстурного объекта

        return texObject;
      }

      private void timer1_Tick(object sender, EventArgs e)
      {
        Draw();
        toolStripStatusLabel1.Text = "Load complite";
        rot++;
      }

      private void button2_Click(object sender, EventArgs e)
      {
        if (mnogo == false)
        {
           mnogo = true;
           button2.Text = "Мало кубиков";
        }
        else
        {
           button2.Text = "Много кубиков";
           mnogo = false;
        };
      }
   }
}



если надо, могу выложить исходник =)
0       617        06.01.2011        8

0  
06.01.2011 00:00:00
Вы при отрисовке каждого кадра вы загружаете текстуру, подготавливаете, текстурируете, визуализируете объект.

Вам нужно создать дисплейный список (единожды), а потом вызывать его (будите вызывать отрисовку вашего бокса прямо из кеша видеоадаптера).

— в главе 13 как раз используется дисплейный список для визуализации 3d модели.

Еще можете глянуться в 7 главу красной книги ()
0  
06.01.2011 00:00:00
Спасибо) разобрался) разобрал урок, и использовал аналогию NeHe, теперь не тормозит )
А вот интересно, а как реализовать fps?
0  
06.01.2011 00:00:00
Спасибо) разобрался) разобрал урок, и использовал аналогию NeHe, теперь не тормозит )
Вот ссылка
0  
06.01.2011 00:00:00
Хм, а как быть с текстурами, чет не пойму, гружу их в BuildList, сначала делаю как в уроках enable texture 2d, а после создания объекта disable. Текстуры нету, но если не писать disable, текстура будет ничего не пойму О_о
0  
07.01.2011 00:00:00
И еще, загружаю текстуру только на один объект, а он прицепляет текстуру на все объекты list`a О_о. Вот код:

public void BuildLists(int x)
{

this.top = this.box + 1;
Gl.glNewList(this.top, Gl.GL_COMPILE);
float quad_size = 1;

//Сетка как в 3дМаксе
Gl.glBegin(Gl.GL_LINES);

Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE, MatrixOXOYColor);

for (int ax = -(x / 2); ax < (x / 2) + 1; ax++)
{
Gl.glVertex3d(quad_size * ax, 0, 0 - (x / 2));
Gl.glVertex3d(quad_size * ax, 0, quad_size * (x / 2));
}

for (int bx = -(x / 2); bx < (x / 2) + 1; bx++)
{
Gl.glVertex3d(0 - (x / 2), 0, quad_size * bx);
Gl.glVertex3d(quad_size * (x / 2), 0, quad_size * bx);
}

Gl.glEnd();
Gl.glEndList();
// включаем режим текстурирования
Gl.glEnable(Gl.GL_TEXTURE_2D);

this.box = Gl.glGenLists(2); // Generate 2 Different Lists
Gl.glNewList(this.box, Gl.GL_COMPILE); // Start With The Box List
// включаем режим текстурирования , указывая индификатор mGlTextureObject
Gl.glBindTexture(Gl.GL_TEXTURE_2D, loadTexture("C:/Users/Kiira/Desktop/export/Crate.jpg"));
Gl.glBegin(Gl.GL_QUADS);
// Bottom Face
Gl.glNormal3f(0.0f, -1.0f, 0.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
// Front Face
Gl.glNormal3f(0.0f, 0.0f, 1.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
// Back Face
Gl.glNormal3f(0.0f, 0.0f, -1.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f);
// Right face
Gl.glNormal3f(1.0f, 0.0f, 0.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f);
// Left Face
Gl.glNormal3f(-1.0f, 0.0f, 0.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
// Top Face
Gl.glNormal3f(0.0f, 1.0f, 0.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glEnd();
Gl.glEndList();
//Gl.glDisable(Gl.GL_TEXTURE_2D);
}
0  
07.01.2011 00:00:00
Без полного кода сложновато.
Загляните вот в этот урок
0  
22.01.2011 00:00:00
Всё очень просто.
Ваша ошибка основная ошибка состоит в том, что вы создаёте динамически каждый раз новые объекты Box, да ещё и в цикле.

Нужно вынести создание объекта из цикла.
а… гляжу уже был совет такой 8)
0  
22.01.2011 00:00:00
а вот текстуры, если каждый раз меняете — их нужно приатачивать каждый раз при выводе…
^