Проблема с массивом вершин (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);
}
Хотелось бы конкретный совет получить

Заранее большое спасибо!
Должно что-то типа такого получиться:
