Комментарии 40
Я хотел сделать скринсейвер, но я графикой никогда не занимался. И у меня был пунктик - нужна поддержка многих мониторов сразу. Кое как вник в 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
И всё же по соотношению функциональности к цене почти ничто не может быть лучше
Бесконечно выгодной программы.
и это ужасно (хотя на самом деле пустая программа в TP 7 дает 1.5 кб ЕХЕ).
Прикол обычно в том, что размер кода в играх - меньшая из проблем, т.к. основной объём занимают звуки и текстуры/материалы к моделям, когда на одну модель приходитсся несколько текстур с разрешением 2k+ - карты высот, теней/освещения, маски прозрачности и прочее в том же духе. Ну и звуки соотвественно на озвучку всех тех сотен часов диалогов, кои присутвуют в том же RDR2, это не считая тысяч SFX, включая озвучку взаимодействия разных же материалов.
Я считаю, здесь нужно упомянуть Animal Well, который занимает меньше 40 Мб при наличии весьма красивой графики. А также консольные вещи вроде NetHack, некоторые модификации которого, к моему большому удивлению, весят больше Animal Well.
И при этом в этих играх — удивительное внимание к деталям.
Батник получился бы в разы меньше. Особенно сплевывающий в консоль.
А я про WriteConsoleA
В своих первых попытках уменьшить .EXE, я и использовал puts, но здесь я не стал рассказывать об этой функции из-за того что она требует инициализации stdout, а я её вырезал в одном из последующих шагов
А вот WriteConsoleA потребует AllocConsole, GetStdHandle или еще чего по хуже, так что о размере меньше 800Б можно было бы забыть
Я не очень понял, если честно, каким боком и зачем автор сюда приплёл RDR2, но ладно. Ещё бы очень хотелось бы увидеть аналог данного эксперимента под Linux
На ZX Spectrum вообще пару десятков байт.
для своих нужд такую утилиту писал, exe-файл после компиляции ровно 1024 байта. дальше уменьшать dos-заголовок (tiny356.dos) на современных windows не получается.
;Return some keyboard key statuses as bit flags
;and returns them as a program exit code.
;
;Bit Value Description
;--- ----- ------------------------
;15 32768 Insert is held down
;14 16384 CapsLock is held down
;13 8192 NumLock is held down
;12 4096 ScrollLock is held down
;11 2048 Pause is toggled on
;10 1024 PrintScreen is held down
; 9 512 Left Alt is held down
; 8 256 Left Ctrl is held down
; 7 128 Insert is toggled on
; 6 64 CapsLock is toggled on
; 5 32 NumLock is toggled on
; 4 16 ScrollLock is toggled on
; 3 8 Any Alt is held down
; 2 4 Any Ctrl is held down
; 1 2 Left Shift is held down
; 0 1 Right Shift is held down
; 2024 MOD:
; .DATA -> uninitialized .DATA?
; compile with MASM 6.14 and *.lib from Windows 95 Chicago Beta 2 SDK 4.0.331:
; Linker Version 5.12.8078 from Windows 98 SE Driver Development Kit:
; C:\MASM614\BIN\ML.EXE /c /coff kbstatus.asm
; c:\MASM614\link1998\LINK32.EXE /nologo /STUB:tiny356.dos /MERGE:.rdata=.text -subsystem:WINDOWS,4.00 -entry:start -out:kbstatus.exe kbstatus.obj c:\MASM614\LIB95SDK\kernel32.lib c:\MASM614\LIB95SDK\USER32.LIB
; tiny356.dos DOS STUB from http://www.phreedom.org/research/tinype/
; 00000000: 4D 5A 00 00-00 00 00 00-00 00 00 00-00 00 00 00
; 00000010: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
; 00000020: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 00 00
; 00000030: 00 00 00 00-00 00 00 00-00 00 00 00-40 00 00 00
.386
.MODEL flat, stdcall
GetKeyboardState PROTO NEAR32 stdcall, lpKeyState:DWORD
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
.STACK 4096
.DATA?
keyState db 256 dup(?)
.CODE
start:
lea esi, keyState
INVOKE GetKeyboardState, esi
xor eax, eax
;high byte: bios status flag 2
shl byte ptr [esi + 2dh], 1 ;insert down
rcl eax, 1
shl byte ptr [esi + 14h], 1 ;capslock down
rcl eax, 1
shl byte ptr [esi + 90h], 1 ;numlock down
rcl eax, 1
shl byte ptr [esi + 91h], 1 ;scrolllock down
rcl eax, 1
shr byte ptr [esi + 13h], 1 ;pause active
rcl eax, 1
shl byte ptr [esi + 2ch], 1 ;printscreen down
rcl eax, 1
shl byte ptr [esi + 0a4h], 1 ;left alt down
rcl eax, 1
shl byte ptr [esi + 0a2h], 1 ;left ctrl down
rcl eax, 1
;low byte: bios status flag 1
shr byte ptr [esi + 2dh], 2 ;insert active
rcl eax, 1
shr byte ptr [esi + 14h], 2 ;capslock active
rcl eax, 1
shr byte ptr [esi + 90h], 2 ;numlock active
rcl eax, 1
shr byte ptr [esi + 91h], 2 ;scrolllock active
rcl eax, 1
shl byte ptr [esi + 12h], 1 ;any alt down
rcl eax, 1
shl byte ptr [esi + 11h], 1 ;any ctrl down
rcl eax, 1
shl byte ptr [esi + 0a0h], 1 ;left shift down
rcl eax, 1
shl byte ptr [esi + 0a1h], 1 ;right shift down
rcl eax, 1
INVOKE ExitProcess, eax
END start
Уничтожение EXE: 640 Байт для программы на C