Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Вывод огромного числа точек


Автор: Vladus 18.4.2008, 16:41
Всем доброго времени суток. Столкнулся с необходимостью вывода огромного числа точек на экран(порядка 10^7). Выводить это множество надо именно как точки(если кому интересно - математическая проблема, вывод образа динамической системы). Я использую обычный лобовой пересчет и вывод примерно таким циклом
Код

for(a = inA; a <= eA; a += stepA)
{
    for(k = inK; k <= eK; k += stepK)
    {    
        for(m = iM; m <= eM; m += stepM)
        {
            //тут пересчет координат и проверка совйств, причем обрабатываються многочлены очень высоких степеней
        }
    }
}

Но тут возникает проблема времени, тебуемого для построения всего это множества, у меня строиться порядка 40-50 секунд(и примерно столько же при повороте). И вот собственно вопрос - можно ли как то это время ускорить? Может стоит сначала создавать растр и потом выводить его как картинку? Или стоит поменять способ пересчета? 
Я opengl знаю не сильно, так что пожалуйста поподробнее smile 
Заранее благодарен

Автор: Graf_h 18.4.2008, 17:33
функция glDrawArrays,glDrawElements

Автор: Vladus 18.4.2008, 17:41
Graf_h, спасибо. А эти функции сильно ускоряют вывод?

Автор: Graf_h 18.4.2008, 17:49
Цитата(Vladus @  18.4.2008,  17:41 Найти цитируемый пост)
Graf_h, спасибо. А эти функции сильно ускоряют вывод?

Не знаю на сколько быстро, не тестировал! но могу сказать на порядок быстрее, чем в цыкле! можете протестировать!

Автор: Vladus 18.4.2008, 18:51
Ну ок, спасибо. Буду тестировать

Автор: FIaR 19.4.2008, 02:47
На много быстрее. ФАКТ!

Автор: Vladus 19.4.2008, 12:40
Спасибо всем, кто откликнулся! Но в процессе тестирования возникла вот такая вот проблема:
Could not execute: Bad executable format(Win32 error 193) 
ну и такой варнинг
Debug/kvadr2.exe : warning LNK4084: total image size -492695552 exceeds max (268435456); image may not run

Я так понимаю, что нехватает памяти. Никто не подскажет, как решить такую проблему? Использую VC6(openGL создаю в "winApi окне"). Не лучше ли использовать VC 2005? А может в openGl моя проблема не может быть решена и лучше использовать какую нить другую технологию?
Заранее благодарен

Автор: Graf_h 21.4.2008, 09:31
Цитата(Vladus @  19.4.2008,  12:40 Найти цитируемый пост)
Я так понимаю, что нехватает памяти. Никто не подскажет, как решить такую проблему? Использую VC6(openGL создаю в "winApi окне"). Не лучше ли использовать VC 2005? А может в openGl моя проблема не может быть решена и лучше использовать какую нить другую технологию?Заранее благодарен

Скажу точно,  что проблема не в ОпенЖЛ и не VC6! Может покажете код, а то кто его знает что вы написали там  smile 

Автор: Vladus 21.4.2008, 14:21
Graf_h, весь код наверное выкладывать не стоит - длинный он, а вот ключевые моменты:
Код

double dat[100000000][3]; // вот собстеввно сам массив для хранения координат в 3х мерном пространстве
//вот функция для рисования
void display2() // m-x; x-y; k-z; a-color
{    
        glPushMatrix();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    
    long count = 0;
    for(a = -1.5; a <= 1.5; a += 0.1)
        {
                for(k = -1.5; k <= 1.5; k += 0.1)
           {
               for(m = -3; m <= 3; m += 0.001)
               {
                  x = m;
                  for(i = 0, xPrev = 0.0; i < 500; i++) 
                 {
                     y = xPrev;
                     if(y > 5 || y < -5)
                        break;
                     if(i > 100)
                     {
                    dat[count][0] = x;
                    dat[count][1] = y;
                    dat[count][2] = k;
                    count++;
                      }
                       xPrev = k * xPrev * xPrev + xPrev * xPrev * xPrev * xPrev + m * xPrev + a;    
                  }
                 }
                  }
    }

    glPointSize(1);
    glColor3f(1, 1, 0);
    glVertexPointer(3, GL_FLOAT, 0, dat);
    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawArrays(GL_POINTS, 0, count);
    glDisableClientState(GL_VERTEX_ARRAY);

    glPopMatrix();  
    SwapBuffers(wglGetCurrentDC());
}



Все переменные объявлены выше.

Автор: Graf_h 21.4.2008, 16:12
такой масив. да еще и статический  smile  smile !Наверное стоит сделать динамическим, может поможет! 

Автор: Vladus 21.4.2008, 18:50
Graf_h, спасибо, буду пробовать

Автор: FIaR 22.4.2008, 15:09
double dat[100000000][3];


double - 4 байта
4 * 100000000 = 400000000 байт
400000000 * 3 = 1200000000 байт
1200000000 / 1024 / 1024 = 1144, 4091796875 (Мбайт)

Многовато будет, ничего из этого хорошего не выйдет.

У меня gcc компилятор, и при компиляции выдаёт ошибку:  error: size of variable 'dat' is too large

Автор: Graf_h 22.4.2008, 17:56
Vladus,   а почему не разбить масив например на 10 масивов вывода?
зачем нести большой груз если его можно разбить на кусочки... smile 

Автор: Vladus 22.4.2008, 19:26
Graf_h, я об этом думал. Просто не знаю, точно как потом надо делать вывод. Последовательно выводить все массивы? Не могли бы вы мне показать на примере?  smile   smile 

Автор: Mazzi 23.4.2008, 09:02
Запусти несколько потоков, и каждый поток пусть работает и выводит только свою часть точек.

Может быть так будет быстрее?

Автор: Graf_h 23.4.2008, 09:21
Цитата(Vladus @  22.4.2008,  19:26 Найти цитируемый пост)
Graf_h, я об этом думал. Просто не знаю, точно как потом надо делать вывод. Последовательно выводить все массивы? Не могли бы вы мне показать на примере?

Примерно так:
Код

typedef maspoint[100000][3] 

maspoint dat[10];



а далее рисуеш каждые елемент масива dat! А он у тебя масив! 
Код

for(int i=0;i<10;++i){
DrawArray(....)
}


Автор: Lazin 23.4.2008, 09:28
зачем так много точек, они будут сливаться и их не будет видно...

Автор: evilguard 24.4.2008, 17:22
У меня была похожая проблема - массив в куче надо размещать через new.

Автор: Vladus 24.4.2008, 22:06
Спасибо всем откликнувшимся, буду пробовать smile 

Автор: Sharkfire 14.5.2009, 22:49
ну и как успехи?

Автор: StLynx 24.6.2009, 17:18
Цитата(FIaR @ 22.4.2008,  15:09)
double - 4 байта
4 * 100000000 = 400000000 байт
400000000 * 3 = 1200000000 байт
1200000000 / 1024 / 1024 = 1144, 4091796875 (Мбайт)

С каких это пор double стал 4 байта?
Число двойной точности - 64 бита, т.е. 8 байт. =>

dat[100000000][3]  - 2 с лишнем гига в стеке smile 

Автор: baldina 24.6.2009, 18:14
Код

for(m = -3; m <= 3; m += 0.001)


не лучше ли рассчитать шаг исходя из размеров Viewport? бОльшая часть точек останется за бортом.

Код

xPrev = k * xPrev * xPrev + xPrev * xPrev * xPrev * xPrev + m * xPrev + a;    


кажется можно написать чуть более оптимально  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)