Как ускорить рендер Mario 64 до 124%

Ромхакер Kaze Emanuar сделал не одну модификацию для Super Mario 64. В данный момент он занят разработкой очередной модификации, в процессе которой он смог заставить модифицированную игру работать на оригинальном железе быстрее, чем оригинал. Это перевод-пересказ его видео, где он немного рассказал о своей оптимизации.

Оригинальный ролик на английском языке

Все футажи в видео записаны с реальной Nintendo 64. Прежде чем начать хочется прояснить, разработчики в то время просто не могли добиться такого уровня оптимизации. Понимание железа было не таким обширным, как спустя несколько лет. И сам факт того что им удалось запрограммировать всю эту математику, чтобы сделать работающую 3D игру, очень впечатляет. Как будет сказано, было допущено много ошибок и странных решений. Сделавших рендер невероятно медленным. Многое из описанного ниже можно отнести и к современной разработке. Тем не менее сейчас CPU настолько быстрые, что разработчики больше не обращают на это внимание. И поэтому мы получаем так много плохо оптимизированных игр. Хочу так же отметить что речь пойдет о коде графического рендера, а не о буквальном выводе пикселей. Это два отдельных компонента, каждый из которых может снизить fps для игр Nintendo 64 индивидуально.

Часть 1: Оптимизация компилятора

До оптимизации, используя родной компилятор Mario 64, первый уровень модификации требовал 28 миллисекунд для рендера. Это значит, что на данном уровне игра будет работать при 35 кадров в секунду. Однако нам так же нужно просчитывать физику, объекты и все остальное. Что практически не оставляет места для рендера кадра, это серьезно влияет на количество кадров.

Используя современный GCC и О2 оптимизацию, мы можем заставить код работать более эффективно. И уменьшить время рендера до 23,5 миллисекунд. Эти 4,5 миллисекунды мы получаем просто включив оптимизацию компилятора. Разработчики могли сделать это еще тогда, но они этого не сделали.

Kaze спросил у Годдарда, реального разработчика игр для N64, почему так получилось. Он предположил что разработчики не хотели рисковать появлением в релизной версии багов, которых не было в дебаг-версии.

Часть 2: Математические функции

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

Оставь комментарий, если узнал песню!

В конце ролика есть объяснение всех функций. И все это сэкономит нам 3 миллисекунды, уменьшив время рендера до 20,5 миллисекунд.

Часть 3: Тени

Как оказалось игра использует ТРИ вертикальных рейкаста, просто для того, чтобы найти позицию и наклон поверхности под объектом для отрисовки тени. Почему три? Это ужасно тупо и практически непростительно. Кем бы ни был тот, кто написал это тогда, я надеюсь Миямото крепко материт его по сей день за подобное решение. Это не делает что-то лучше, это просто тупо.

Исправить это было ничтожно просто, что дало безумное ускорение. Сокращение до одного рейкаста снизило время до 17,5 миллисекунд. Это значит что теперь мы можем обрабатывать 56 кадров в секунду.

Часть 4: Кэш инструкций

В общем после перечисленных выше махинаций, Kaze просмотрел всю кодовую базу держа все что узнал в голове. И прочел практически весь код графического рендера вне математики. Больше всего рендер ускорился из-за улучшения кэша инструкций. После этого код не только стал более удобным для работы, но и рендер стал занимать всего лишь 14,9 миллисекунд. А значит технически игра теперь может выдавать больше 60 кадров в секунду.

Часть 5: Кости анимаций

В сообществе моддеров Mario 64 для создания 3D-моделей используют Blender Fast 64. Как оказалось моделях из игры много не нужных костей, которые ничего не делают. Не совсем понятно зачем их туда добавили. Kaze скооперировался с N64-разработчиком для создания более эффективной геометрии моделей. Со всеми исправлениями мы получаем 13,4 миллисекунд. К сожалению к этому моменту Kaze уже добавил на уровни другие детали, от чего цифры могут быть менее точными.

Часть 6: RDRAM

После этого Kaze обратился за советом к Wiseguy, довольно известным моддером и homebrew-разработчиком. Понял что запрет GCC на создание таблиц переходов дает ускорение и разрешил GCC создавать их только в случае более 15 обращений. Это сократило рендер до 13,0 миллисекунд. За исключением функций обработки геометрии, где Kaze превратил все switch case в огромную таблицу переходов. Это может выглядеть ужасно, но это позволило ускорить рендер до 12,5 миллисекунд. Что значит мы можем обрабатывать 80 кадров в секунду.

Заключение

Ну вот и все, мы пришли от 28 миллисекунд к 12,5 миллисекундам. Новый код может обрабатывать 224% от геометрии в отличии от старого кода. И какая же практическая выгода от всего этого? Очевидно просто просчитывать кадр недостаточно, чтобы так же рендерить его. В зонах где CPU замедлялся, fps значительно возрос. В худших случаях он поднялся с 9 кадров в секунду до 18. В конечно итоге это сделает мою работу над модификацией намного легче в будущем.

1919
6 комментариев

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

2
Ответить

Все, публикую как есть. Очень много пришлось сократить и переписать, надеюсь смысл я сохранил. Можете начинать ругать.

1
Ответить

Ну раз нужно начинать ругать, то...
1) Ты нинтендобой.
2) Марио 64 - старая никому не нужная игра
4) Ник у тебя не очень.

1
Ответить

вот вам небольшой коуб.Боги, убери эту поделку дьявола и просто кинь скрины. Тут же даже паузу нельзя поставить, чтобы почитать .–.

Ответить

Ну тебе за этим в оригинальный видос, это же я для создания настроения как в видео.

Ответить