Перейти к публикации
Форум - ComputerCraft
ECS

DoubleBuffering: двойная буферизация графики

Рекомендованные сообщения

Проводилось ли какое либо тестирование на предмет эффективности предлагаемой библиотеки по сравнению со стандартным выводом на экран?

 

ECS? Такое ощущение, что давно знакомый человек сменил ник и аву.

Изменено пользователем Zer0Galaxy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Проводилось ли какое либо тестирование на предмет эффективности предлагаемой библиотеки по сравнению со стандартным выводом на экран?

 

Ясен красен производилась. Собственно, для этого и писалась сама либа - во славу прироста скорости. Отдельные замеры проводить дико лень, ибо смысла убеждать себя в очевидных вещах нет, однако вон тут на 3:45 быстродействие будет четко заметно:

 

http://www.youtube.com/watch?v=U4VbTfhZDJc

Изменено пользователем ECS
  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если кому интересно, то добавил новый метод image, позволяющий вставлять изображения, созданные в фотошопе. Пикча прилагается:

 

4003a7bc65402317eba3600c758f4f7b.png

  • Like 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добавил программку-демонстратор в установщик либы. Запускайте BufferDemo.lua, если надо.

 

383b39575822a142c67408a7a9de2d68.png

Изменено пользователем ECS
  • Like 6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Чёрт. До боли напоминает другое время и другие компы. Бейсик на ZX в 80-х - 90-х. :)

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Чёрт. До боли напоминает другое время и другие компы. Бейсик на ZX в 80-х - 90-х.

 

Кстати, алгоритм смешивания цветов (тени, прозрачность) мы сперли именно из QBasic IDE :D

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Небольшое, но крайне емкое обновление:

  • Увеличена скорость отрисовки в 1.5 - 2 раза посредством добавления третьего промежуточного буфера
  • Уменьшено количество обращений к CPU, уменьшено число операций сложения/вычитания
  • Улучшена система конвертации индексов
  • Добавлено больше благодарных комментариев в коде, славящих @Krutoy за помощь в разработке.

Ну, и, собственно, демонстрация скорости работы:

 

http://www.youtube.com/watch?v=HrIA9kMjQvg

Изменено пользователем ECS
  • Like 7

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Молодец, @Krutoy!

Помог человеку и засветился на его канале :D

А либа просто шикарная!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Теперь в каждом новом видео светится моя прога  :)

Изменено пользователем qwertyMAN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В описание добавлены новые и не указанные ранее методы:

 

 

 

 

buffer.start)

 

Данный метод инициализирует библиотеку, создавая массивы экрана с текущим разрешением, установленным видеокартой. По умолчанию он вызывается при запуске библиотеки, однако вы можете вызывать его в любое время, к примеру, после изменения размеров экрана.

 

buffer.setDrawLimit( int x, int y, int ширина, int высота )

 

Устанавливает ограничивающую зону, вне которой отрисовка производиться не будет. Очень полезно при создании оконных интерфейсов, где информация не должна выходить за указанные границы.

 

buffer.resetDrawLimit( )

 

Убирает ограничивающую зону, если она была установлена ранее.

 

buffer.clearint цвет )

 

Заполняет экран указанным цветом, вызывает метод square(). Функция сделана исключительно для удобства.

 

buffer.buttonint x, int y, int ширина, int высота, int цвет кнопки, int цвет текста кнопки, string текст ): table координаты кнопки

 

Рисует на экране кнопку, автоматически размещая указанный текст по ее центру. Возвращает координаты начала и конца кнопки в массиве вида { x, y, x2, y2 }

 

buffer.adaptiveButtonint x, int y, int отступ по ширине, int отступ по высоте, int цвет кнопки, int цвет текста кнопки, string текст ): table координаты кнопки

 

Рисует на экране кнопку, автоматически рассчитывая ее размеры в зависимости от указанных отступов и длины текста. Возвращает координаты начала и конца кнопки в массиве вида { x, y, x2, y2 }

 

buffer.scrollBarint x, int y, int ширина, int высота, int количество элементов, int текущий элемент,  int цвет фона,  int цвет пимпочки )

 

Рисует на экране вертикальную полосу прокрутки. Под количеством элементов подразумевается, к примеру, количество строк в файле, а под текущим элементом текущая строка, с которой идет отображение файла.

 

buffer.horizontalScrollBarint x, int y, int ширина, int количество элементов, int текущий элемент,  int цвет фона,  int цвет пимпочки )

 

Аналогично вертикальному скроллбару, однако высоту указывать уже нельзя, скроллбар рисуется псевдографикой.

 

Изменено пользователем ECS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В описание добавлены новые и не указанные ранее методы...

 

А кнопки и скроллбары возвращают что-нибудь? (Есть хендлер по клику? Текущее положение скроллбара? и т. д.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Идею для оптимизации надо? Или нет пределу совершенства.

GP2UiybfhpM.jpg

С символом "F" так вобще не 8 будет а 4.

Изменено пользователем Jet

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мне казалось, что у него так рисует:
b09bed391c0dc4502549de8f529d55d6.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Мне казалось, что у него так рисует:

b09bed391c0dc4502549de8f529d55d6.png

Ну рекурсивное заполнение буфера именно так выглядит. А рисование (само рисование) по строчкам, хотя можно отпимизировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Крутая библиотека.

Экран 160х50

На нижнем видно фпс (новая версия игры)

0G2dk.png

 

IhlKA.png

Просто пользуюсь ей часто)

 

Кстати, максимальный возможный фпс - 19 (пустой экран)

Изменено пользователем DarthWirthe

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На нижнем видно фпс (новая версия игры)

Ого, что это на экране? Посмотреть исходники можно? Изменено пользователем eu_tomat
длинная цитата

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Круто конечно, но ОС изначально не планировался для создание на ней игр. И 2 FPS тому свидетельство.

Не вижу смысла делать полноценные сложные игры на ОС. Для этого есть луа движки. Вон например я что накатал на love2D: атака бактерий и относительный космос.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для экшон-шутеров OC не приспособлен, но какая-нибудь пиксельная казуальщина или продвинутые настолки работают прекрасно.

Ограниченность ресурсов воспитывает бережное к ним отношение, современные технологии избаловали программистов, они без задних мыслей стряпают решения для пожирания ресурсов, а не решения задач.

  • Like 3

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ого, что это на экране? Посмотреть исходники можно?

Это порт моей старой игрули с CC на OC

Топик:

http://computercraft.ru/topic/1563-computercraft-2d-rpg-game/

 

И еще OCEmu немного модифицированный мной

Изменено пользователем DarthWirthe
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

И еще OCEmu немного модифицированный мной
Вау! Мне нравится этот эмулятор. Вот только почему то  основная файловая система readonly

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для экшон-шутеров OC не приспособлен, но какая-нибудь пиксельная казуальщина или продвинутые настолки работают прекрасно.

Ограниченность ресурсов воспитывает бережное к ним отношение, современные технологии избаловали программистов, они без задних мыслей стряпают решения для пожирания ресурсов, а не решения задач.

Ну вот например, отличная игра, Сапёр!

Или Lava runner от electronic_steve в которой очень круто можно бегать убегать.

Изменено пользователем eu_tomat
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проведен рефакторинг библиотеки с целью увеличения скорости отрисовки: все методы и поля таблиц, хоть как-либо используемые самой библиотекой, заменены на единоразово созданные локальные переменные. Удалена избыточная группировка по функциям. Изменен принцип растеризации отрезков. Добавлен метод buffer.formattedText, позволяющий изменять цвет текста в реальном времени через вставку синтаксических конструкций вида #RRGGBB.

 

Как результат - общая производительность выросла в ~3 раза по сравнению со старой версией библиотеки (первая пикча) и новой (вторая):

 

pP11Ijv.png?1

 

5bn9k6n.png?1

  • Like 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

все методы и поля таблиц, хоть как-либо используемые самой библиотекой, заменены на единоразово созданные локальные переменные.

Чётко! И сборщик мусора зря не напрягается, и результаты вычислений используются повторно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Библиотека обновлена с общим увеличением производительности в ~1.4 раза и уменьшением потребления памяти на 140 Кбайт путем смены концепции хранения данных. Опытным путем выяснилось, что 2 пиксельных массива вида { 0xFFFFFF, 0xFFFFFF, "S", ... } кушают в разы больше, нежели 6 таких же массивов для цветов фона, текста и символов по раздельности (пруфскрипт - https://pastebin.com/mPynSL2H):

 

wHfWMBE.png

 

Судя по всему, подобная разница возникает из-за попеременной смены типов данных в таблице. Разумеется, это послужило отличным поводом перекодить методы отрисовки, избавившись от инкрементирования индексов в циклах. Так что все прожки, написанные на данной библиотеке, стали кушать меньше и работать быстрее. Наглядно по тикам результат следующий (см. скрины выше):

 

00Jd1aw.png?1

  • Like 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×