Pull to refresh

Comments 32

Я хотел сделать скринсейвер, но я графикой никогда не занимался. И у меня был пунктик - нужна поддержка многих мониторов сразу. Кое как вник в Vulkan, шейдеры, вся фигня. Нормально заработало на одном экране. Но при отображении сразу на несколько экранов у меня полезли ошибки, которые никто на форумах объяснить не мог, и тексты в логах, при гуглении которых находятся только исходники той библиотеки ,что их пишет.

В итоге появилось ощущение, что мне сейчас нужно потратить год на изучение теории этого всего, или идти другим путём.

Теперь мой скринсейвер открывает Internet Explorer на весь экран без элементов интерфейса, в нём грузится страница, а на ней моя анимация на TypeScript. Всё плавно и сочно, никаких подтормаживаний. Стартует секунды две, в основном из-за антивируса. Система сообщает, что на два экрана готова рисовать до 5 000 FPS, но конечно она VSync-нута. EXEшник весит 5 Мб, жор памяти ОС показывает 3 Мб.

Так что может ну их нафиг уже, эти примитивы...

Помню была такая штука как «Демо сцены» - маааленькие экзешники, которые выводили на экран всякие потрясающие штуки

Есть челленджы по процедурной графике,.где в пару кб шедевры впихивают

И .kkrieger занимает 96 КБ на диске...

Ещё была sumotory - она поменьше, а в ней физика и множественные (настраиваемо) источники света.

Так они и сейчас есть.

Видел такое, даже статья на Хабре есть такая: https://habr.com/ru/articles/713550/. OCEAN32 - вообще крышесносная вещь, правда это .COM фаил а не .EXE, но всеравно круто

А как там нынче с .com? Во времена доса когда не нужно было больше 64кб оперативки компилировл в .com. размер получался смехотворный.

org 100; ret;

Работает, но нельзя привязывать библиотеки

Разве работает? Я думал с win10 выпилили.

COM-файлы запускались через виртуальную машину DOS, которую убрали из 64-битных систем. Но никто не мешает использовать Dosbox.

Да, кстати, я этим тоже пользовался, вещь полезная. Особенно хорошо она мне помогала, когда я еще не знал про то, как уменьшать размер секций. Есть правда одна проблема у UPX, антивирусы часто бракуют такие запакованные файлы

Пакеров на самом деле много есть. Есть с обфускацией.

Если и дальше бороться за истинный размер файла, то далее будет препарирование непосредственно самого бинарника, т.к можно выкинуть DOS-stub, поместить библиотеку импорта и данных в одну секцию рядом, и также оставить alignment маленьким, и в итоге получить что-то абсолютно крошечное.

P.S. Ради спортивного интереса, на основе предоставленного минимального файла, используя бинарный редактор, ловкость рук и со скрипом зубов мне удалось сделать минимально работающий вариант в 376 байт. Запускал соответственно на Win10 x64.

P.P.S. Я пробовал установить поля FileAlignment и SectionAlignment отличные от тех что рисует компилятор (обычно это 0x200 и 0x1000) на другие произвольные значения, но все они давали нерабочий х32 бинарник, что впрочем следует из их документации, так что допустимое значений 0x8 в PE32+ стала в какой-то степени неожиданностью.

Это реально круто. Я глянул файл и в самом деле не нашел привычного: "This program cannot be run in DOS mode". Хорошо было бы самому по подробнее разобраться в документации PE файлов, и написать скрипт по вырезанию всего ненужного...

Я относительно недавно баловался с минимизацией размера исполняемых файлов, вот результаты. Простейший 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.
И при этом в этих играх — удивительное внимание к деталям.

Батник получился бы в разы меньше. Особенно сплевывающий в консоль.

Давайте перечитаем программу от начала и до конца и найдем нашего следуещего врага. printf — вот он!

В этот момент ожидал, что автор вспомнит про puts().

В своих первых попытках уменьшить .EXE, я и использовал puts, но здесь я не стал рассказывать об этой функции из-за того что она требует инициализации stdout, а я её вырезал в одном из последующих шагов

А вот WriteConsoleA потребует AllocConsole, GetStdHandle или еще чего по хуже, так что о размере меньше 800Б можно было бы забыть

Ну шеллкодам в 100- байт ничего не мешает и побольше функций системы импортировать.

Sign up to leave a comment.

Articles