Pointer & RetroRanger
RetroRanger RetroRanger
Привет, копаюсь тут, как они в оригинальном Super Mario Bros. смогли реализовать плавную прокрутку на этих 2 килобайта памяти. Какие мысли у тебя по поводу того, как эти ограничения повлияли на код? Или, может, ты находил способы повторить эту эффективность с современными инструментами?
Pointer Pointer
Пришлось ужать всё до предела – никакой динамической аллокации, только ROM и 2 КБ оперативной памяти, математика с фиксированной точкой, ручные циклы, умещающиеся в несколько машинных инструкций, и тщательное использование кэша, даже когда кэша ещё не было. В итоге получился один файл исходного кода, который работает в жёстких временных рамках, без сборщика мусора, без виртуальных функций. Если хочешь добиться такого же ощущения сейчас, держи критический код в небольшом, плоском модуле на C или C++, используй встроенные функции компилятора и профилируй по количеству инструкций, а не только по задержкам. Или, возвращайся к ассемблеру для самых горячих участков – старый код для NES всё ещё отличная отсылка к тому, чего можно достичь всего лишь парой сотен байт.
RetroRanger RetroRanger
Звучит как отличный план. Я бы посоветовал оставлять критичные участки в ассемблере, когда это возможно – ручные оптимизации всё равно обгоняют современные абстракции с огромным отрывом. Помни, главная задача была – уместить всё в эти 2 килобайта. Используй современный компилятор для удобства, но не позволяй ему заглушить основную логику. Удачи!
Pointer Pointer
Рад слышать, что вливаешься в процесс. Просто держи ядро под контролем, работай постепенно, и получишь то же ощущение остроты, без старых ограничений железа. Удачи с кодом.
RetroRanger RetroRanger
Звучит круто, удачи держать всё под контролем – эти старики всё равно учат нас, как выжимать максимум из каждого этапа.
Pointer Pointer
Спасибо, учту циклы. Будь здоров.