Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Ср Янв 08, 2014 09:42 Заголовок сообщения: |
|
|
PACMAN
Преследовались следующие цели:
1) АнтиАлиасинг. Меня спрашивали почему Pong был без АА. Странный вопрос, но если народ тянется к прекрасному, надо ему это прекрасное дать.
2) Переключание сцен по времени. В данном случае две сцены используют некоторые общие части кода и за счёт этого можно было бы ужать программу, но смысл в другом: разделить по времени любые две сцены. Заодно потренировал сопряжение гармонических колебаний с линейным ходом времени. А также эффект fade in.
3) Совместимость. Некоторые браузеры не умеют воспроизводить анимацию, время у них всегда равно нулю. В этом случае сцена покажется с самого начала, а это - чёрный экран (fade in). По такому случаю к переменной времени t во всех местах добавляется число 4, чтобы показывать сцену с середины. "1 mod" для выделения дробной части не годится (см. следующее сообщение). И компоненту цвета blue лучше задать явно, нежели опустить.
Итого 433 байта. Ужимать нет смысла, лучше сохранить читаемость программы и совместимость.
А для любителей оптимизации - Pacman mini (223 байта)
Код: | : d dup ;
: p x t pi / d floor - 1.4 * 0.2 - ;
: r - d * + sqrt 0.018 < ;
p - d * y 0.5 - d * + sqrt 0.16 <
y 0.5 - p - atan2 abs t 10 * cos abs 0.8 * > *
p - d * y 0.58 r -
x x 8 * floor 0.5 + 8 / - d *
y 0.5 r
p > * +
d 0 |
Мжно сократить как минимум на 6 байт, но не вижу смысла - в 256 и так влезает, а совместимость терять не хочется. _________________ Manwe/SandS
www.manwe.ru
Последний раз редактировалось: Manwe (Ср Янв 08, 2014 12:41), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Ср Янв 08, 2014 10:08 Заголовок сообщения: |
|
|
Digimind писал(а): | при использовании времени задействуется WebGL/GLSL. А там официальная спецификация такова: mod(x,y)=x-y*floor(x/y). При y=1 получается как раз то, что нужно: mod(x,1)=x-floor(x). |
Проблема возникает в браузерах, не поддерживающих анимацию: Forth-программа переводится не в GLSL, а в JavaScript, и там "1 mod" работает иначе. В результате получаем глюк как на картинке (сверху - изначальная задумка, снизу - "оптимизированный" вариант):
_________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Ср Янв 08, 2014 16:40 Заголовок сообщения: |
|
|
SPACE INVADERS (509 байт)
_________________ Manwe/SandS
www.manwe.ru
Последний раз редактировалось: Manwe (Пт Янв 10, 2014 13:51), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Ср Янв 08, 2014 17:42 Заголовок сообщения: |
|
|
The making of...
Дальше будет вот что (128 байт). Жаль, конечно, в этой реализации Forth побитовая операция AND заменена на логическую (0 = "ложь", любое другое число = "истина"), из-за этого пришлось раздувать программу.
Код: | : l 2 x 11 * floor ** / 2 mod swap y 11 * floor = * + ;
0 0 0
9 260 l
8 136 l
7 508 l
6 886 l
5 2047 l
4 1533 l
3 1285 l
2 216 l |
Только не нажимайте в форме редактора кнопку SUBMIT. Вместо неё используйте кнопку UPDATE.
В 251 байт уже возможно такое (но я нацелен на 512 байт)
Код: | : d dup ;
: i t 2 + 9 / d floor - 0.5 - d 0 > 2 * 1 - * 2 / x + ;
: c 256 * floor 16 mod ;
: l over y c =
swap 2 i c ** / floor 2 mod *
i d 1 < swap 0.25 > * *
y 0.5 > *
rot + swap 1 - ;
0 0
9 1040 l 544 l 2032 l 3544 l 8188 l 6132 l 5140 l 864 l drop |
Пока что засада с компилятором, который не переваривает многочисленные вызовы оператора "l". Пришлось откусывать от спрайтов нижнюю строчку, иначе space invaders не хотят шевелиться. Размер программы 338 байт
Код: | : d dup ;
: i t 2 + 9 / d floor - 0.5 - d 0 > 2 * 1 - * 2 / x + ;
: c 256 * floor 16 mod ;
: l over y c =
swap 2 i c ** / floor 2 mod *
i d 1 < swap 0.25 > * *
y 0.5 > *
rot + swap 1 - ;
0
0 9 1040 l 544 l 2032 l 3544 l 8188 l 6132 l 5140 l drop
t 7 * sin 0 > *
0 9 1040 l 4644 l 6132 l 7644 l 8188 l 4088 l 1040 l drop
t 7 * sin 0 <= *
+ |
Надежда на то, что в обоих спрайтах есть две одинаковых строчки, и если вынести их за цикл отрисовки, то можно сэкономить пару вызовов.
P.S. не нажимайте в редакторе кнопку SUBMIT! Только UPDATE.
Ну да, вынос двух строк спрайтов за цикл помог. 337 байт
Код: | : d dup ;
: i t 2 + 9 / d floor - 0.5 - d 0 > 2 * 1 - * 2 / x + ;
: c 256 * floor 16 mod ;
: l
2 i c ** / floor 2 mod
swap y c = * +
i d 1 < swap 0.25 > * *
y 0.5 > * ;
0
0 8 544 l 7 2032 l 6 3544 l 4 6132 l 3 5140 l 2 864 l
t 7 * sin 0 > *
0 8 4644 l 7 6132 l 6 7644 l 4 4088 l 3 1040 l 2 2056 l
t 7 * sin 0 <= * +
0 9 1040 l 5 8188 l + |
Только встроенную видеокарту ноутбука это вешает напрочь.
Можно увеличить исходный текст на 11 байт, но зато облегчить работу компилятору и видеокарте (функция "i" будет вызываться не дважды, а один раз, после чего результат копируется в дополнительный стек, а позже возвращается оттуда)
Код: | : d dup ;
: i t 9 / d floor - 0.5 - d 0 > 2 * 1 - * 2 / x + ;
: c 256 * floor 16 mod ;
: l
2 i d >r c ** / floor 2 mod
swap y c = * +
r> d 1 < swap 0.25 > * *
y 0.5 > * y 0.85 < * ;
0
0 8 544 l 7 2032 l 6 3544 l 4 6132 l 3 5140 l 2 864 l
t 7 * sin 0 > *
0 8 4644 l 7 6132 l 6 7644 l 4 4088 l 3 1040 l 2 2056 l
t 7 * sin 0 <= * +
9 1040 l 5 8188 l |
Цвета годные?
Или так лучше?
Или так:
А можно растворить верхние ряды в темноте. Ровно в 512 байт влезает:
Райно писал(а): | Последний вариант создает иллюзию, что их много ещё в темноте прячется, по-моему наиболее удачный)
А если скролл по инвадерам пустить, возможно там такое накодить?
CENSORED |
Теоретически можно, но уже места не хватит
У меня похожая идея припасена для следующего шейдера, в нём будет похожее.
Mikle писал(а): | А если цвет потеплее взять?
|
Космичность и олдскульность теряется _________________ Manwe/SandS
www.manwe.ru
Последний раз редактировалось: Manwe (Пт Янв 10, 2014 13:51), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Сб Янв 11, 2014 11:03 Заголовок сообщения: |
|
|
Нашёл автора Forth Programming Salon в Google+. Попрошу убрать кнопку SUBMIT куда-нибудь подальше. А то всю базу заспамили случайными нажатиями. _________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Сб Янв 11, 2014 21:00 Заголовок сообщения: |
|
|
MOIRE - немного психоделической анимации.
В оригинале на GLSL было 107 байт, после портирования на Forth получилось 87 байт. Потом я ещё ход времени замедлил (так красивей), размер стал 91 байт.
_________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
BiTL DOS lover
Зарегистрирован: 22.09.2007 Сообщения: 2950
|
Добавлено: Сб Янв 11, 2014 21:04 Заголовок сообщения: |
|
|
та ну, это уже не интересно ) Портируй Mars.exe |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Сб Янв 11, 2014 22:08 Заголовок сообщения: |
|
|
BiTL писал(а): | та ну, это уже не интересно ) Портируй Mars.exe |
Избаловал я вас!
Это интересно размером. Для ShaderToy вообще круто
P.S. о, кто-то уже оптимизировал Moire. В самом деле, можно как минимум безболезненно заменить -rot на rot (их там два, стало быть, на два байта короче). И оказалось, что вещественные числа можно записывать не в виде "0.5", а экономить, опуская ноль - ".5" _________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
frag
Зарегистрирован: 18.01.2012 Сообщения: 14
|
Добавлено: Вс Янв 12, 2014 02:41 Заголовок сообщения: |
|
|
То же самое в 77 байт.
-rot на rot можно заменить только после перестановки порядка в стеке.
Последний раз редактировалось: frag (Вс Янв 12, 2014 02:45), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Вс Янв 12, 2014 02:45 Заголовок сообщения: |
|
|
frag писал(а): | То же самое в 77 байт. |
Супер. Только объясни физический смысл этих гигантских коэффициентов!
Кстати, надо попросить автора сайта добавить возможность удалять свои хайку, иначе плодится куча ненужных клонов. _________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
frag
Зарегистрирован: 18.01.2012 Сообщения: 14
|
Добавлено: Вс Янв 12, 2014 02:51 Заголовок сообщения: |
|
|
У тебя в стеке значения идут такие:
2x 4x 8x
У меня rot в другую сторону и вызывается три раза, поэтому порядок такой
4x 8x 2x
256*256*4=262144
А время не удваиваю, поэтому оно как раз вдвое меньше координаты получается. |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Вс Янв 12, 2014 17:37 Заголовок сообщения: |
|
|
Мой 9-летний сын уже такое пишет. Сам.
И такую анимированную штуку, очень круто:
Код: | x 9.4 * sin
y 9.4 * sin
t 4 * sin
* *
dup t 2 * sin *
dup t 3 * sin * |
Непонятные злые анимации тоже строгает:
Ещё он лазал по JS и раскопал недокументированные операторы. _________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
Mikle
Зарегистрирован: 02.12.2008 Сообщения: 432 Откуда: Туапсе
|
Добавлено: Вс Янв 12, 2014 19:30 Заголовок сообщения: |
|
|
Цитата: | Ещё он лазал по JS и раскопал недокументированные операторы. |
Круто. Помню, когда-то я раскопал недокументированные инструкции в процессоре 6502 (на Atari), даже написал свой загрузчик игр с их применением. |
|
Вернуться к началу |
|
|
BiTL DOS lover
Зарегистрирован: 22.09.2007 Сообщения: 2950
|
Добавлено: Вс Янв 12, 2014 19:59 Заголовок сообщения: |
|
|
Мой кот только что написал HalfLife 3, но уже удалил |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1426
|
Добавлено: Вс Янв 12, 2014 20:08 Заголовок сообщения: |
|
|
BiTL писал(а): | Мой кот только что написал HalfLife 3, но уже удалил |
Ссылка на недокументированные операторы - это мой код ("toy pyramid"), но первая строчка - с операторами, которые нарыл сынишка. Кстати, он в этот компилятор Forth'a уже добавил недостающую функцию 2SWAP и побитовые логические операции. Так-то! А я даже не лезу в этот JavaScript. _________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|