Проблема с массивом вершин (GL_VERTEX_ARRAY).

Доброго времени суток!

С OpenGL разбираюсь около года. Всегда появляется одна и та же проблема - при большом количестве рисуемых объектов происходит ну просто МХАТовская пауза. Искал выход в дисплейных списках и массивах вершин, но как с ними нормально работать так и не понял.

По аналогии с уроком “Создание растрового редактора с помощью OpenGL - часть 5 (небольшая оптимизация).” попробовал изменить свой код, но увы, ничего не вышло.

Собственно нужно нарисовать сетку шестигранников (типа сот пчелиных) состоящую из 5-10 млн. шестигранников (код функции рисования приведу ниже). Если я рисую сетку из 30000 ячеек как в коде (переменная col_fig), то все нормально, но если больше 1 000 000, то видно как тормозить начинает. Хочу получить максимально возможную производительность кода потому, что прога рассчитана слабые компы.

private void DrawScene()

{

// Задем кол-во вершин;

int col_vert = 36; // кол-во точек на окружности - чем больше,

// тем более гладким будет круг;

int col_fig = 30000; // кол-во рисуемых кругов;

int all_point_okr = col_vert + 1; // Все точки окружности включая

// ее центр;

// Координаты точек окружности;

float[] CircleVertex = new float[all_point_okr * 2];

float Radius = 0.5f; // Радиус круга;

// Создаем массив под список вершин,

// каждая вершина задается 2 координатами.

Gl.glPushMatrix();

ARR_VERTEX = new float[col_fig * all_point_okr * 2];

// Записываем координаты точек окружности

// для их дальнейщей отрисовки;

for (int i = 0; i < col_fig; i++)

{

// Рисуем круг;

CreateCircle(Radius, col_vert, CircleVertex);

// Передвигаем его центр в следующую позицию;

MoveCenter(i, CircleVertex);

// Заполняем массив вершин

for (int j = 0; j < all_point_okr * 2; j += 2)

{

ARR_VERTEX[i * all_point_okr * 2 + j] = CircleVertex[j];

ARR_VERTEX[i * all_point_okr * 2 + j + 1] =

CircleVertex[j + 1];

}

}

Gl.glPopMatrix();

// Создание массива цветов,

// цвет имеет 3 компоненты цвета.

ARR_COLOR = new byte[col_fig * all_point_okr * 3];

// Заполняем массив цветов вершин.

// Пока не важно каким цветом.

for (int i = 0; i < col_fig * all_point_okr * 3; i += 3)

{

ARR_COLOR[i] = 30;

ARR_COLOR[i + 1] = 30;

ARR_COLOR[i + 2] = 30;

}

#region Заполнение массива отображения

// Массив индексов вершин - указывает какие

// из вершин находящихся всписке нужно нарисовать.

// Поскольку все рисуется треугольниками, то умножим на 3.

int[] index = new int[col_fig * col_vert * 3];

int npp = 0; // Нумератор индексов массива index;

// Цикл по фигурам;

for (int nom_fig = 0; nom_fig < col_fig; nom_fig++)

{

// Цикл по треугольникам каждой фигуры

for (int j = 0; j < col_vert; j++)

{

if (j != col_vert - 1)

{

index[npp] = nom_fig * all_point_okr;

index[npp + 1] = nom_fig * all_point_okr + j + 1;

index[npp + 2] = nom_fig * all_point_okr + j + 2;

}

else

{

index[npp] = nom_fig * all_point_okr;

index[npp + 1] = nom_fig * all_point_okr + j + 1;

index[npp + 2] = nom_fig * all_point_okr + 1;

}

npp += 3;

}

}

#endregion

Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);

Gl.glEnableClientState(Gl.GL_COLOR_ARRAY);

Gl.glVertexPointer(2, Gl.GL_FLOAT, 0, ARR_VERTEX);

Gl.glColorPointer(3, Gl.GL_UNSIGNED_BYTE, 0, ARR_COLOR);

Gl.glDrawElements(Gl.GL_TRIANGLES, index.Length,

Gl.GL_UNSIGNED_INT, index);

Gl.glDisableClientState(Gl.GL_VERTEX_ARRAY);

Gl.glDisableClientState(Gl.GL_COLOR_ARRAY);

}

Хотелось бы конкретный совет получить

:)

Заранее большое спасибо!

Должно что-то типа такого получиться: