Решил вспомнить счастливое детство и полазить по сайтам демосценеров — с удивлением обнаружил, что многие выкладывают релизы под.. FreeBSD.

FreeBSD — мягко говоря не самая подходящая система для занятия оптимизированной графикой, поэтому наличие такого количества демо целенаправленно создаваемых под эту систему озадачило.

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

Ghosts of Mars by Faemiyah, на моей домашней FreeBSD.
Ghosts of Mars by Faemiyah, на моей домашней 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

Вот так это выглядит в живую:

Dosbox это такой эмулятор, скачать версию для Windows можно вот отсюда.
Dosbox это такой эмулятор, скачать версию для Windows можно вот отсюда.

Hoody by Rgba

4кб приложение генерирует такую красоту:

Это не статичная картинка и не 3D модель — это алгоритмы, чистая математика, тот самый «матан» который вы так не любили все годы в ВУЗе.

Вот тут алгоритм из демо повторен с помощью WebGL:

Ниже детальный пошаговый разбор алгоритма, от самого автора:

Тестовое окружение

Тестовая машина — мой боевой некроноутбук Lenovo T440:

Встроенная графика Intel, 8Гб памяти и FreeBSD 13.1 14.0 14.1
Встроенная графика Intel, 8Гб памяти и FreeBSD 13.1 14.0 14.1

Загружен 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:

Персональный компьютер БК 0011М (1980-е годы)
Персональный компьютер БК 0011М (1980-е годы)

Так что дух хардкора еще очень даже жив.

P.S.

Это немного отцезурированная и доработанная версия статьи, оригинал которой доступен в нашем блоге.

0x08 Software

Мы небольшая команда ветеранов ИТ‑индустрии, создаем и дорабатываем самое разнообразное программное обеспечение, наш софт автоматизирует бизнес‑процессы на трех континентах, в самых разных отраслях и условиях.

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

Комментарии (23)


  1. muxa_ru
    05.09.2024 11:31

    не 3D модель — это алгоритмы

    Что, в данном случае, имеется в виду под "3D модель" ?


    1. alex0x08 Автор
      05.09.2024 11:31
      +1

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


      1. checkpoint
        05.09.2024 11:31

        Всё таки это 3D модель + программа шейдер. :)


        1. alex0x08 Автор
          05.09.2024 11:31

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


          1. checkpoint
            05.09.2024 11:31

            Это не совсем так. Модель как правило уже рассчитана заранее и захардкожена, а функцией на неё наращивается мясо и производятся всяческие трансформации над ней. Можно конечно исходную модель рассматривать как комплексный набор исходных параметров функции, если Вы настаиваете. :)


            1. alex0x08 Автор
              05.09.2024 11:31

              Посмотрите внимательно видео автора, ради этого я и выложил - чтобы подобных вопросов не было. Нет там никаких:

              Модель как правило уже рассчитана заранее и захардкожена


    1. Kulibinson
      05.09.2024 11:31
      +2

      Меш. Там SDF-функции и булевы операции вместо меша. И реймаршер, который это рисует.


  1. UranusExplorer
    05.09.2024 11:31
    +1

    Кстати, упомянутые в списке 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)


  1. UranusExplorer
    05.09.2024 11:31

    heaven seven by Exceed

    У вас по ссылке на ютуб сломанное видео (люди в комментариях жалуются, и у меня тоже криво отображается), вот тут есть другой ролик: Exceed - Heaven Seven (Heaven 7) | pc 64k | raytracing (FullHD 1080p HQ demoscene) (youtube.com)

    И кстати, в оригинале под Винду она была 64к. Это при портировании под FreeBSD так бинарь раздуло? :)


    1. vesper-bot
      05.09.2024 11:31

      Скорее всего просто не пожатый (upx или чем там под винду жмут ехешники).


    1. alex0x08 Автор
      05.09.2024 11:31

      Спасибо поправил линк на другую версию. Но думаю что это все же косяк Ютуба, поскольку в прошлом году все нормально было.


    1. alex0x08 Автор
      05.09.2024 11:31

      , в оригинале под Винду она была 64к. Это при портировании под FreeBSD так бинарь раздуло? :)

      Вот ссылка на вендовую сборку, архив 26мб. Exe-файл действительно меньше мегабайта, но ресурсы не упакованы, как и внешние библиотеки.


      1. UranusExplorer
        05.09.2024 11:31

        Не, речь про heaven seven, а не про lifeforce


        1. alex0x08 Автор
          05.09.2024 11:31

          Тогда все ок, поскольку текст выше про 26 Мб как раз про Lifeforce, а вот про Heaven Seven:

          И снова 172кб бинарник рисует и поет всю эту красоту.


  1. Kulibinson
    05.09.2024 11:31

    Кстати, для желающих пощупать демосцену за пиксели и эти ваши чиптюны есть бодрый движок на луях https://github.com/hugeping/rein родом из наших палестин.


    1. checkpoint
      05.09.2024 11:31

      Недавно узнал, что есть целая виртуальная демосценерская консоль TIC-80, её тоже на Луях...


  1. nuclight
    05.09.2024 11:31
    +1

    FreeBSD - мягко говоря не самая подходящая система для занятия оптимизированной графикой

    А что с ней не так? Иксы и иксы, как и везде. Эдак можно сказать, что любой юникс - не самая подходящая среда, но помнится, первую "Матрицу" рендерили именно на кластере FreeBSD-машин.


    1. alex0x08 Автор
      05.09.2024 11:31
      +1

       первую "Матрицу" рендерили именно на кластере 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 и раскидывание нагрузки по отрисовке между мощными рабочими станциями. Это не совсем тоже самое что и программная отрисовка на экране.


  1. checkpoint
    05.09.2024 11:31

    Большое спасибо за статью. Всё попробовал, покомпилял и посмотрел на FreeBSD 13.3-RELEASE на ноутбуке Lenovo. Вставлю свои пять копеек.

    1. Ghosts of Mars собралась и чудесно работает, графика отпадная. Использует встроенную видюху (amdgpu).

    2. Yog-Sothoth при работе выдает в stdout текст шейдеров на языке GLSL и статистику их компиляции - весьма интересно.

    3. SDL отпадная ультра-кроссплатформенная и весьма минималистичная библиотека для всякой графики и звука. Но для приложений лучше использовать более современный её вариант - SDL2. Она поддерживает Vulkan и прочие фишки современных акселераторов, при этом остается такой же минималистичной в плане зависимостей. Правда из неё убраны некоторые совсем уж архаичные платформы (Atari MiNT, AmigaOS, Windows 95, BeOS, MacOS9).

    4. БК как и Atari - компы моего детства. Рад, что кто-то продолжает для них кодить. Последнее что я видел для БК это Good Apple.

    5. В 90-х я тоже немного баловался с написанием демок и занимался code bumping-ом (оптимизацией кода на асме с целью уталкивания в заданные размеры). Мой рекорд был 97 байт .COM файл отрисовывающий множество Жюлиа. Но dirojed.com просто убил меня. Убил и сьел! 32 байта это как ? При этом оно еще умудряется опрашивать клавиатуру (in al,60h). Вот все 15 ассемблерных команд этого шедевра:

    C:\>2ASM.EXE DIROJED.COM

    PS: Всем нашим маленьким коллективом этим августом побывали на Chaos Constructions 2024 в Питере - демок и аппаратуры было мало, организация была слабой, но всё равно мы вернулись довольные. :-)


    1. alex0x08 Автор
      05.09.2024 11:31

      1. Ghosts of Mars собралась и чудесно работает, графика отпадная. Использует встроенную видюху (amdgpu).

      Надо было скриншоты выкладывать, а лучше - видео ) На дискретной графике будет разумеется сильно быстрее и красивей все бегать.

      Правда из неё убраны некоторые совсем уж архаичные платформы (Atari MiNT, AmigaOS, Windows 95, BeOS, MacOS9).

      Не эксперт по Амиге, видел ее лишь в эмуляторе, но нашел вот такое:

      https://github.com/AmigaPorts/SDL

      Но в любом случае насколько успел изучить вопрос - подразумевается кросс-компиляция в случае Амиги, не сборка на ней самой.

      Chaos Constructions 2024 в Питере

      В 2023м же отменяли? Думал все - с концами. Но рад что кто-то еще занимается ) 


    1. 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.


  1. checkpoint
    05.09.2024 11:31

    Кстати, финские демки у меня тоже собрались в бинарь обьемом более мегабайта, хотя они заявлены как 4k intro. Не представляю каким способом такой бинарь можно ужать до 4К. strip уже сделан, отладочной инфы в эльфе нет.


    1. 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

      Те тут вырезается далеко не только отладочная информация.