Перейти к содержимому


Фотография

[OC] GUI Library. Vector graphics. beta 0.0.2

OC GUI beta

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 13

#1 Оффлайн   Seryoga

Seryoga
  • Пользователи
  • Сообщений: 108
  • Уровень сигнала: 0,31%
  • В игре: 2 час. 33 мин.
  • ГородSaint-Petersburg

Награды

        

Отправлено 14 Февраль 2016 - 02:24

    Последнее время пишется очень много GUI библиотек для open computers. Я решил не отставать от моды и начал разрабатывать свою библиотеку. Так как все гонятся за красивостью и универсальностью, я решил сделать упор на скорость рисования 2D объектов и их математических представлениях.

    В этой библиотеке содержится описание примитивных математических объектов: 

https://gist.github....fdfc2269f1ad5c8

  • Вектор
    Спойлер
  • Отрезок
    Спойлер
  • Линия
    Спойлер
  • Ломаная
    Спойлер
  • Многоугольник
    Спойлер

   А также есть классы, которые участвуют в рисовании:

https://gist.github....442202274b0ca9a

  • Цвет RGBA
    Спойлер
  • Matrix для рисования низкоуровневых объектов
    Спойлер
  • Painter для рисования высокоуровневых объектов
    Спойлер

    Вспомогательные программки без которых сложно, что либо проектировать:

https://gist.github....5b04a9524790036

  • Расширение gpu
    Спойлер
  • Программа для быстрой смены цвета текста и фона консоли, можно добавить изменение разрешения
    Спойлер
  • Программы для запуска файлов с расширением
    Спойлер

    Пример работы с моей библиотекой:

https://gist.github....09a0980fcd21472

  • Рисование при помощи матрицы
    Спойлер
  • Рисование при помощи painter'а
    Спойлер

   В планах:

  • Написать документацию
  • Добавить проверку соседних пикселей 
  • Добавить закрашивание фигур
  • Добавить рисование растровых изображений
  • Добавить класс Intersector, он будет специализироваться на обнаружении наложений объектов и их пересечении
  • Добавить сохранение матрицы в растровом и векторном виде
  • Добавить закрашивание фона фигур и матрицы растровым изображением
  • Попробовать уменьшить пиксели до половины, как это сделал Zer0Gelaxy http://computercraft...iti/#entry20699
  • Добиться максимальной производительности
  • Написать небольшой проект использующий эту библиотеку
  • Реализовать 3D

   Писал это библиотеку максимально гибко, поэтому возможна интеграция с другими Gui lib'ами. Если вам она понравиться, то я продолжу разработку в ускоренном темпе. Не откажусь от чьей либо помощи. Надеюсь вам понравится.

 

P.s моя реализация похожей библиотеки на языке java https://github.com/D...Hacker/2DEngine

Прикрепленные файлы


Сообщение отредактировал Seryoga: 15 Февраль 2016 - 20:07

  • Fingercomp, LeshaInc, qwertyMAN и 2 другим это нравится

#2 Оффлайн   Krutoy

Krutoy
  • Гуру
  • Сообщений: 499
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

              

Отправлено 14 Февраль 2016 - 10:07

Векторная отрисовка - отличная идея. Но пока ничего не ясно. Не видно примеров, ни скриншотов, ни сравнения производительности с готовыми решениями.

Пожалуйста, добавь эти три пункта в первый пост. И не ссылками, а прямо на форуме.


  • Fingercomp и ECS это нравится

#3 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 2 006
  • Уровень сигнала: 156,97%
  • В игре: 1279 час. 4 мин.

Награды

                                               

Отправлено 14 Февраль 2016 - 11:59

Используйте Gist, который в одном гисте может хранить тучу файлов, для скачивания же вот прога. А то мало того, что пост не до конца оформлен, так ещё и хост, с которого выгружал, заблочил.
 
Ну и скриншоты, доки, сравнения и человекочитаемый текст обязательно. Набор ссылок — meh.


  • Seryoga это нравится

#4 Оффлайн   LeshaInc

LeshaInc
  • Пользователи
  • Сообщений: 1 212
  • Уровень сигнала: 14,44%
  • В игре: 117 час. 41 мин.
  • ГородЛуна

Награды

                       

Отправлено 14 Февраль 2016 - 18:15

Либа прикольная, только какой в ней смысл не понятно. Очень хочется вставить эту картинку:

Спойлер

 

А так норм, сменя лайк и плюсик в репку.


  • ECS это нравится

#5 Оффлайн   Seryoga

Seryoga
  • Автор темы
  • Пользователи
  • Сообщений: 108
  • Уровень сигнала: 0,31%
  • В игре: 2 час. 33 мин.
  • ГородSaint-Petersburg

Награды

        

Отправлено 14 Февраль 2016 - 19:13

Либа прикольная, только какой в ней смысл не понятно.

Попробуй запустить файл painter.test. Там ты увидишь два двигающихся объекта и много статических. + один из этих объектов полупрозрачный.

  1. Когда перемещаются эти объекты экран не мигает. 
  2. Простота анализа пересечений объектов. Например чтобы проверить пересекаются ли два прямоугольника, нужно написать кучу проверок. Здесь тебе нужно задать два прямоугольника и в цикле проверить входят ли углы одного прямоугольника в другой. При помощи метода isInside(Vector): Boolean. В будущем я добавлю функции по типу intersectionFF(Polygon2d, Polygon2d): Boolean и intersectFF(Polygon2d, Polygon2d): Polygon2d
  3. Объекты заданные векторно легко масштабируются, перемещаются, искривляются, поворачиваются и мн. др.
  4. Это всё упростит разработку редакторов и игр на луа
  5. и др...

 

Все тесты с циферками приведу позже, пока что все оценки скорости на глазок. Очевидно, что полное перерисовывание экрана каждый такт менее производительно, чем частичное перерисовывание. 


Сообщение отредактировал Seryoga: 14 Февраль 2016 - 19:13

  • Hello это нравится

#6 Оффлайн   Seryoga

Seryoga
  • Автор темы
  • Пользователи
  • Сообщений: 108
  • Уровень сигнала: 0,31%
  • В игре: 2 час. 33 мин.
  • ГородSaint-Petersburg

Награды

        

Отправлено 14 Февраль 2016 - 19:38

Added an description of vector2d
Added an description of section2d
Added an description of line2d
Added an description of polyline2d
Added an description of polygon2d


Сообщение отредактировал Seryoga: 14 Февраль 2016 - 20:07


#7 Оффлайн   LeshaInc

LeshaInc
  • Пользователи
  • Сообщений: 1 212
  • Уровень сигнала: 14,44%
  • В игре: 117 час. 41 мин.
  • ГородЛуна

Награды

                       

Отправлено 14 Февраль 2016 - 20:16

........................ы.ыыыыыыыы......................

 

Я понимаю что оно делает, я не понимаю зачем оно это делает. Кому нужны квадратики и кружочки?



#8 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 229
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 14 Февраль 2016 - 20:37

Серега, не слушай Лёшу, пиши документацию. Мне, к примеру, пока не понятно, как векторная графика связана с GUI?
  • Hello это нравится

#9 Оффлайн   Seryoga

Seryoga
  • Автор темы
  • Пользователи
  • Сообщений: 108
  • Уровень сигнала: 0,31%
  • В игре: 2 час. 33 мин.
  • ГородSaint-Petersburg

Награды

        

Отправлено 14 Февраль 2016 - 20:43

Added an description of color
Added an description of pixel
Added an description of matrix
Added an description of painter



#10 Оффлайн   ECS

ECS
  • Гуру
  • Сообщений: 204
  • Уровень сигнала: 0,51%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 14 Февраль 2016 - 20:44

Начнем с того, что тут мы имеем крайне медленную и неоптимизированную отрисовку: цвет фона меняется каждую итерацию в цикле. Например, если мы имеем в памяти линию красного цвета длиной в 150 пикселей, то куда грамотнее будет разово изменить цвет фона на красный, а затем выполнить gpu.fill(), нежели выполнять 150 итераций со сменой цвета и установкой пикселя (скриншот кода с гиста автора ниже). Это нехитрое действо сократит количество GPU-операций в десятки и сотни раз, учитывая размеры мониторов.

 

Далее рассмотрим таблицу matrix: во-первых, это трехмерный массив, что уже сильно повышает расход оперативной памяти: куда выгоднее сделать одномерную таблицу с последующим получением из нее нужных индексов. Во-вторых, в каждой подтаблице имеется отдельная boolean-переменная, отвечающей за смену пикселя. Это шутка такая? Боюсь себе представить, сколько памяти сжирают эти махинации.

 

7df06e65166fb8b9ba0c7c2ed3726351.png

 

Сильно не люблю критиковать других людей, но заявленным "упором на скорость рисования 2D-объектов" тут даже близко не пахнет. Плюс, реализация библиотеки с пародией на ООП лично у меня вызывают лютое отвращение: неудобно, некрасиво, куча лишнего кода при создании программ, бр-р-р. Кроме того, на форуме уже есть прекрасная графическая GML-либа: названия ее методов просты как божий день, да и графика рисуется в разы быстрее. Также рекомендую либу двойного буфера для максимальной скорости рисования.

 

В общем, шли бы лучше игрушки кодить для опенкомпов - и детишкам понравилось бы, и критики никакой не услышали бы, игры любят все, в любом виде!  :lol:


Сообщение отредактировал ECS: 14 Февраль 2016 - 21:16

  • Krutoy и LeshaInc это нравится

#11 Оффлайн   Seryoga

Seryoga
  • Автор темы
  • Пользователи
  • Сообщений: 108
  • Уровень сигнала: 0,31%
  • В игре: 2 час. 33 мин.
  • ГородSaint-Petersburg

Награды

        

Отправлено 14 Февраль 2016 - 21:02

Крайне медленная и неоптимизированная отрисовка, цвет фона меняется каждый раз без проверки на соседние пиксели. Например, если мы имеем в памяти линию красного цвета длиной в 150 пикселей, то куда грамотнее будет разово изменить цвет фона на красный, а затем выполнить gpu.fill( ), нежели выполнять 150 итераций со сменой цвета (скриншот кода с гиста автора ниже). Это сократит количество GPU-операций в десятки и сотни раз, учитывая размеры мониторов. Так что "упором на скорость рисования 2D объектов" тут даже близко не пахнет, да и реализация библиотеки с упором на ООП у меня лично вызывают лютое отвращение: неудобно, некрасиво, бр-р-р. Кроме того, на форуме уже есть прекрасная графическая GML-либа: она написана куда приятнее, названия методов просты как божий день, да и прорисовка работает быстрее. Также рекомендую либу двойного буфера для максимальной скорости рисования. Шли бы лучше игрушки кодить для опенкомпов - и детишкам понравилось бы, и критики никакой не услышал бы, игры любят все!  :lol:

 

7df06e65166fb8b9ba0c7c2ed3726351.png

  1. Если тебе захочется нарисовать огромный прямоугольник, то можно сделать это за 1 операцию XD
  2. Упор идёт на динамические структуры. Я не спорю можно сделать анализ соседних пикселей, это в среднем сократит количество операций вдвое, хотя не факт. Так для рисования больших прямоугольников лучше использовать скомпилированные функции. Над чем я и работаю, просто сюда не добавил. Так как очень сырые.
  3. Ты нарисуешь один раз кучу объектов, подождёшь 0.1 сек, а дальше будет изменение 1 - 10 пикселей.

​Преимущества векторизации: 

  1. Возможность создания view-портов, что позволит только перемещать матрицу в мире, а не объекты. 
  2. Сейчас работаю над созданием матрицы у которой контур не прямоугольник, а полигон, что позволит создавать необычные сцены.
  3. Код легко расширяем, например чтобы сделать анализ соседних пикселей, я могу сопенсорсить твою функцию draw.

Сообщение отредактировал Seryoga: 14 Февраль 2016 - 21:09


#12 Оффлайн   ECS

ECS
  • Гуру
  • Сообщений: 204
  • Уровень сигнала: 0,51%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 14 Февраль 2016 - 21:14

Ты нарисуешь один раз кучу объектов, подождёшь 0.1 сек, а дальше будет изменение 1 - 10 пикселей.

 

А пиксели эти будут рисоваться с постоянной сменой цвета и фона, ага. Допустим, на экране изменился прямоугольник 5х2 синего цвета. Как будет работать твой код? Правильно, он выполнит 10 раз операцию gpu.setBackground() и 10 раз операцию gpu.set(), в то время как можно было бы всего лишь gpu.setBackground(); gpu.fill(). Напомню, каждая операция видеокарты - это реальные игровые тики, и при таком подходе к отрисовке любая более-менее сносная игра у тебя попросту будет фризится.

 

Кроме того, как я и сказал выше, у тебя крайне неразумен расход памяти. Надо скачать ради интереса твою либу и проверить, сколько памяти она сжирает при полноэкранных 160х50 отрисовках. Интересно, вылетит out of memory или нет? Как знать, как знать!

 

 

 

P.S. Боже упаси, 823 кбайта памяти сожрало! Изыди, изыди!  :D

 

491259dce35901551a1218ebfeb0bfff.png


Сообщение отредактировал ECS: 14 Февраль 2016 - 21:34

  • Ren это нравится

#13 Оффлайн   Seryoga

Seryoga
  • Автор темы
  • Пользователи
  • Сообщений: 108
  • Уровень сигнала: 0,31%
  • В игре: 2 час. 33 мин.
  • ГородSaint-Petersburg

Награды

        

Отправлено 14 Февраль 2016 - 21:25

А пиксели эти будут рисоваться с постоянной сменой цвета и фона, ага. Допустим, на экране изменился прямоугольник 5х2 синего цвета. Как будет работать твой код? Правильно, он выполнит 10 раз операцию gpu.setBackground() и 10 раз операцию gpu.set(), в то время как можно было бы всего лишь gpu.setBackground(); gpu.fill(). Напомню, каждая операция видеокарты - это реальные игровые тики, и при таком подходе к отрисовке любая более-менее сносная игра у тебя попросту будет фризится.

 

Кроме того, как я и сказал выше, у тебя крайне неразумен расход памяти. Надо скачать ради интереса твою либу и проверить, сколько памяти она сжирает при полноэкранных 160х50 отрисовках. Интересно, вылетит out of memory или нет? Как знать, как знать!

Хорошо, в ближайшие дни добавлю анализ соседних пикселей.


Сообщение отредактировал Seryoga: 14 Февраль 2016 - 21:25


#14 Оффлайн   Seryoga

Seryoga
  • Автор темы
  • Пользователи
  • Сообщений: 108
  • Уровень сигнала: 0,31%
  • В игре: 2 час. 33 мин.
  • ГородSaint-Petersburg

Награды

        

Отправлено 15 Февраль 2016 - 20:15

pixel.lua удалён.
Изменена структура матрицы. Теперь она одномерная.







Темы с аналогичным тегами OC, GUI, beta

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных