2014-02-09 1 views
3

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

+1

Да, у вас все в порядке. Секретный ингредиент - это продвинутые компрессоры '.exe', а также трюки, которые они собирают, чтобы сохранить размер файла. Многие (все?) Из них привязаны к определенному компилятору (в основном MSVC). Здесь нет шаблонов. – user1095108

+0

Это все, на что вы ссылаетесь, вы можете использовать C/C++ просто отлично для этой работы. –

+0

Если вы не используете какие-либо функции библиотеки, вы также можете получить довольно небольшие размеры файлов с помощью компилятора. Однако, как только вы свяжетесь в своем первом 'printf', вы поджариваетесь. :) Ocurse, получение ниже определенного минимума требует сборки. – Devolus

ответ

2

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

+1

Ну, у вас это не так. В демонстрационных версиях Windows используются «OpenGL» или «DirectX». – user1095108

+0

@ user1095108: Некоторые делают, некоторые нет. – PlasmaHH

+4

@ user1095108 Но код OpenGl/DirectX находится в DLL вместо библиотеки, которая должна быть связана (и, следовательно, будет добавлена ​​к размеру файла) –

7

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

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

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

+0

_ «Они динамически связывают только необходимый абсолютный минимум». _: Я думаю, вы имели в виду _ "статически «_. –

+0

@JulienGuertault: Нет, они вообще не связывают ничего статического, это было бы запрещено. Они связывают динамически, но абсолютный минимум. IATs/thunks занимают пространство, поэтому вы хотите иметь как можно меньше, даже если это означает, что программа не соответствует стандартам (пока она «работает» в том смысле, что она не разбивается и не создает изображение/анимацию, это Это хорошо). – Damon

+0

У вас действительно нет выбора: если вы хотите создать программу win32, вам нужно статически связать несколько библиотек, если вы тоже хотите использовать OpenGL.Трюк состоит в том, чтобы связать как можно меньше (переписывая то, что вам нужно, например, CRT), и используйте как можно меньше связанных с ними, а затем агрессивно удаляйте код, который не используется. Однако некоторые из этих библиотек выполняют динамические DLL-системы с динамической компоновкой за сценой, но это в той мере, в какой это допускается правилами конкуренции. –

1

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

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

1

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

3

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

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

  • Compile без стандартной библиотеки. Это самое главное.
  • Сжатие вашего двоичного кода (kkrunchy для 64-разрядных интронов в Windows, Crinkler для вложений 4k на Windows).

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

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

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

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

  • Вы, вероятно, использовать много поплавков. Попробуйте truncate the mantissa of your floats (он может сэкономить много kB).
  • Отключить функцию inlining (она меня спасла 2kB).
  • Попробуйте соглашение о вызове fastcall (он спас меня 0.7kB).
  • Отключить поддержку исключений. Вы им не нужны.
  • Если вы используете классы, избегайте наследования.
  • Будьте осторожны, если вы используете шаблоны.

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

+0

Сообщение в блоге Я написал (а) по теме: http://www.ctrl-alt-test.fr/?p=494 – Laurent