Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1424
|
Добавлено: Чт Янв 23, 2014 10:25 Заголовок сообщения: |
|
|
BiTL писал(а): | Да уж, у меня всего 20 фпс |
А размер-то, размер!
Не удержался: мои 191 байт на Forth против их 427 байт на ShaderToy. И главное, не надо гонять пустопорожние вектора туда-сюда.
Код: | : ' 8 * 4 - 2 mod 1 - 3 * abs ;
: f dup floor - ;
: j + f 6 * 3 - abs 1 - 0 max 1 min r> * rot ;
0.05
x ' y ' + 1 -
t * 0.3 * sin abs
/
dup dup >r >r >r
t 10 / f dup dup
1 j
2 3 / j
1 3 / j |
Можно убрать 0 max 1 min, пользуясь тем, что Forth Haiku сам обрубает цвет >1 и <0. Но для корректного сравнения длины программы с оригиналом убирать не стал. До 127 байт можно сократить в ущерб производительности
Код: | : ' 8 * 4 - 2 mod 1 - abs .9 * ;
: j 3 / t 10 / 1 mod + 1 mod
6 * 3 - abs 1 -
.05
x ' y ' + .3 -
t * sin abs
/ * ;
3 j
2 j
1 j |
И даже до 120 уменьшить с небольшими потерями (чаще повторяться будет).
Вообще, хотя Digimind и ругает меня за неоптимальность, я стараюсь Люди обычно делают в 94 байта то, что я делаю в 35 байт. _________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
Digimind assembler digger
Зарегистрирован: 22.09.2007 Сообщения: 103
|
Добавлено: Чт Янв 23, 2014 13:32 Заголовок сообщения: |
|
|
Можно сделать очень похожий вариант в 27 байт:
x 25 * sin y 25 * sin * 0 < |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1424
|
Добавлено: Чт Янв 23, 2014 13:42 Заголовок сообщения: |
|
|
Digimind писал(а): | Можно сделать очень похожий вариант в 27 байт:
x 25 * sin y 25 * sin * 0 < |
Да, почти. Если надо сильно ужать программу, то с небольшой погрешностью можно смириться. Так, глядишь, ты и моего Qbert'a сократишь до 128 байт
Ну и если уж закрывать глаза на погрешности, то оригинальный 427-байтный код ShaderToy (кстати, в IE11 он почему-то работает неверно) можно сократить до 265 байт
Код: | float m(float m)
{
return abs(mod((m/iResolution.y*8.-4.),2.)-1.)*.9;
}
float j(float j)
{
return
0.05/abs(sin((m(gl_FragCoord.x)+m(gl_FragCoord.y)-0.3)*iGlobalTime))
*
(abs(fract(j/3.+fract(iGlobalTime/10.0))*6.-3.)-1.);
}
void main(void)
{
gl_FragColor = vec4(j(3.),j(2.),j(1.),1.0);
} |
Правда, выглядит несколько иначе - наверняка там вкралась ошибка (сдвиг координат?). Но общий смысл в том, что избавляемся от лишних векторов и функций, как это было сделано при оптимизации Forth-программы. _________________ Manwe/SandS
www.manwe.ru
Последний раз редактировалось: Manwe (Вт Янв 28, 2014 16:29), всего редактировалось 3 раз(а) |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1424
|
Добавлено: Чт Янв 23, 2014 22:55 Заголовок сообщения: |
|
|
LSD is evil
По мотивам этой штуки. В оригинале с затемнением, конечно, лучше, но чтобы сделать такое через стек - надо крепко подумать. Может быть придумаю. А может быть и нет. Пока что так. Самое зло - если число 256 заменить на 4000 _________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
BiTL DOS lover
Зарегистрирован: 22.09.2007 Сообщения: 2950
|
Добавлено: Пт Янв 24, 2014 06:57 Заголовок сообщения: |
|
|
Manwe писал(а): | В оригинале с затемнением, конечно, лучше, но чтобы сделать такое через стек - надо крепко подумать. Может быть придумаю. А может быть и нет. |
а я думал "стек лучше переменных", а forth вообще супер-язык |
|
Вернуться к началу |
|
|
Digimind assembler digger
Зарегистрирован: 22.09.2007 Сообщения: 103
|
Добавлено: Пт Янв 24, 2014 14:54 Заголовок сообщения: |
|
|
Manwe писал(а): | Qbert
В оптимизированном виде 172 байта, 72 слова
Код: | : d dup ;
: f floor 2 mod ;
: r + d floor - 0.5 - ;
x 16 * f
y 10 * f
- abs
1.5 + 3 /
y 10 * 0.5 - f 2 / d
y 5 * r 3.2 * abs
x 8 * rot r abs
+ 0.5 > *
d 0 = +
d d sqrt 2 / *
d d * |
|
Manwe писал(а): | Так, глядишь, ты и моего Qbert'a сократишь до 128 байт |
Ну про 128 байт ты загнул конечно, я бы ограничился скромными 90 байтами:
Код: | : n 3 mod ceil ;
x y 2 * 8 8 z* n
dup rot n
= x 16 * n
rot + 4 = - 2 +
3 / dup 2 / dup 2 / |
|
|
Вернуться к началу |
|
|
tone robot modeller
Зарегистрирован: 21.09.2007 Сообщения: 513
|
Добавлено: Пт Янв 24, 2014 20:55 Заголовок сообщения: |
|
|
Саша прекрати троллить Диджимайнда! |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1424
|
Добавлено: Пт Янв 24, 2014 22:13 Заголовок сообщения: |
|
|
Digimind писал(а): | Ну про 128 байт ты загнул конечно, я бы ограничился скромными 90 байтами |
Круто. Хотя, при утряске произошла усушка
Надо будет команды z* и z+ освоить.
А я, тем временем, поборол таки злой шейдер.
Rippled Darkness
Но оно того не стоило: слишком много кода во внутреннем цикле, получается всего 9 итераций вместо оригинальных 25-ти. Выглядит хуже. Но сам факт - получилось, и команда z* пригодилась. Забавно, что команда "not" не работает и пришлось писать свою.
BiTL писал(а): | а я думал "стек лучше переменных", а forth вообще супер-язык |
Стек лучше, когда он не один. Пара-тройка дополнительных стеков никогда не помешает В стандартном Forth можно завести ещё стеков, а в этом... В этом даже IF и FOR отменили. Экстрим! _________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
BiTL DOS lover
Зарегистрирован: 22.09.2007 Сообщения: 2950
|
Добавлено: Пт Янв 24, 2014 23:15 Заголовок сообщения: |
|
|
Manwe писал(а): |
Стек лучше, когда он не один. Пара-тройка дополнительных стеков никогда не помешает В стандартном Forth можно завести ещё стеков, а в этом... В этом даже IF и FOR отменили. Экстрим! |
А чем хуже, когда есть и стеки и переменные/регистры? Ваще по-моему, красота
Я конечно в свое время неплохо позабавился с оптимизацией FPU-кода, но это всё-таки сродни складыванию кубика Рубика. Практическая польза отсутствует. Регистры удобнее в большинстве случаев. |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1424
|
Добавлено: Сб Янв 25, 2014 05:18 Заголовок сообщения: |
|
|
Регистр - частный случай стека
Рискну предположить, что чисто стековая организация проще в железе, чем смешанная стеково-регистровая. Недаром в старых процессорах был особый регистр "аккумулятор", единственный пригодный для арифмитических действий. В случае со стеком, два верхних элемента стека - и есть "аккумулятор". Если в поздних процессорах возникла технология "переименования регистров" (чтобы ускорить MOVы и сделать все регистры одинаково пригодными для АЛУ), то Forth-процессору нужен всего один "переименовщик" (указатель на вершину стека).
Но если развивать идею Forth и внедрять несколько стеков, то да - это уже не столь простое железо получится.
P.S. люди какой-то беспредел творят в Forth Haiku. _________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
Digimind assembler digger
Зарегистрирован: 22.09.2007 Сообщения: 103
|
Добавлено: Сб Янв 25, 2014 09:33 Заголовок сообщения: |
|
|
Manwe писал(а): |
... Qbert ...
Надо будет команды z* и z+ освоить.
|
Команда комплексного умножения сэкономила всего лишь несколько байт, так что ключевую роль она не сыграла.
Дело в выборе алгоритма, который оказался чудесным образом схожим со скриншотом, который ты назначил на мою аватарку.
Я бы объяснил алгоритм в двух словах, но этот форт такой шифрованный, что понять будет невозможно. Поэтому объясню всю работу Qbert 90 байт на нестековом языке:
Код: | // номера полосок по горизонтали и двум диагоналям
n1 = ceil(mod(16 * x, 3));
n2 = ceil(mod(8 * x + 16 * y, 3));
n3 = ceil(mod(8 * x - 16 * y, 3));
// комбинируем номера полосок в индекс палитры
p = 2 - (n1 + n2 == 4) + (n2 == n3);
// по индексу палитры делаем цвет
red = p / 3;
green = p / 6;
blue = p / 12; |
|
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1424
|
Добавлено: Сб Янв 25, 2014 11:12 Заголовок сообщения: |
|
|
Digimind писал(а): | Команда комплексного умножения сэкономила всего лишь несколько байт, так что ключевую роль она не сыграла. |
Тогда можно вернуть эти несколько байт, зато в расчёте n3 вычитать единицу из Y. И немного поменять условие. Тогда "освещение" будет падать не только на правый нижний угол картины, а на всё полотно. Типа такого (121 байт < 128 байт = профит):
Код: | : n 3 mod ceil ;
1
x 8 * y 1 - 16 * - n
x 16.01 * n dup
x 8 * y 16 * + n
+ 4 = -rot
+ 3 mod 2 =
2 / +
-
dup 2 / dup 1.9 / |
Условие n2 == n3 я заменяю на mod( n1 + n3 , 3 ) == 2.
Для экономии (в ущерб красоте) можно округлить коэффициенты 16.01 и 1.9 - получим 116 байт (но красота важней!).
Самая симпатичная цветокоррекция получается в 127 байт
Код: | : n 3 mod ceil ;
1.1
x 8 * y 1 - 16 * - n
x 16.01 * n dup
x 8 * y 16 * + n
+ 4 = -rot
+ 3 mod 2 =
.7 * +
- sqrt
dup 2 / dup 2 / |
Есть идеи как ужать без ущерба качеству? _________________ Manwe/SandS
www.manwe.ru
Последний раз редактировалось: Manwe (Сб Янв 25, 2014 16:28), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1424
|
Добавлено: Сб Янв 25, 2014 13:05 Заголовок сообщения: |
|
|
Оказалось, не зря я недолюбливаю ceil - от него все глюки. Floor помогает выиграть 2 байта:
Код: | : n 3 mod floor ;
1.1
x 8 * y 1 - 16 * - n
x 16 * n dup
x 8 * y 16 * + n
+ 2 = -rot
+ 3 mod 0 =
.7 * +
- sqrt
dup 2 / dup 2 / |
P.S. да, речь идёт о JavaScript (браузеры без WebGL). С WebGL и так всё нормально в 90-байтном варианте. Всё из-за разницы в вычислении mod. _________________ Manwe/SandS
www.manwe.ru
Последний раз редактировалось: Manwe (Сб Янв 25, 2014 19:35), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Manwe Администратор сайта
Зарегистрирован: 21.09.2007 Сообщения: 1424
|
Добавлено: Сб Янв 25, 2014 19:31 Заголовок сообщения: |
|
|
Electro Snakes
Грубый набросок, без оптимизации.
Код: | : ' 14.8 * 7.4 - ;
: move t 6 + 2 * swap / dup floor - pi * 2 * x ' y ' atan2 - sin .7 > * + + ;
: romb x ' abs y ' abs + - abs .15 < dup ;
0 0 0
1 romb -3.1 move
3 romb 3.7 move
5 romb -4.1 move
7 romb 4.7 move
9 romb -5.3 move
11 romb 6.1 move
13 romb -7.1 move
+ 2 / 1.3 ** dup .2 ** .2 + |
Если забить на простые числа, то можно ужать. Например, так (159 байт, но смотрится хуже)
Код: | : ' 8 * 4 - ;
0
x ' abs y ' abs + dup >r
1 mod .5 - abs .07 <
dup
t 1 +
r> ceil dup 2 mod 2 * 1 - *
/ 1 mod
pi * 2 *
x ' y ' atan2 - sin .7 > *
+ 2 / dup .2 ** |
Ну и можно, конечно, целый гадюшник напустить (только зачем)? Или округлить 2Пи до 6.28 (или сделать змей красными) и уложиться в 128 байт. Единственное, чего делать не стоит - убирать t+1, иначе в браузере без GLSL будет уныло.
Код: | : ' .5 - 12 * t 9 / sin 2 + * ;
0
x ' abs y ' abs + dup >r
1 mod .4 <
t 1 +
r> floor dup 2 mod 2 * 1 - *
/ 1 mod
pi * 2 *
x ' y ' atan2 - sin .7 > * |
P.S. сейчас придёт Digimind и сделает то же самое в 64 байта _________________ Manwe/SandS
www.manwe.ru |
|
Вернуться к началу |
|
|
Digimind assembler digger
Зарегистрирован: 22.09.2007 Сообщения: 103
|
Добавлено: Вс Янв 26, 2014 11:10 Заголовок сообщения: |
|
|
Manwe писал(а): | речь идёт о JavaScript (браузеры без WebGL). С WebGL и так всё нормально в 90-байтном варианте. Всё из-за разницы в вычислении mod. |
Вообще-то браузеров без WebGL уже не существует (http://en.wikipedia.org/wiki/WebGL#Support). Единственная возможная проблема - это частичная поддержка в IE11, под которую ты опять почему-то подстраиваешься.
Manwe писал(а): | Вроде как освоился. Можно теперь к ShaderToy переходить. А там, глядишь, и |
Это ты пока с IE11 освоился - с фолбеком на софтверный режим. А там, глядишь, и OS станешь загружать в Safe Mode... |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|