0 / 0 / 0
Регистрация: 24.03.2014
Сообщений: 20
1

Увеличить скорость отрисовки фрактала

22.05.2014, 18:04. Показов 1534. Ответов 7
Метки нет (Все метки)

Здраствуйте, написал такой вот код отрисовки фрактала
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "stdafx.h"
#include "opengl\glut.h"
#include <math.h>
 
class Complex{
public:
    double re, im;
    Complex(double are, double aim): re(are), im(aim) {}
    Complex operator+(const Complex &v){
        return Complex(re + v.re, im + v.im);
    }
};
 
Complex sqr(const Complex &v){
    return Complex(v.re*v.re - v.im*v.im, 2 * v.re * v.im);
}
 
double abs(const Complex &v){
    return sqrt(v.re*v.re + v.im*v.im);
}
 
void Draw(){
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POINTS);
    for (int y=-800; y<800; ++y){
        for(int x=-800; x<800; ++x){
            Complex z(x*0.002,y*0.002);
            int i=0;
            while(i<1000 && abs(z) < 2){
                z=sqr(z) + Complex(0.11, -0.66);
                ++i;
            }
            if(abs(z)>=2){
                float col = (50.0 - i) / 50.0;
                glColor3f(0.0-col, 1.0-col, 0.0-col);
                glVertex2f(x,y);
            }
        }
    }
    glEnd();
    glFlush();
}
 
void Initialize(){
    glClearColor(1,1,1, 1);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-800.0, 800.0, -800.0, 800.0, -5.0, 5.0);
}
 
 
int _tmain(int argc, char** argv)
{
    // initialize
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(400, 400);
    glutInitWindowPosition(100, 200);
    glutCreateWindow("fractal");
    // registration
    glutDisplayFunc(Draw);
    Initialize();
    glutMainLoop();
    return 0;
}
но както она медленно работает, анимация с такой скоростью не получится. Можно ли как то изменить алгоритм, чтобы фрактал был тот же, а скорость побольше?

Добавлено через 1 час 10 минут
Есть такая идея наплодить пару потоков и обрабатывать отрисовку нескольких кадров сразу, но наверно это неправильно? или может сгенерировать все кадры сперва а потом их выводить, но это не совсем то что надо(
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2014, 18:04
Ответы с готовыми решениями:

Умножение вектора на матрицу, увеличить скорость работы
Доброго времени суток, пишу простые гоночки(OpenGL ES 2). В общем нужно умножать геометрию...

Как увеличить скорость прорисовки массива вершин?
Имеется пара вертексных массивов, применяю простой код для прорисовки: ......... float...

Масштабирование фрактала c++/openGL
Есть код вывода фрактала на форме. Подскажите как можно реализовать масштабирование фрактала?...

Как Вы увеличиваете скорость отрисовки контролов?
Вот стало интересно узнать

7
3217 / 1406 / 232
Регистрация: 26.02.2009
Сообщений: 7,191
Записей в блоге: 5
22.05.2014, 18:35 2
Цитата Сообщение от plokij Посмотреть сообщение
или может сгенерировать все кадры сперва а потом их выводить
Да, это само просто сделать. Делаете дин.массив наполняете его координатами. А потом выводите массив целиком.
Только выводить нужно через VBO или Vertex Array хотя бы, так как медленней glVerteх ничего в OpenGL нет.

Цитата Сообщение от plokij Посмотреть сообщение
Есть такая идея наплодить пару потоков
Конечно, если CPU многоядерный то почему бы не задействовать его полностью.
Но если у вас видеокарта достаточно мощная, то она может уделать CPU в несколько раз. Но для этого потребуется шейдеры.
1
0 / 0 / 0
Регистрация: 24.03.2014
Сообщений: 20
22.05.2014, 19:19  [ТС] 3
а это вообзе нормально, что генерация фрактала идет так медленно?

Добавлено через 3 минуты
а это нормально, что генерация фракталов так тормозит?

Добавлено через 55 секунд
извенити за дублирование) интернет подвис)
0
3217 / 1406 / 232
Регистрация: 26.02.2009
Сообщений: 7,191
Записей в блоге: 5
22.05.2014, 19:23 4
Цитата Сообщение от plokij Посмотреть сообщение
идет так медленно?
Как медленно? Какой проц?
Ваш расчёт: 1600*1600 = 2 560 000
и умножить это число на количество итераций цикла while
+ отрисовка самая медленная - процессорозависимая

Уменьшите кол-во точек.
0
Модератор
3351 / 2126 / 349
Регистрация: 13.01.2012
Сообщений: 8,288
23.05.2014, 09:27 5
Цитата Сообщение от plokij Посмотреть сообщение
так тормозит
уменьшить кол-во итераций (задавал 100 - не сильно помогло)
попробовать переписать все под целые числа (тоже не думаю что сколько-нибудь поможет)

Добавлено через 1 минуту
видоизменить цикл - сейчас там много лишнего (не факт что оптимизатор уже не сделал это за вас)

Добавлено через 6 минут
...кстати,если убрать установку цвета и прорисовку вершины цикл практически не поменяет время выполнения - все тормоза от самих вычислений
0
3217 / 1406 / 232
Регистрация: 26.02.2009
Сообщений: 7,191
Записей в блоге: 5
23.05.2014, 17:51 6
Цитата Сообщение от vxg Посмотреть сообщение
все тормоза от самих вычислений
Вычисления очень смахивают на множество Мандельброта. Я как то делал на шейдерах такую штуку. Считало очень быстро:
Написание программы с SSE. Перевод
0
0 / 0 / 0
Регистрация: 24.03.2014
Сообщений: 20
25.05.2014, 15:48  [ТС] 7
Я сделал так: сначала посчитал несколько кадров, запомнил их и затем в циклическом порядке выводил. Для составляения где-то 10-20 кадров для изображения 1366х768 уходит примерно 4-5 минут. Еще у меня 2ух ядерная машинка, так что я разделил вычисления на 2 потока, количество итераций для цвета уменьшил до 255, все равно для RGB больше и не надо. А и да, это фрактал Жюлиа.

Добавлено через 3 минуты
Если кому-то интересно, могу выложить код. Только с условием - если поймете как оптимизировать, напишите в этой теме)
0
Модератор
3351 / 2126 / 349
Регистрация: 13.01.2012
Сообщений: 8,288
26.05.2014, 09:16 8
Цитата Сообщение от snake32 Посмотреть сообщение
Вычисления очень смахивают на множество Мандельброта. Я как то делал на шейдерах такую штуку. Считало очень быстро
это множество Жюлиа. это не совсем правильно пытаться сравнить скорости расчета, но ваша программа дает время порядка 900 мс. то есть время того же порядка. опять же мб кому нибудь пригодится как это пришлось делать мне Фрактал дерево opengl
а вообще - не совсем удобная задача для анимации. уменьшайте разрешение и количество итераций, увеличивайте радиус
Миниатюры
Увеличить скорость отрисовки фрактала  
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2014, 09:16
Помогаю со студенческими работами здесь

Падает скорость отрисовки при transparent = true
вывожу на image1 через буфер. при отключенной прозрачности у image1 скорость отрисовки устраивает,...

Как увеличить скорость Wi-Fi?
Как увеличить скорость Wi-Fi? Имеется интернет 70мбит\сек. Имеется собственно сам Wi-Fi роутер...

Увеличить скорость прокрутки
Здравствуйте. Начну с того что я начинающий &quot;сайтоделатель&quot;. Встроил на сайт слайдер но возникла...

Увеличить скорость интернета
Всем привет. У меня вопрос: возможно ли увеличить скорость интернета? если да - то как? Если есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru