Автор Тема: Рейтрейсер для анимации на GPU.  (Прочитано 27261 раз)

Оффлайн Samovar

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #90 : 30 Июль 2016, 22:19:37 »
... тогда спрошу как токарь токаря, сколько нужно инструкций процессора чтобы визуализировать одну точку? ...
вопрос конкретный, конечно, но пока я его рассматриваю как риторический :)

Итак, вернёмся к нашим "тараканам"...если ещё желание у автора темы не пропало ковырять C++
Набросал маленькую программку на FreeBasic:

Код


Dim As Integer hor=800, vert=600, count   '' определение целых переменных
Dim As Double start=Timer                          '' определение переменных с плавающей точкой


ScreenRes (hor, vert, 24)   '' установка разрешения окна и глубины (число бит) цвета


'' функция получения случайного целого числа в диапозоне 0-255 для одной из компоненты RGB цвета
Function Col As Integer
   Return Int(Rnd*255)
End Function


'' функция получения случайного целого числа в диапазоне от 0 до n
Function Poz(n As Integer) As Integer
   Return Int(Rnd*n)
End Function


'' главный цикл
Do While inkey = ""   '' пока не нажата любая клавиша
   For count = 1 To 1000000 '' повторяем миллион раз
      PSet (Poz(hor), Poz(vert)), RGB(Col, Col, Col)   '' рисуем точку случайным цветом в случайной позиции
   Next
   '' выводим время отрисовки миллиона пикселей в заголовок окна
   WindowTitle "Draw million pixels time: "+Str(Int((Timer-start)*100)/100)+" sec."
   start=Timer      '' присваиваем значение переменной из системного таймера
Loop   '' продолжаем главный цикл сначала


End '' завершение работы




Если есть желание, повтори на C++, LanuHum
« Последнее редактирование: 30 Июль 2016, 23:19:00 от Samovar »

Оффлайн LanuHum

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #91 : 30 Июль 2016, 23:39:57 »
вопрос конкретный,конечно, по пока я его рассматриваю как риторический :)
Итак, вернёмся к нашим "тараканам"...если ещё желание у автора темы не пропало ковырять C++
Набросал маленькую программку на FreeBasic:
Если есть желание, повтори на C++, LanuHum
Есть у меня желание, нет, но С++ я ковыряю всё-равно.
Завтра напишу.

Оффлайн LanuHum

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #92 : 31 Июль 2016, 10:50:11 »
Цитировать
повтори на C++, LanuHum
Вот часть кода:
Код
#include <iostream>
#include <vector>
#include <random>

using namespace std;

unsigned int hor = 800, vert = 600;  // задаём размер изображения
unsigned long pixels = hor * vert;  // вычисляем число пикселов   
vector<unsigned int [4]> image(pixels); // создаём базу данных для чёрного изображения

int main(void) {
    const int max_value = 255;  // указываем максимальную величину цвета
    unsigned long pixel_number = rand() % pixels;   // выбираем случайный пиксел
    unsigned int r, g, b, a;    // объявляем переменные цветов и альфы
    r = rand() % max_value;     //  случайный красный
    g = rand() % max_value;     //  случайный зелёный
    b = rand() % max_value;     //  случайный синий
    a = rand() % max_value;     //  случайная альфа
    image[pixel_number][0] = r; //  заменяем в случайно выбранном пикселе чёрной картинки красный
    image[pixel_number][1] = g; //  заменяем в случайно выбранном пикселе чёрной картинки зелёный
    image[pixel_number][2] = b; //  заменяем в случайно выбранном пикселе чёрной картинки синий
    image[pixel_number][3] = a; //  заменяем в случайно выбранном пикселе чёрной картинки альфу
    std::cout <<r<<" "<<g<<" "<<b<<" "<<a<< std::endl;  // тестируем работоспособность функции просьбой вывести на экран полученный случайный цвет
    return 0;
}

Меняем main(void) на RenderSimulator()
Теперь нужно отыскать в libfox, которая будет рисовать окно, таймер.

Оффлайн Samovar

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #93 : 31 Июль 2016, 12:44:13 »

Цитировать
Вот часть кода:
Не торопись. Жду целиком, чтобы собрать и протестировать скорость.

Оффлайн LanuHum

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #94 : 31 Июль 2016, 16:19:32 »
Не торопись. Жду целиком, чтобы собрать и протестировать скорость.
Да, тут поторопишься, блин!
Вставил код вычисления времени, как советуют. Прога компилится, а нифига не линкуется
main.cpp:(.text+0x4f2): undefined reference to `diff(timespec, timespec)'
-lrt написал, не помогает, нужно ещё -L/usr/lib/x86_64-linux-gnu, а у меня такой хрени нету ни в lib, ни в lib64
Успокаивает, что я не один, вопросов про это до и больше.
А, вообще, это интересно, хорошо, что ты предложил тест, который нам покажет то, что нам нужно увидеть самим, а ни то, что там выкладывают.
Ты соберёшь-то в винде?
На вот предварительный код:
Код
// распространять среди друзей и подруг строго запрещается!
// лицензия!!!

#include "fox-1.6/fx.h"
#include <time.h>
#include <iostream>

using namespace std;


class ImageWindow : public FXMainWindow{
  FXDECLARE(ImageWindow)

protected:
  ImageWindow(){}

private:
    FXCanvas *canvas;
    FXColor bgColor = FXRGB(0, 0, 0);

public:
    enum {
        ID_CANVAS = FXMainWindow::ID_LAST,
    };

    long onPaint(FXObject *, FXSelector, void *);
    long onMouseDown(FXObject *, FXSelector, void *);

public:
  ImageWindow(FXApp* a);
  virtual void create();
  virtual ~ImageWindow();
  };

FXDEFMAP(ImageWindow) ImageWindowMap[] = {
        FXMAPFUNC(SEL_PAINT, ImageWindow::ID_CANVAS, ImageWindow::onPaint),
        FXMAPFUNC(SEL_LEFTBUTTONPRESS,   ImageWindow::ID_CANVAS, ImageWindow::onMouseDown)
};

FXIMPLEMENT(ImageWindow, FXMainWindow, ImageWindowMap, ARRAYNUMBER(ImageWindowMap))

ImageWindow::ImageWindow(FXApp* a):FXMainWindow(a,"FOX Render",NULL,NULL,DECOR_ALL,0,0,850,600,0,0){

        FXHorizontalFrame *container=new FXHorizontalFrame(this,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED);
        container->setBackColor(FXRGB(226,223,222));
        FXHorizontalFrame *chartwell=new FXHorizontalFrame(container,FRAME_SUNKEN|LAYOUT_FILL_X|
                                                                LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
                                                                0,0,0,0,10,10,10,10);
        canvas = new FXCanvas(chartwell, this, ID_CANVAS, LAYOUT_FILL_X|LAYOUT_FILL_Y);


}

ImageWindow::~ImageWindow() {

}

void ImageWindow::create() {
    FXMainWindow::create();
    show(PLACEMENT_SCREEN);
}

long ImageWindow::onPaint(FXObject *, FXSelector,void *ptr) {
    FXEvent *ev = (FXEvent *) ptr;
    FXDCWindow dc(canvas, ev);
    dc.setForeground(bgColor);
    dc.fillRectangle(0,0,canvas->getWidth(),canvas->getHeight());

    return 1;
}

timespec diff(timespec start, timespec end);
long ImageWindow::onMouseDown(FXObject *, FXSelector, void *ptr){
//timespec time1, time2;
//int temp;
//clock_gettime(CLOCK_MONOTONIC_RAW , &time1);
//for (int i = 0; i< 242000000; i++)
//temp+=temp;
//clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
//std::cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<std::endl;
    long b = 0;
    double sec = 20.0000567;
    FXString name;
    name = FXStringVal(sec);
    this->setTitle(name);

    return b;
}
int main(int argc,char *argv[]){
  FXApp application("FoxTest","FoxTest");
  application.init(argc,argv);
  new ImageWindow(&application);
  application.create();
  return application.run();
  }

Тебе нужно сначала вот сюда:
http://www.fox-toolkit.org/
Я специально выбрал либу доступную для виндовс и линукс.
Компилируем:
g++ -Wall -c test.cpp -std=c++11 -lFOX-1.6
Линкуем:
g++ -Wall -o test test.o -std=c++11 -lFOX-1.6 -lrt

Оффлайн Samovar

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #95 : 31 Июль 2016, 16:36:25 »
Ну ты и намутил :) Нафига эта fox-1.6/fx.h ???
А стандартная graphics.h разве не подойдёт?
Можешь переписать с комментариями как тут?
http://ci-plus-plus-snachala.ru/?p=67
...а то тож хочу потихоньку начать врубаться ...


Оффлайн LanuHum

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #96 : 31 Июль 2016, 17:07:07 »
Ну ты и намутил :) Нафига эта fox-1.6/fx.h ???
А стандартная graphics.h разве не подойдёт?
Можешь переписать с комментариями как тут?
http://ci-plus-plus-snachala.ru/?p=67
...а то тож хочу потихоньку начать врубаться ...

Я не знаю, что такое graphics.h
Я знаю, что в линуксе рисуют окна Qt, GTK, WXWidget, XWindow, SDL, FLTK, FOX, GLUT, GLFW...
В противном случае нужно писать с нуля, как написали API Блендер
Другое дело, когда ты создаёшь картинку без гуя, а, просто, открываешь её в каком-нибудь штатном приложении/
Вообще, если тебя интересует время создания изображения после миллиона преобразований, то тест можно сделать с выводом времени в консоль.
Почему я взял лиса? Потому что мне потребуется окно с меню, и как в люксе можно будет там организовать постобработку.
И, из всех тестов по скорости гуёв fox является самым быстрым по перерисовке...
« Последнее редактирование: 31 Июль 2016, 17:13:47 от LanuHum »

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: Рейтрейсер для анимации на GPU.
« Ответ #97 : 31 Июль 2016, 19:13:41 »
... будет разумным сразу разделить код на ту часть, которая отвечает за интерфейсные вещи и часть, которая обеспечивает формирование массива данных и  прописать между ними взаимодействие ...
... то есть мешать все в одну кучу и связывать это с какой-то гуишной библиотекой крайне нежелательно ...
Для Кота

Оффлайн LanuHum

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #98 : 31 Июль 2016, 20:34:50 »
... будет разумным сразу разделить код на ту часть, которая отвечает за интерфейсные вещи и часть, которая обеспечивает формирование массива данных и  прописать между ними взаимодействие ...
... то есть мешать все в одну кучу и связывать это с какой-то гуишной библиотекой крайне нежелательно ...
Думается, как бы не пойти на поводу у советчиков. В С++  как и в С есть такая фишка, которая называется inline. Хочешь, чтобы было крайне быстро, то функцию вставляешь непосредственно в место её выполнения, а не пишешь либу с функцией, ссылаясь потом на либу. Нужно несколько раз - пишешь одну и ту же функцию несколько раз, именно там, где она требуется.
Вот так и Samovar пишет:
Цитировать
Ну ты и намутил :) Нафига эта fox-1.6/fx.h ???
А стандартная graphics.h разве не подойдёт?
Человек хочет получить реальные результаты тестов по производительности, но при этом хочет взять что-то неопределённое, двоечником на С++ написанное, сравнить с гамбасом, а потом стучать себя в грудь и говорить, что разницы он не увидел: гамбас крут!
Из википедии:
Цитировать
FOX Toolkit — кросс-платформенная библиотека инструментов с открытым исходным кодом (лицензия LGPL) для построения графического интерфейса пользователя.
Один из самых быстрых пакетов, содержит большое число элементов GUI и поддержку OpenGL.
Это к тому, что я хочу наблюдать процесс рендера, смотреть как тайлы один за одним открываются... А, если гуёвина будет тормозить, не успевая за GPU, это неинтересно.

Оффлайн LanuHum

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #99 : 31 Июль 2016, 20:59:49 »
Fox - это не просто кнопочки, крутилки, это реальный тулкит. Здесь есть собственный FXThread, собственные типы данных FXString, FXDouble и так далее, собственные преобразования из типа в тип , как вот, например, здесь:
name = FXStringVal(sec);
Здесь мы получаем строковое значение из числа с плавающей запятой. Сделаем мы это стандартно std::string - замучаемся приводить одно к другому.

Оффлайн LanuHum

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #100 : 31 Июль 2016, 22:24:54 »
Цитировать
Можешь переписать с комментариями как тут?
Сказать честно, не могу прокомментировать подробно. Неплохая книжонка для понимания кода cpp-za-21-den.pdf (Изучаем С++ за 21 день). Название вызывает смех, но там есть то, что позволит понять, что написано в моём коде.
По идее то, что написано до строчки "FXDEFMAP(ImageWindow) ImageWindowMap[] = {" должно быть отдельным файлом с расширением .h или .hpp, например, test.hpp. Здесь объявляется класс ImageWindow и определяются конструктор, деструктор и переменные этого класса. Переменные общего пользования, переменные доступные только для класса, переменные доступные только здесь. Прописываются прототипы функций. У нас их две: onPaint и onMouseDown.
Со строчки "FXDEFMAP(ImageWindow) ImageWindowMap[] = {" начинается файл test.cpp
Здесь объявляется привязка функций к создаваемому классу и создаётся объект ImageWindow::ImageWindow(FXApp* a):FXMainWindow(a,"FOX Render",NULL,NULL,DECOR_ALL,0,0,850,600,0,0)
Далее на окно вешается фрейм и ещё один для красоты. На второй вешается канваз - это полотно, на котором мы будем рисовать и далее прописываем функции, которые  будут исполняться:
деструктор(ImageWindow::~ImageWindow()) - это то, что необходимо выполнить по завершению: у нас там ничего нет, значит, по умолчанию
ImageWindow::onPaint - функция рисования - это автомат. То, что написано там непрерывно рисуется на канвазе
ImageWindow::onMouseDown - функция, которая срабатывает при нажатии кнопки мышки. Здесь мы должны запустить код теста(не дописан). Нажали мышку - начался отсчёт времени и пошёл процесс переназначения цвета миллион раз согласно цикла(этого ещё нету). По завершению цикла завершается отсчёт времени и изменяется заголовок окна this->setTitle(name);
Сейчас, если ты соберёшь, то просто по клику мышкой изменится заголовок.
В общем, когда я добьюсь работоспособности теста, я прокомментирую сколько смогу полный его код .
Сейчас, то, что находится за //(закомментировано) - это то, что должно работать, но не хочет - это как раз точный счётчик времени прохода цикла.

Оффлайн Samovar

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #101 : 31 Июль 2016, 22:27:52 »

Цитировать
Человек хочет получить реальные результаты тестов по производительности, но при этом хочет взять что-то неопределённое, двоечником на С++ написанное, сравнить с гамбасом, а потом стучать себя в грудь и говорить, что разницы он не увидел: гамбас крут!
;D ;D ;D  рассмешил  ;D ;D ;D
Вот тебе ссылка на  функции graphics.h "двоечника"  http://mycpp.ru/cpp/scpp/cppd_graphics.h.htm
Если не хочешь или не можешь написать эту простенькую прогу на Си, то так и скажи. Тогда лучше сам попробую на неделе, чем тебя буду ждать... Про ту прогу, что ты уже написал: я сейчас не хочу себе мозги забивать всякими посторонними библиотеками и вникать в них, потому что я вообще в Си дуб-девере и пытаюсь начать с простого.

Кстати, оптимизированная версия проги на FreeBasic (скорость увеличена в 2 раза)
Код
''#Include "fbgfx.bi" '' это пока нафиг не нужно
Dim As Integer hor=800, vert=600, count   '' определение натуральных (целых) переменных
Dim As Double start=Timer   '' определение вещественных (с плавающей точкой) переменных
ScreenRes (hor, vert, 24)   '' установка разрешения окна и глубины (число бит) цвета
'' функция получения случайного целого числа в диапазоне от 0 до n
Function Poz(n As Integer) As Integer
   Return Rnd*n
End Function
'' главный цикл
Do While inkey = ""   '' пока не нажата любая клавиша
   For count = 1 To 1000000 '' повторяем миллион раз
      PSet (Poz(hor), Poz(vert)), Rnd*&hFFFFFF   '' рисуем точку случайным цветом в случайной позиции
   Next
   '' выводим время отрисовки миллиона пикселей в заголовок окна
   WindowTitle "Draw million pixels time: "+Str(Int((Timer-start)*100)/100)+" sec."
   start=Timer      '' присваиваем значение переменной из системного таймера
Loop   '' продолжаем главный цикл сначала
End '' завершение работы
« Последнее редактирование: 31 Июль 2016, 22:42:11 от Samovar »

Оффлайн LanuHum

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #102 : 31 Июль 2016, 23:03:09 »
Цитировать
Если не хочешь или не можешь написать эту простенькую прогу на Си, то так и скажи.
Я не могу нарисовать окно непосредственно используя видеодрайвер. Доволен? Но, вот твои слова:
Цитировать
Не торопись. Жду целиком, чтобы собрать и протестировать скорость.
Так вот теперь ты мне скажи, ты хочешь протестировать скорость или ты хочешь ткнуть в меня пальцем?
Тема топика: рейтрейсер на GPU, если ты забыл.
Я могу тебе предложить другой тест: пишем код, запускающий экземпляры окон,рисующих картинки из файлов.
Запустим сто экземпляров проги на С++, померяем время, и запустим сто экземпляров проги на бейсике, и тоже замеряем время. А потом запустим по миллиону экземпляров и посмотрим, на скольки экземплярах комп повиснет от проги на С++, а на скольких экземплярах повиснет от проги на бейсике.

Оффлайн Samovar

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #103 : 31 Июль 2016, 23:09:42 »
С чего ты взял, что я хочу ткнуть в тебя пальцем и протестить скорость? Эта прога задумывалась как пример оптимизации кусков кода с помощь системного таймера.Типа профайлера. Да я вполне согласен, что код FreеBasic может уступать коду С++, хотя компилятор  gcc у обоих один и тот же :) Вообще речь не об этом... мне ж тоже интересно врубиться в Си. Ты обещал сегодня набросать прогу на Си аналогичную моей на FreeBasic, вот я и ждал... но не думал, что на это у тебя уйдёт почти целый день и в итоге я получу не то что ожидал, а монстра со сторонней либой...

Оффлайн LanuHum

  • Житель
Re: Рейтрейсер для анимации на GPU.
« Ответ #104 : 31 Июль 2016, 23:30:33 »
Во-первых, я только в общих чертах увидел про что твой код. Во-вторых, я не говорил, что уже знаю С++, и могу за пять минут исполнить любой фрагмент.
В-третьих, твоё предложение не позволит тебе врубиться в С++. Я не видел ни одного букваря по С++, где учат работать с драйверами. Возьми букварь от создателя языка С++ Страуструпа последнее издание и найди там урок по рисованию окна драйвером. По твоей логике - это должен был быть первый урок.
Я ничего не имею против бейсика, но я знаю, что мне его не потянуть. Если я сегодня весь день проискал, почему не линкуется прога на С++, то я пять лет буду искать, как на бейсике выделить вершину куба в окне OpenGL.
Тебе нужно было ни код писать, а просто словами объяснить цель. Я бы это сказал так: Закрась миллион пикселов монитора драйвером и померяй время.
8 слов и всё ясно.
А, то, что я сделал сегодня, мне пригодится для рейтрейсера на GPU, хотя тебе это и не понравилось.

Цитировать
С чего ты взял, что я хочу  протестить скорость?
чтобы собрать и протестировать скорость.
В. Высоцкий:
Цитировать
А мне чё, да ни чё, осталось только материться

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 4520
Автор: LEXA ANЭGROWND
blender.png
Скачано: 4469
Автор: ipv2007
4.png
Скачано: 4449
Автор: hiroyukiss
2.png
Скачано: 4517
Автор: hiroyukiss

Скачано: 4569
Автор: Dilifa12