www.demoscene.ruenglish version
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация   ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Forth Haiku
На страницу Пред.  1, 2, 3 ... 6, 7, 8 ... 19, 20, 21  След.
 
Начать новую тему   Ответить на тему    Список форумов DemoScene.Ru -> Демо
Предыдущая тема :: Следующая тема  
Автор Сообщение
Manwe
Администратор сайта


Зарегистрирован: 21.09.2007
Сообщения: 1424


СообщениеДобавлено: Чт Янв 23, 2014 10:25    Заголовок сообщения: Ответить с цитатой

BiTL писал(а):
Да уж, у меня всего 20 фпс Smile

А размер-то, размер!

Не удержался: мои 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 и ругает меня за неоптимальность, я стараюсь Smile Люди обычно делают в 94 байта то, что я делаю в 35 байт.
_________________
Manwe/SandS
www.manwe.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Digimind
assembler digger


Зарегистрирован: 22.09.2007
Сообщения: 103


СообщениеДобавлено: Чт Янв 23, 2014 13:32    Заголовок сообщения: Ответить с цитатой

Manwe писал(а):
Люди обычно делают в 94 байта то, что я делаю в 35 байт.

Можно сделать очень похожий вариант в 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 байт Smile

Ну и если уж закрывать глаза на погрешности, то оригинальный 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 Smile
_________________
Manwe/SandS
www.manwe.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
BiTL
DOS lover


Зарегистрирован: 22.09.2007
Сообщения: 2950


СообщениеДобавлено: Пт Янв 24, 2014 06:57    Заголовок сообщения: Ответить с цитатой

Manwe писал(а):
В оригинале с затемнением, конечно, лучше, но чтобы сделать такое через стек - надо крепко подумать. Может быть придумаю. А может быть и нет.


а я думал "стек лучше переменных", а forth вообще супер-язык Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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 байт Smile


Ну про 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 байтами

Круто. Хотя, при утряске произошла усушка Smile
Надо будет команды z* и z+ освоить.

А я, тем временем, поборол таки злой шейдер.
Rippled Darkness

Но оно того не стоило: слишком много кода во внутреннем цикле, получается всего 9 итераций вместо оригинальных 25-ти. Выглядит хуже. Но сам факт - получилось, и команда z* пригодилась. Забавно, что команда "not" не работает и пришлось писать свою.

BiTL писал(а):
а я думал "стек лучше переменных", а forth вообще супер-язык Smile

Стек лучше, когда он не один. Пара-тройка дополнительных стеков никогда не помешает Smile В стандартном Forth можно завести ещё стеков, а в этом... В этом даже IF и FOR отменили. Экстрим!
_________________
Manwe/SandS
www.manwe.ru
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
BiTL
DOS lover


Зарегистрирован: 22.09.2007
Сообщения: 2950


СообщениеДобавлено: Пт Янв 24, 2014 23:15    Заголовок сообщения: Ответить с цитатой

Manwe писал(а):

Стек лучше, когда он не один. Пара-тройка дополнительных стеков никогда не помешает Smile В стандартном Forth можно завести ещё стеков, а в этом... В этом даже IF и FOR отменили. Экстрим!


А чем хуже, когда есть и стеки и переменные/регистры? Ваще по-моему, красота Smile

Я конечно в свое время неплохо позабавился с оптимизацией FPU-кода, но это всё-таки сродни складыванию кубика Рубика. Практическая польза отсутствует. Регистры удобнее в большинстве случаев.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Manwe
Администратор сайта


Зарегистрирован: 21.09.2007
Сообщения: 1424


СообщениеДобавлено: Сб Янв 25, 2014 05:18    Заголовок сообщения: Ответить с цитатой

Регистр - частный случай стека Smile
Рискну предположить, что чисто стековая организация проще в железе, чем смешанная стеково-регистровая. Недаром в старых процессорах был особый регистр "аккумулятор", единственный пригодный для арифмитических действий. В случае со стеком, два верхних элемента стека - и есть "аккумулятор". Если в поздних процессорах возникла технология "переименования регистров" (чтобы ускорить 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 байта Smile
_________________
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...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов DemoScene.Ru -> Демо Часовой пояс: GMT + 3
На страницу Пред.  1, 2, 3 ... 6, 7, 8 ... 19, 20, 21  След.
Страница 7 из 21

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