Решил вспомнить счастливое детство и полазить по сайтам демосценеров — с удивлением обнаружил, что многие выкладывают релизы под.. FreeBSD.
FreeBSD — мягко говоря не самая подходящая система для занятия оптимизированной графикой, поэтому наличие такого количества демо целенаправленно создаваемых под эту систему озадачило.
Поскольку я немного понимаю в компьютерах и использую FreeBSD в качестве одной из основных ОС, решил немедленно собрать и запустить самые интересные проекты.
Для непосвященных
Демосцена[1][2][3][4] (англ. demoscene) — киберкультура, зародившаяся в конце 1970-х годов вместе с распространением первых домашних компьютеров. Это направление компьютерного искусства, главной особенностью которого является выстраивание сюжетного видеоряда, создаваемого в реальном времени компьютером, по принципу работы компьютерных игр.
Демосцена это было и есть и будет круто.
Наверное все серьезные игровые движки и все компьютерные спецэффекты были созданы (и делаются поныне) бывшими сценерами:
4players.de reported that "numerous" demo and intro programmers, artists, and musicians were employed in the games industry by 2007. Video game companies with demoscene members on staff included Digital Illusions, Starbreeze, Ascaron,[43] 49Games, Remedy, Techland, Lionhead Studios,[44] Bugbear, Digital Reality, Guerrilla Games, and Akella.[45]
The Tracker music which is part of Demoscene culture could be found in many Video games of the late 1990s and early 2000s, such as the Unreal, Unreal Tournament, Deus Ex, Crusader: No Remorse, One Must Fall: 2097, Jazz Jackrabbit and Uplink.[46]
Словом демосцена это про спецэффекты и преодоление — как впихнуть невпихуемое туда где ему не место, чтобы стало круто и все офигели. И все действительно офигевают. На полном серьезе.
Ниже несколько классических примеров в качестве иллюстрации.
fr-041: debris. by Farbrausch
Все что вы видите на видео делает «программулина» в 177 килобайт. Это почти в 10 раз меньше размера 3.5 дюймовой дискеты, если кто‑то еще помнит такое устройство.
Исходники тоже уже выложены, если кому интересно.
Lifeforce by Andromeda Software Development
Это уже большое демо — целых 26 Мегабайт! Правда это все еще раз в десять меньше вашей обычной сборки очередного корпоративного говнопроекта, но тем не менее.
Также у группы есть свой очень крутой сайт с кучей других красивых демо.
heaven seven by Exceed
И снова 172кб бинарник рисует и поет всю эту красоту.
Craft by lft
Позволю процитировать автора:
Craft is a demo running on its own minimalistic demo platform. The demo platform is based on an ATmega88 microcontroller.
В самом начале видео демонстрируется та самая «own minimalistic demo platform», на которой вся эта красота запускается.
После публикации статьи на ЛОРе, народ подкинул еще пару интересных проектов, которые просто необходимо упомянуть.
Dírojed by Řrřola
32 байта:
echo 'B013CD10C51F380F10276BDBE58A0F0209028FBFFE02483F4BE460FEC875E7C3' | xxd -r -p - dirojed.com
dosbox dirojed.com
Вот так это выглядит в живую:
Hoody by Rgba
4кб приложение генерирует такую красоту:
Это не статичная картинка и не 3D модель — это алгоритмы, чистая математика, тот самый «матан» который вы так не любили все годы в ВУЗе.
Вот тут алгоритм из демо повторен с помощью WebGL:
Ниже детальный пошаговый разбор алгоритма, от самого автора:
Тестовое окружение
Тестовая машина — мой боевой некроноутбук Lenovo T440:
Загружен i915kms, xorg настроен через modesetting:
[alex@cruella ~]$ cat /usr/local/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
Identifier "Intel Graphics"
Driver "modesetting"
Option "DRI" "true"
EndSection
Все демо по‑умолчанию запускаются в полноэкранном режиме, но я запускал в окне (ключ ‑w для большинства) для создания более драматичных скриншотов.
Planet Hively by Illi Recentes ImperatoreS & Up Rough
Выглядит это демо возможно не так круто:
Но как говорится есть один нюанс, в виде списка поддерживаемых платформ:
#PLATFORM = os4
# PLATFORM = win32
# PLATFORM = linux
# PLATFORM = aros
# PLATFORM = aros64
# PLATFORM = ppc-aros
# PLATFORM = morphos-cross
# PLATFORM = beos
# PLATFORM = ppc-beos-cross
# PLATFORM = gp2x
# PLATFORM = alpha-linux-cross
# PLATFORM = ia64-linux-cross
# PLATFORM = amd64-linux-cross
# PLATFORM = s390-linux-cross
# PLATFORM = s390x-linux-cross
# PLATFORM = arm-linux-cross
# PLATFORM = sparc-linux-cross
# PLATFORM = psp
# PLATFORM = hppa-linux-cross
# PLATFORM = ppc-linux-cross
# PLATFORM = m68k-linux-cross
# PLATFORM = mips-linux-cross
# PLATFORM = mipsel-linux-cross
# PLATFORM = sh3-linux-cross
# PLATFORM = sh4-linux-cross
# PLATFORM = ppc64-linux-cross
# PLATFORM = sparc64-linux-cross
# PLATFORM = avr32-linux-cross
# PLATFORM = bsdi
# PLATFORM = qnx6
# PLATFORM = solaris
# PLATFORM = skyos
# PLATFORM = openserver5
# PLATFORM = openserver6
# PLATFORM = unixware7
# PLATFORM = mint
PLATFORM = i386-freebsd7
# PLATFORM = amd64-freebsd7-cross
# PLATFORM = sparc64-freebsd7-cross
# PLATFORM = ia64-freebsd6-cross
# PLATFORM = alpha-freebsd5-cross
# PLATFORM = riscos-cross
# PLATFORM = hppa-hpux
# PLATFORM = ia64-hpux
# PLATFORM = zaurus-cross
# PLATFORM = syllable
# PLATFORM = netbsd
# PLATFORM = alpha-netbsd4-cross
# PLATFORM = amd64-netbsd4-cross
# PLATFORM = hppa-netbsd4-cross
# PLATFORM = m68k-netbsd4-cross
# PLATFORM = mipseb-netbsd4-cross
# PLATFORM = mipsel-netbsd4-cross
# PLATFORM = ns32k-netbsd2-cross
# PLATFORM = ppc-netbsd4-cross
# PLATFORM = sh3eb-netbsd4-cross
# PLATFORM = sh3le-netbsd4-cross
# PLATFORM = sh5le-netbsd3-cross
# PLATFORM = sparc-netbsd4-cross
# PLATFORM = sparc64-netbsd4-cross
# PLATFORM = vax-netbsd4-cross
# PLATFORM = arm-netbsd4-cross
# PLATFORM = m68010-netbsd4-cross
# PLATFORM = xbox
# PLATFORM = i386-openbsd
# PLATFORM = alpha-openbsd-cross
# PLATFORM = amd64-openbsd-cross
# PLATFORM = arm-openbsd-cross
# PLATFORM = hppa-openbsd-cross
# PLATFORM = ppc-openbsd-cross
# PLATFORM = mips64-openbsd-cross
# PLATFORM = sh4-openbsd-cross
# PLATFORM = sparc64-openbsd-cross
# PLATFORM = m68k-openbsd-cross
# PLATFORM = sparc-openbsd-cross
# PLATFORM = aix
# PLATFORM = irix
# PLATFORM = irix_marq
# PLATFORM = pandora
Если вы думали, что чего-то понимаете в портировании и кроссплатформенности — начинайте искать себе новую работу. Потому я например такого многообразия никогда в жизни не видел, не то чтобы суметь повторить.
Вот так это демо выглядит будучи запущенным на Raspberry Pi:
Исходники и сборка
Исходники выложили относительно недавно, скачать можно вот тут. К сожалению со сборкой есть ряд проблем.
Во-первых авторы забыли выложить часть ресурсов и при запуске демка будет ругаться. Для исправления, нужно вытащить папку tunes из этого pull request и подложить в корень проекта.
Дальше нужно будет в файле makefile раскомментировать строку:
PLATFORM = i386-freebsd7
И заменить gcc на gcc12:
####### DEFAULT SETTINGS HERE #######
CFLAGS = -Wall -O2
LFLAGS =
CC = gcc12
DEBUGLIB =
TARGET = planethively
FASTMATH = -ffast-math
Собирать необходимо с помощью gmake, стандартный make FreeBSD не подойдет.
Написано демо целиком на чистом Си с использованием SDL (для тех платформ где он есть разумеется).
Ниже пара интересных приемов, найденных в исходном коде.
Быстрое вычисление квадратного корня:
static inline int fastsqrt( int n )
{
if( n > 32767 ) return sqrt( n );
return isqrt[n];
}
Генерация белого шума:
void hvl_GenWhiteNoise( int8 *buf, uint32 len )
{
uint32 ays;
ays = 0x41595321;
do {
uint16 ax, bx;
int8 s;
s = ays;
if( ays & 0x100 )
{
s = 0x80;
if( (LONG)(ays & 0xffff) >= 0 )
s = 0x7f;
}
*buf++ = s;
len--;
ays = (ays >> 5) | (ays << 27);
ays = (ays & 0xffffff00) | ((ays & 0xff) ^ 0x9a);
bx = ays;
ays = (ays << 2) | (ays >> 30);
ax = ays;
bx += ax;
ax ^= bx;
ays = (ays & 0xffff0000) | ax;
ays = (ays >> 3) | (ays << 29);
} while( len );
}
Но едем дальше.
Chrysler by Fit & Bandwagon
Motorola Inside 2004, 1е место
Исходный код находится вот тут, несмотря на то что архив аж от 2009го года — все отлично собирается в современном окружении.
Количество поддерживаемых платформ снова вызывает восторг:
Чтоб я так жил, как вы портируете в общем.
Вот так это демо вживую выглядит на моей FreeBSD:
Сборка и исходники
Cобирается это демо также только с помощью gmake, необходимо поправить Makefile, поставив СС=gcc12:
CC = gcc12
CFLAGS = -O2 -ffast-math `sdl-config --cflags`
#LDFLAGS = `sdl-config --libs` -lm
LDFLAGS = `sdl-config --static-libs` -lm
OBJ = data.o kirjaimet2.o kokko.o maf.o main.o mosaic.o pallot.o plasma.o\
ratas.o stripes.o video.o cool_mzx/cool_mzx.a
...
Написано все на чистом Си (а вы сомневались?), также с использованием SDL для поддерживаемых платформ. Ниже некоторые интересные моменты в исходниках.
Заданная PI-константа для Амиги:
#ifdef AMIGA
#define M_PI 3.1415927
#endif
Элегантный способ проверить правильность нескольких вызовов подряд:
int readall(void)
{
int val=0;
val+=readfile("data/tehas2.mod",&musakki);
val+=readfile("data/dd.raw",&dd);
val+=readfile("data/na_eka.raw",&na_eka);
val+=readfile("data/na_toka.raw",&na_toka);
val+=readfile("data/onnettomuus.raw",&onnettomuus);
val+=readfile("data/paa.raw",&paa);
val+=readfile("data/siunaus.raw",&siunaus);
val+=readfile("data/ukko.raw",&ukko);
val+=readfile("data/ratas.raw",&ratas);
val+=readfile("data/kooste.raw",&kooste);
val+=readfile("data/chrysler.raw",&chrysler);
return(val);
}
И сам вызов c проверкой:
if(readall()!=0)
{
printf("Problem loading datas\n");
return(0);
}
Отображение кадра из видео:
src=frame[no]*40*200;
dst =buffer;
for (y=0; y<AH; y++)
for (x=0; x<(AW/8); x++) {
ip1=bitti_muunnos+video[src]*8;
*dst++ = *ip1++;
*dst++ = *ip1++;
src++;
}
Как говорится удачи разобраться со ссылочной логикой, это именно тот случай когда на трезвую голову понимание достигнуто быть не может.
Hex Pistols by Fit
Motorola Inside 2005, 1е место, релиз на Амиге да.
Вот так выглядит запуск на фоне собственных исходников:
Сборка и исходники
Исходный код можно скачать вот тут.
Для сборки необходимо опять заменить CC=gcc на CC=gcc12 в Makefile, все просто. Написано все снова на чистом Си и SDL (для всех платформ кроме Амиги).
Из интересных приемов, например вот такое чтение RGB цвета и упаковка его в одну переменную с побитовым сдвигом:
/* Background */
if(!strcmp("backcolr",str))
{
fscanf(s,"%d%d%d",&r,&g,&b);
cgm->back=(r<<16)+(g<<8)+b;
}
Faemiyah
Это целая группа, которая стабильно ваяет и выкладывает релизы под FreeBSD. Напрочь отбитые финские товарищи, исходники всех демо доступны по ссылке.
Yog-Sothoth by Faemiyah
2е место на Assembly, 2013
К сожалению это демо у меня так нормально и не заработало, хотя и собралось — что‑то тонкое с видео.
Ghosts of Mars by Faemiyah
4е место на Assembly 2015
Кадр с ней как раз в шапке статьи, благо выглядит максимально эпично:
Сборка и исходники
Исходный код можно скачать вот тут.
Собирается проект уже «по‑современному» — с помощью cmake:
mkdir build
cd build
cmake ..
Запуск:
./ghosts_of_mars -w -r 800x600
Тут указывается оконный режим -w
и разрешение -r 800x600
Исходный код уже на нескольких языках: C, C++ плюс специальный скрипт на Python для минимизации.
Графика все также на SDL, но уже используются шейдеры и Boost.
Все сложнее и серьезнее — ребята идут к успеху
Но проблемы те же, например свой генератор случайных чисел:
/// More random random.
///
/// It's better to discard a few bottom-most bits to achieve better randomness.
///
/// \param op Modulator for random.
/// \return Random value in range [0, op[.
static int irand(int op)
{
return (dnload_rand() >> 4) % op;
}
Отладочные блоки на макросах по хардкору:
#if 1
{
const float mul = 65535.0f / largest;
for(unsigned ii = 0; (IMAGE_SIDE * IMAGE_SIDE > ii); ++ii)
{
g_image_data[ii] = static_cast<uint16_t>(65535 - g_image_preprocess[ii] * mul);
}
}
#else
{
const float mul = 255.0f / largest;
for(unsigned ii = 0; (IMAGE_SIDE * IMAGE_SIDE > ii); ++ii)
{
g_image_data[ii] = 255 - static_cast<uint8_t>(g_image_preprocess[ii] * mul);
}
}
gfx::image_png_save(std::string("lol.png"), IMAGE_SIDE, IMAGE_SIDE, 8, g_image_data);
#endif
Что такое #if 1:
Only the first block will be processed -— until someone changes the 1 to a 0. Then the other block will be compiled. This is a convenient way to temporary switch blocks of code in and out while testing different algorithms.
Adarkar Wastes by Faemiyah
Instanssi 2018, 1е место
Вот так демо выглядит в работе на моей FreeBSD:
Сборка и исходники
Исходники все там же, сборка и запуск аналогичны предыдущей работе.
Проект реализован на C++, SDL и Boost, плюс появилась маленькая вставка на ассемблере — для синтезатора. И очень много шейдеров.
Ниже опишу несколько интересных решений, найденных в исходном коде. Опять кастомный генератор случайных чисел, но уже другая реализация:
/** BSD random var. */
static bsd_u_long bsd_rand_next = 2;
int bsd_rand(void)
{
/*
* Compute x = (7^5 * x) mod (2^31 - 1)
* without overflowing 31 bits:
* (2^31 - 1) = 127773 * (7^5) + 2836
* From "Random number generators: good ones are hard to find",
* Park and Miller, Communications of the ACM, vol. 31, no. 10,
* October 1988, p. 1195.
*/
long hi, lo, x;
/* Must be in [1, 0x7ffffffe] range at this point. */
hi = (long)(bsd_rand_next / 127773);
lo = (long)(bsd_rand_next % 127773);
x = 16807 * lo - 2836 * hi;
if (x < 0)
x += 0x7fffffff;
bsd_rand_next = (bsd_u_long)x;
/* Transform to [0, 0x7ffffffd] range. */
return (int)(x - 1);
}
void bsd_srand(bsd_u_int seed)
{
/* Transform to [1, 0x7ffffffe] range. */
bsd_rand_next = (seed % 0x7ffffffe) + 1;
}
Обработка указанного разрешения (ключ -r 800x600 помните?):
/// Parse resolution from string input.
///
/// \param op Resolution string.
/// \return Tuple of width and height.
boost::tuple<unsigned, unsigned> parse_resolution(const std::string &op)
{
size_t cx = op.find("x");
if(std::string::npos == cx)
{
cx = op.rfind("p");
if((std::string::npos == cx) || (0 >= cx))
{
std::ostringstream sstr;
sstr << "invalid resolution string '" << op << '\'';
BOOST_THROW_EXCEPTION(std::runtime_error(sstr.str()));
}
std::string sh = op.substr(0, cx);
unsigned rh = boost::lexical_cast<unsigned>(sh);
unsigned rw = (rh * 16) / 9;
unsigned rem4 = rw % 4;
return boost::make_tuple(rw - rem4, rh);
}
std::string sw = op.substr(0, cx);
std::string sh = op.substr(cx + 1);
return boost::make_tuple(boost::lexical_cast<int>(sw), boost::lexical_cast<int>(sh));
}
Препроцессинг (макросы) в прямо в коде шейдеров:
float i_fov = 1.73;
//float i_fov = 1.0 / tan(60.0 / 180.0 * PI * 0.5);
#if defined(USE_LD)
perspective[0][0] = i_fov / (float(screen_size.x) / float(screen_size.y));
#elif (DISPLAY_MODE == -800) || (DISPLAY_MODE == 800) || (DISPLAY_MODE == -1200) || (DISPLAY_MODE == 1200)
perspective[0][0] = i_fov / 1.6;
#else // Assuming 16/9.
perspective[0][0] = i_fov / 1.78;
#endif
Демосцена умерла?
Наверное заметили, что все описанные в статье проекты достаточно старые?
Если покопаться в сети — окажется, что большая часть сайтов посвященных демосцене находятся в архивном состоянии, фестивали сценеров уже особо не проводятся и так далее.
Словом, может сложиться неприятное ощущение что демосцена умерла. Я вообщем-то тоже так думал, а затем нашел свежее и прекрасное:
Слово автору:
Решил реализовать новую концепцию на БК0011 — рисование картинок под музыку. Надеюсь на продолжение:) Релиз и исходные тексты: https://www.pouet.net/prod.php?which=... Трек: https://zxart.ee/rus/avtory/k/kuvo/ar...
Если кто не знает, вот что такое БК0011:
Так что дух хардкора еще очень даже жив.
P.S.
Это немного отцезурированная и доработанная версия статьи, оригинал которой доступен в нашем блоге.
0x08 Software
Мы небольшая команда ветеранов ИТ‑индустрии, создаем и дорабатываем самое разнообразное программное обеспечение, наш софт автоматизирует бизнес‑процессы на трех континентах, в самых разных отраслях и условиях.
Оживляем давно умершее, чиним никогда не работавшее и создаем невозможное — затем рассказываем об этом в своих статьях.
Комментарии (40)
UranusExplorer
05.09.2024 11:31+2Кстати, упомянутые в списке ASD (Andromeda Software) вообще интересная группа. У них очень крутые саундтреки, которые хороши даже сами по себе просто как музыкальные композиции, и у них еще несвойственный демосцене подход к их написанию - там живая электрогитара звучит. По стилю чем-то похоже на известный в узких кругах Between August and December.
aMUSiC & Leviathan - I Am You (youtube.com)
aMUSiC & Leviathan - Memento Mori (youtube.com)
aMUSiC & Leviathan - Throw Navis Off The Train (youtube.com)
aMUSiC & Leviathan - Amphetamine Tears (youtube.com)
aMUSiC & Leviathan - Planet Risk (youtube.com)aGGre55or
05.09.2024 11:31Она не просто интересная - это легендарная группа. Не говоря уже о том, что их две дивизии - на Амиге, и на ПЦ. И обе легендарные. =)
UranusExplorer
05.09.2024 11:31heaven seven by Exceed
У вас по ссылке на ютуб сломанное видео (люди в комментариях жалуются, и у меня тоже криво отображается), вот тут есть другой ролик: Exceed - Heaven Seven (Heaven 7) | pc 64k | raytracing (FullHD 1080p HQ demoscene) (youtube.com)
И кстати, в оригинале под Винду она была 64к. Это при портировании под FreeBSD так бинарь раздуло? :)
alex0x08 Автор
05.09.2024 11:31, в оригинале под Винду она была 64к. Это при портировании под FreeBSD так бинарь раздуло? :)
Вот ссылка на вендовую сборку, архив 26мб. Exe-файл действительно меньше мегабайта, но ресурсы не упакованы, как и внешние библиотеки.
UranusExplorer
05.09.2024 11:31Не, речь про heaven seven, а не про lifeforce
alex0x08 Автор
05.09.2024 11:31Тогда все ок, поскольку текст выше про 26 Мб как раз про Lifeforce, а вот про Heaven Seven:
И снова 172кб бинарник рисует и поет всю эту красоту.
Kulibinson
05.09.2024 11:31Кстати, для желающих пощупать демосцену за пиксели и эти ваши чиптюны есть бодрый движок на луях https://github.com/hugeping/rein родом из наших палестин.
checkpoint
05.09.2024 11:31Недавно узнал, что есть целая виртуальная демосценерская консоль TIC-80, её тоже на Луях...
nuclight
05.09.2024 11:31+1FreeBSD - мягко говоря не самая подходящая система для занятия оптимизированной графикой
А что с ней не так? Иксы и иксы, как и везде. Эдак можно сказать, что любой юникс - не самая подходящая среда, но помнится, первую "Матрицу" рендерили именно на кластере FreeBSD-машин.
alex0x08 Автор
05.09.2024 11:31+3первую "Матрицу" рендерили именно на кластере FreeBSD-машин.
Вот это поворот, чего не знал того не знал:
Manex Visual Effects used 32 Dell Precision 410 Dual P-II/450 Processor systems running FreeBSD as the core CG Render Farm. Charles Henrich, the senior systems administrator at Manex, says, "We came to a point in the production where we realized we just did not have enough computing power on our existing SGI infrastructure to get through the 3-D intensive sequences. It was at that point we decided on going with a FreeBSD based solution, due to the ability to get the hardware quickly as well as the reliability and ease of administration that FreeBSD provides us. Working with Dell, we purchased 32 of these systems on a Wednesday, and had them rendering in production by Saturday afternoon. It was truly an amazing effort on everyone’s part, and I don’t believe it would’ve been possible had we chosen to go with any other Operating System solution."
Но если откинуть все фанатские эмоции и обратить внимание на год, то станет понятно что речь все же про CPU и раскидывание нагрузки по отрисовке между мощными рабочими станциями. Это не совсем тоже самое что и программная отрисовка на экране.
checkpoint
05.09.2024 11:31Большое спасибо за статью. Всё попробовал, покомпилял и посмотрел на FreeBSD 13.3-RELEASE на ноутбуке Lenovo. Вставлю свои пять копеек.
Ghosts of Mars собралась и чудесно работает, графика отпадная. Использует встроенную видюху (amdgpu).
Yog-Sothoth при работе выдает в stdout текст шейдеров на языке GLSL и статистику их компиляции - весьма интересно.
SDL отпадная ультра-кроссплатформенная и весьма минималистичная библиотека для всякой графики и звука. Но для приложений лучше использовать более современный её вариант - SDL2. Она поддерживает Vulkan и прочие фишки современных акселераторов, при этом остается такой же минималистичной в плане зависимостей. Правда из неё убраны некоторые совсем уж архаичные платформы (Atari MiNT, AmigaOS, Windows 95, BeOS, MacOS9).
БК как и Atari - компы моего детства. Рад, что кто-то продолжает для них кодить. Последнее что я видел для БК это Good Apple.
-
В 90-х я тоже немного баловался с написанием демок и занимался code bumping-ом (оптимизацией кода на асме с целью уталкивания в заданные размеры). Мой рекорд был 97 байт .COM файл отрисовывающий множество Жюлиа. Но dirojed.com просто убил меня. Убил и сьел! 32 байта это как ? При этом оно еще умудряется опрашивать клавиатуру (in al,60h). Вот все 15 ассемблерных команд этого шедевра:
C:\>2ASM.EXE DIROJED.COM
PS: Всем нашим маленьким коллективом этим августом побывали на Chaos Constructions 2024 в Питере - демок и аппаратуры было мало, организация была слабой, но всё равно мы вернулись довольные. :-)
alex0x08 Автор
05.09.2024 11:31Ghosts of Mars собралась и чудесно работает, графика отпадная. Использует встроенную видюху (amdgpu).
Надо было скриншоты выкладывать, а лучше - видео ) На дискретной графике будет разумеется сильно быстрее и красивей все бегать.
Правда из неё убраны некоторые совсем уж архаичные платформы (Atari MiNT, AmigaOS, Windows 95, BeOS, MacOS9).
Не эксперт по Амиге, видел ее лишь в эмуляторе, но нашел вот такое:
https://github.com/AmigaPorts/SDL
Но в любом случае насколько успел изучить вопрос - подразумевается кросс-компиляция в случае Амиги, не сборка на ней самой.
Chaos Constructions 2024 в Питере
В 2023м же отменяли? Думал все - с концами. Но рад что кто-то еще занимается )
checkpoint
05.09.2024 11:31У меня в ноуте две видюхи с ускорителем: встроенная в Ryzen5 (amdgpu) и дискретная Nvidia RTX 3050. Демка ghosts_of_mars запускается на обеих картах, качество графики и динамика одинаковая. Возможно, что на Nvidia число FPS будет поболее, но на глаз это не оценить.
Демка ghosts_of_mars на FreeBSD 13.3 и встроенной amdgpu
Демка ghosts_of_mars на FreeBSD 13.3 и Nvidia RTX 3050
alex0x08 Автор
05.09.2024 11:31Но dirojed.com просто убил меня. Убил и сьел! 32 байта это как
Это все магия ;)
Сам dirojed не нашел, зато есть вот такой интересный порт другой демо этого автора на WebGL.
С характерной строчкой из описания:
It is not an entirely accurate translation of the algorithm, but it is fairly close. It is also nowhere near 256 bytes - it is closer to 4k, not counting the parts that aren't related to the effect as such.
domix32
05.09.2024 11:31А как оно отрисовку делает? 013h?
checkpoint
05.09.2024 11:31+1Из кода видно, что демка устанавливает режим 13h (VGA 320x240) через Int 10h и потом пишет в область памяти на которую указывает пара DS:BX, при этом предварительно инициализирует её командой lds bx,[bx]. Я немного потрассировал прогу в отладчике AFD.EXE. Пара DS:BX до инициализации ссылается на нулевую ячейку сегмента кода, после загрузки DS:BX становится равным 9FFF:20CD. Учитывая что в реальном режиме у нас всего 20-ти битные адреса, то получаем адрес 0xA20BD который случайным образом попадает в область видеопамяти, она начинается с 0xA0000 (или A000:0000). Далее идет приращение BX по непонятному алгоритму.
checkpoint
05.09.2024 11:31Кстати, финские демки у меня тоже собрались в бинарь обьемом более мегабайта, хотя они заявлены как 4k intro. Не представляю каким способом такой бинарь можно ужать до 4К. strip уже сделан, отладочной инфы в эльфе нет.
alex0x08 Автор
05.09.2024 11:31Не представляю каким способом такой бинарь можно ужать до 4К.
Надо внимательно смотреть скрипты сборки в каждой демке, хотя авторы не всегда выкладывают часть которая отвечает за минимизацию и подготовку.
Может быть вот такое:
SFLAGS = -K .bss -K .text -K .data -R .comment -R .note -R .note.ABI-tag -R .fini -R .gnu.version #-R .data
Те тут вырезается далеко не только отладочная информация.
checkpoint
05.09.2024 11:31Я пробовал натравить strip с этими параметрами на ghost_of_mars, но это не дало результата - размер файла остался прежним и составил 1285472 байта. Я загляну в него readelf-ом и увидел, что размеры секций .text и .rodata составляют 943762 и 129328 байт соответвенно. Эти секции, как Вы понимаете, удалить из эльфа не выйдет. Единственное что с ними можно сделать это сжать каким нибудь алгоритмом, но это должен быть суперэффективнй алгорим, чтобы из 1073090 байт получить исполняемый файл размером не более 4096 байт. Короче, вопрос "почему демки из компо 4K into имеют размер бинарника более мегабайта" для меня остался нераскрытым.
PS: Утилита компрессии исполняемых файлов upx под Фрю есть в пакеджах, но с фрюшными эльфами работать отказывается, пишет UnknownExecutableFormatException.
alex0x08 Автор
05.09.2024 11:31почему демки из компо 4K into имеют размер бинарника более мегабайта
Это же сцена а не обычный билд )
Может быть все что угодно включая ручную правку HEX-редактором.
checkpoint
05.09.2024 11:31Короче, вся магия находится в dnload.py который вызывается из скрипта ./release.sh.
dnload.py - Minimal binary generator for *nix operating systems.
Прямо бальзам на душу старого фрюховода. ;)
checkpoint
05.09.2024 11:31После установки dnload.py и запуска ./release.sh получил следующие бинари:
Эти финские парни отморожены на обе головы. Побольше бы таких. :)
checkpoint
05.09.2024 11:31+1Вот, состряпал на скорую руку по мотивам одного из видео. Только для FreeBSD:
Генерация звука для демки
% cat test1.c #include <stdio.h> #include <stdlib.h> char *dsp_dev = "/dev/dsp1.0"; int main(int argc, char *argv[]) { int samples = 1000000; if(argv[1]) samples = atoi(argv[1]); FILE *dsp = fopen(dsp_dev, "a+b"); if(!dsp) { perror("fopen"); return -1; } for(int t=0;samples;t++,--samples) fputc((t&t%255)-(t*3&t>>13&t>>6), dsp); return 0; } % cc -o test1 test1.c % ./test1
checkpoint
05.09.2024 11:31Добавил еще пару вариантов и выложил на Github: https://github.com/pointcheck/generated_music
checkpoint
05.09.2024 11:31Появилась видеозаметка про прошедший недавно в Питере Chaos Constructions 2024.
muxa_ru
Что, в данном случае, имеется в виду под "3D модель" ?
alex0x08 Автор
Набор координат треугольников, загружаемый из файла. Типа такого.
checkpoint
Всё таки это 3D модель + программа шейдер. :)
alex0x08 Автор
Если вы не видите разницы между массивом чисел и вычисляемой во время работы функцией, которая этот массив формирует, то я видимо не смогу вам ее объяснить.
checkpoint
Это не совсем так. Модель как правило уже рассчитана заранее и захардкожена, а функцией на неё наращивается мясо и производятся всяческие трансформации над ней. Можно конечно исходную модель рассматривать как комплексный набор исходных параметров функции, если Вы настаиваете. :)
alex0x08 Автор
Посмотрите внимательно видео автора, ради этого я и выложил - чтобы подобных вопросов не было. Нет там никаких:
domix32
3д модель обычно содержит информацию о геометрии объекта, которой в данном случае нет - только набор параметров функций, чтобы сгенерировать её. Собственно про это и говорит автор поста - нет модели, только шейдеры.
alex0x08 Автор
Эм нет, в оригинале все еще круче: шейдеров тоже нет ))
Шейдеры есть в портированной на WebGL версии, оригинал создает статичную картинку девушки в худи одними только алгоритмами.
В оригинальной демо нет никаких внешних библиотек кроме одной, отвечающей за формат изображения.
Настолько все круто.
domix32
Шейдер это не внешняя библиотека, а минипрограмма предназначенная для исполнения на GPU - фактически небольшой набор инструкций и вызовов функций. Не знаю как работает оригинал, но вызов алгоритмов по сути и есть тот самый шейдинг. Поэтому не важно, отправляет ли он эти инструкции куда-то на GPU или же исполняет их тут же на процессоре и выплёвывает PNG.
muxa_ru
Почитал обсуждение.
Похоже, что обычная ситуация нишевой терминологии, когда в одном случае термин "математический расчёт" брендировался красивым термином, а в другом - самим термином "математический расчёт". :)
checkpoint
Ну это как в известном фильме:
Мы все друг друга поняли, просто захотелось почесать языками. :)
Kulibinson
Меш. Там SDF-функции и булевы операции вместо меша. И реймаршер, который это рисует.