Как демомейкеры достигают сверхмалых размеров файлов?

Когда я смотрю демосценовые видео на YouTube, автор часто хвастается, что их размеры файлов составляют 64 КБ или меньше, а некоторые — всего 4 КБ. Когда я компилирую даже очень простую программу на C ++, исполняемый файл всегда имеет размер не менее 90 КБ или около того. Эти демо написаны полностью в сборке? Насколько я понимаю, демомейкеры также использовали c / c ++.

3

Решение

Эти демонстрационные ролики не используют стандартную библиотеку (не C ++ и даже не стандартную библиотеку C) и не связываются со стандартными библиотеками (чтобы избежать импорта размеров таблиц). Они динамически связывают только необходимый абсолютный минимум.
«Основная функция» демонстрации обычно совпадает с точкой входа (в отличие от обычной программы, где точкой входа является функция инициализации CRT, которая выполняет некоторые специфичные для ОС настройки, инициализирует глобальные переменные, запускает конструкторы и, в конце концов, вызывает main).

Обычно демонстрационные исполняемые файлы не соответствуют спецификациям (за исключением минимальных размеров и выравниваний разделов) исполняемого формата и сжимаются с помощью exe-упаковщика. Технически, это «сломанные» программы, но они настолько «сломаны», что все еще успешно работают.

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

7

Другие решения

Я один из кодеров Мастерская Феликса а также погружение (64 тыс. Вступлений по Ctrl-Alt-Test). В настоящее время большинство 64-тысячных вступлений используют C ++ (исключение: Logicoma использует Rust). Сборка может иметь смысл для вступлений 4k (хотя большинство из них на самом деле используют C ++), но не для вступлений 64k.

Вот две самые важные вещи:

  • Компилировать без стандартной библиотеки. Это самая важная вещь, которую нужно сделать.
  • Сожмите ваш бинарный файл (kkrunchy для 64 тыс. вступлений в Windows, Crinkler для 4k заставок на винде).

Теперь вы можете написать тонну кода перед заполнением 64 КБ. Как их использовать? Процедурное поколение.

  • Для музыки ноты сжимаются. Инструменты генерируются с мягким синтезатором. Популярным вариантом, хотя и немного устаревшим, является использование v2 от Farbrausch.
  • Если вам нужны текстуры, генерируйте их.
  • Если вам нужны 3d модели, сгенерируйте их.
  • Анимации и эффекты являются процедурными.
  • Для камеры сохраните некоторые ключевые позиции и интерполируйте.

Хотите узнать больше о процедурной генерации и других методах? Проверьте Статьи IQ.

Если вы хотите дополнительно оптимизировать свой код, вот несколько дополнительных приемов:

  • Вы, вероятно, используете много поплавков. Пробовать обрезать мантиссу ваших поплавков (это может сэкономить много КБ).
  • Отключить функцию встраивания (это сэкономило мне 2 кБ).
  • Попробуйте соглашение о вызовах fastcall (это сэкономило мне 0,7 КБ).
  • Отключить поддержку исключений. Вы не нуждаетесь в них.
  • Если вы используете классы, избегайте наследования.
  • Будьте осторожны, если вы используете шаблоны.

В типичном введении 4k код C ++ используется для музыки и инициализации. Графика выполнена в шейдере.

4

Эти сверхмалые программы, как правило, не зависят от каких-либо библиотек или сред, что типично для традиционной разработки приложений. Эти программы обычно обращаются к графике / вводу и т. Д. Напрямую.

2

Я пока не могу комментировать, потому что у меня нет 50 точек повторения, поэтому я отвечаю.

Одним из способов создания меньшей программы является использование более старого компилятора, такого как Microsoft Visual C / C ++ 4.0, который создает файл .exe меньшего размера, чем, скажем, Microsoft Visual Studio 2005.

1

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

1
По вопросам рекламы [email protected]