Модераторы: Rickert, Alexeis, BorisVorontsov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод огромного числа точек 
:(
    Опции темы
Vladus
Дата 18.4.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 1.2.2008

Репутация: нет
Всего: 4



Всем доброго времени суток. Столкнулся с необходимостью вывода огромного числа точек на экран(порядка 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 
Заранее благодарен
PM MAIL   Вверх
Graf_h
Дата 18.4.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: -1
Всего: 5



функция glDrawArrays,glDrawElements

Это сообщение отредактировал(а) Graf_h - 18.4.2008, 17:36


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Vladus
Дата 18.4.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 1.2.2008

Репутация: нет
Всего: 4



Graf_h, спасибо. А эти функции сильно ускоряют вывод?
PM MAIL   Вверх
Graf_h
Дата 18.4.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: -1
Всего: 5



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

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


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Vladus
Дата 18.4.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 1.2.2008

Репутация: нет
Всего: 4



Ну ок, спасибо. Буду тестировать
PM MAIL   Вверх
FIaR
Дата 19.4.2008, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.11.2006

Репутация: 2
Всего: 2



На много быстрее. ФАКТ!
--------------------
Шуруп забитый молотком, держится лучше, чем гвоздь закрученый отверткой.  
PM MAIL   Вверх
Vladus
Дата 19.4.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 1.2.2008

Репутация: нет
Всего: 4



Спасибо всем, кто откликнулся! Но в процессе тестирования возникла вот такая вот проблема:
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 моя проблема не может быть решена и лучше использовать какую нить другую технологию?
Заранее благодарен
PM MAIL   Вверх
Graf_h
Дата 21.4.2008, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: -1
Всего: 5



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

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

Это сообщение отредактировал(а) Graf_h - 21.4.2008, 09:32


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Vladus
Дата 21.4.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 1.2.2008

Репутация: нет
Всего: 4



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());
}



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

Это сообщение отредактировал(а) Vladus - 21.4.2008, 14:23
PM MAIL   Вверх
Graf_h
Дата 21.4.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: -1
Всего: 5



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


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Vladus
Дата 21.4.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 1.2.2008

Репутация: нет
Всего: 4



Graf_h, спасибо, буду пробовать
PM MAIL   Вверх
FIaR
Дата 22.4.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.11.2006

Репутация: 2
Всего: 2



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
--------------------
Шуруп забитый молотком, держится лучше, чем гвоздь закрученый отверткой.  
PM MAIL   Вверх
Graf_h
Дата 22.4.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: -1
Всего: 5



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

Это сообщение отредактировал(а) Graf_h - 22.4.2008, 17:57


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Vladus
Дата 22.4.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 1.2.2008

Репутация: нет
Всего: 4



Graf_h, я об этом думал. Просто не знаю, точно как потом надо делать вывод. Последовательно выводить все массивы? Не могли бы вы мне показать на примере?  smile   smile 
PM MAIL   Вверх
Mazzi
Дата 23.4.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: нет
Всего: 21



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

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


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
Graf_h
Дата 23.4.2008, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 482
Регистрация: 18.10.2007
Где: г. Ровно, Украина

Репутация: -1
Всего: 5



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

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

typedef maspoint[100000][3] 

maspoint dat[10];



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

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



Это сообщение отредактировал(а) Graf_h - 23.4.2008, 09:27


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
Lazin
Дата 23.4.2008, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



зачем так много точек, они будут сливаться и их не будет видно...
PM MAIL Skype GTalk   Вверх
evilguard
Дата 24.4.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 19.11.2006

Репутация: нет
Всего: нет



У меня была похожая проблема - массив в куче надо размещать через new.
PM MAIL   Вверх
Vladus
Дата 24.4.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 1.2.2008

Репутация: нет
Всего: 4



Спасибо всем откликнувшимся, буду пробовать smile 
PM MAIL   Вверх
Sharkfire
Дата 14.5.2009, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 30.11.2006
Где: Одесса

Репутация: нет
Всего: 2



ну и как успехи?
PM MAIL ICQ   Вверх
StLynx
Дата 24.6.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 4.8.2007
Где: Владимир

Репутация: нет
Всего: нет



Цитата(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 
PM MAIL   Вверх
baldina
Дата 24.6.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Код

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


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

Код

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


кажется можно написать чуть более оптимально  smile 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1046 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.