Comments 32
Я хотел сделать скринсейвер, но я графикой никогда не занимался. И у меня был пунктик - нужна поддержка многих мониторов сразу. Кое как вник в Vulkan, шейдеры, вся фигня. Нормально заработало на одном экране. Но при отображении сразу на несколько экранов у меня полезли ошибки, которые никто на форумах объяснить не мог, и тексты в логах, при гуглении которых находятся только исходники той библиотеки ,что их пишет.
В итоге появилось ощущение, что мне сейчас нужно потратить год на изучение теории этого всего, или идти другим путём.
Теперь мой скринсейвер открывает Internet Explorer на весь экран без элементов интерфейса, в нём грузится страница, а на ней моя анимация на TypeScript. Всё плавно и сочно, никаких подтормаживаний. Стартует секунды две, в основном из-за антивируса. Система сообщает, что на два экрана готова рисовать до 5 000 FPS, но конечно она VSync-нута. EXEшник весит 5 Мб, жор памяти ОС показывает 3 Мб.
Так что может ну их нафиг уже, эти примитивы...
Помню была такая штука как «Демо сцены» - маааленькие экзешники, которые выводили на экран всякие потрясающие штуки
Есть челленджы по процедурной графике,.где в пару кб шедевры впихивают
И .kkrieger занимает 96 КБ на диске...
Так они и сейчас есть.
Помню была такая штука как «Демо сцены»
У нас тут целых хаб на эту тему: https://habr.com/ru/hubs/demoscene/articles/
Видел такое, даже статья на Хабре есть такая: https://habr.com/ru/articles/713550/. OCEAN32 - вообще крышесносная вещь, правда это .COM фаил а не .EXE, но всеравно круто
А как там нынче с .com? Во времена доса когда не нужно было больше 64кб оперативки компилировл в .com. размер получался смехотворный.
Где то была статья, для минимального exe брать VC5 (Visual Studio 97)
а еще есть UPX
Если и дальше бороться за истинный размер файла, то далее будет препарирование непосредственно самого бинарника, т.к можно выкинуть DOS-stub, поместить библиотеку импорта и данных в одну секцию рядом, и также оставить alignment маленьким, и в итоге получить что-то абсолютно крошечное.
P.S. Ради спортивного интереса, на основе предоставленного минимального файла, используя бинарный редактор, ловкость рук и со скрипом зубов мне удалось сделать минимально работающий вариант в 376 байт. Запускал соответственно на Win10 x64.
P.P.S. Я пробовал установить поля FileAlignment и SectionAlignment отличные от тех что рисует компилятор (обычно это 0x200 и 0x1000) на другие произвольные значения, но все они давали нерабочий х32 бинарник, что впрочем следует из их документации, так что допустимое значений 0x8 в PE32+ стала в какой-то степени неожиданностью.
Я относительно недавно баловался с минимизацией размера исполняемых файлов, вот результаты. Простейший Hello World в 32-битном режиме умещается в 624 байта. Но это с использованием MSVC, а не MinGW. А в 4 килобайта можно уже какую-нибудь графическую демку или игру вроде Тетриса уместить.
Некоторые простейшие приложения требуют под 200-300 МБ,
можно подумать там .exe такой большой, там же не просто electron а еще и либы, на все случаи жизни
а вот в играх еще модели всяккие, текстуры, видео и музыка, их наоборот добавляют чтобы не напоминало тусовку мыльных пикселей
А Turbo Pascal сразу без оптимизаций делал минимальный exe в 16Кб.
#include <windows.h>
void main(){
MessageBoxA(0, "Hello, world!", "Hello, world!", 0);
}
tcc main.c -luser32
main.exe: 3584 bytes
Дельфи 3 ЕМНИП около 25 КБ без оптимизации. И 2,4 КБ с нею.
Ещё можно юзать командный процессор для прямого программирования в машинных кодах:
copy con reboot.com & [Alt+205, Alt+25] & ^Z
И всё же по соотношению функциональности к цене почти ничто не может быть лучше
Бесконечно выгодной программы.
Прикол обычно в том, что размер кода в играх - меньшая из проблем, т.к. основной объём занимают звуки и текстуры/материалы к моделям, когда на одну модель приходитсся несколько текстур с разрешением 2k+ - карты высот, теней/освещения, маски прозрачности и прочее в том же духе. Ну и звуки соотвественно на озвучку всех тех сотен часов диалогов, кои присутвуют в том же RDR2, это не считая тысяч SFX, включая озвучку взаимодействия разных же материалов.
Я считаю, здесь нужно упомянуть Animal Well, который занимает меньше 40 Мб при наличии весьма красивой графики. А также консольные вещи вроде NetHack, некоторые модификации которого, к моему большому удивлению, весят больше Animal Well.
И при этом в этих играх — удивительное внимание к деталям.
Батник получился бы в разы меньше. Особенно сплевывающий в консоль.
А я про WriteConsoleA
В своих первых попытках уменьшить .EXE, я и использовал puts, но здесь я не стал рассказывать об этой функции из-за того что она требует инициализации stdout, а я её вырезал в одном из последующих шагов
А вот WriteConsoleA потребует AllocConsole, GetStdHandle или еще чего по хуже, так что о размере меньше 800Б можно было бы забыть
Уничтожение EXE: 640 Байт для программы на C