mercury13_kiev (mercury13_kiev) wrote,
mercury13_kiev
mercury13_kiev

Categories:

Джеймс Хэг. Брошенный в холодную пучину настоящего программирования

Оригинал: Stumbling Into the Cold Expanse of Real Programming

Возможно, вам покажется, что я ударился в ностальгию, но я этого не хотел. А может, и хотел, но не это было моей конечной целью. Всё началось с вопроса:

Как вообще на 8-битных машинах работали быстрые аркадные игры?

В те дни процессоры не дотягивали до 2 МГц, а каждая команда выполнялась только тогда, когда выполнится предыдущая. И никакой плавающей запятой. И почти никакой целочисленной арифметики: ни умножения, ни деления, а сложение чисел за 255 требовало двух операций.

Но эти вырванные из контекста цифры мало о чём говорят — иначе не было бы столько анимированных игр, которые бегают на 60 fps на якобы негодном «железе». Не буду говорить за все системы, но на Atari 800, на котором я учился программировать, было именно так.

В большинстве игр не было графики, только сетка текстовых символов. Графический процессор превращал каждый байт в картинку прямо по ходу развёртки. Обычно эти картинки выглядят как символы ASCII, но их можно было заменить на что-то другое — на лабиринты, платформы, пейзаж, даже с несколькими цветами на символ. Перерисуй один символ, и все клетки с этим символом в следующем кадре будут нарисованы по-другому, никакой работы процессора.

Каждую строку символов можно попиксельно сдвигать горизонтально и вертикально через аппаратные регистры, отражённые в память, без копирования данных.

Спрайты (надо признать, одноцветные), накладываются на клеточный фон, и тоже по ходу развёртки, ничего не надо стирать. Видеочип делает сам всю работу и посылает полученную картинку на монитор. Чтобы сдвинуть спрайт, надо отправить число в регистр позиции.

Сборка на лету также проверяла столкновения спрайтов и фоновых пикселей, устанавливая биты, столкнулись ли. В коде даже не надо проверять на столкновения прямоугольников — есть точная попиксельная проверка столкновений на уровне видеочипа.

И я не осознавал, что, работая с этими чудесными возможностями, я просто давал команды аппаратуре. Самая тяжёлая работа доставалась одному звуковому процессору и двум видео-: мигание, рисование персонажей, позиционирование спрайтов и проверка столкновений. И не только изображение и звук: я даже не думал, откуда идут случайные числа. Ну, не совсем так: я знал, что из адреса 53770 (это был генератор псевдослучайных чисел, обновлявшийся с каждым тактом).

И когда я перешёл на новые машины, я понял, что я совсем не крутой игровой программист. Мне отдали всю работу, которую выполняли за меня сопроцессоры, но это дало поле для экспериментов с новыми идеями игр.

На компьютерах до Windows (начало 1990-х) я должен был писать свои функции по рисованию спрайтов. Настоящие, с рисованием и стиранием. Обрезание по границам экрана? Ранее я и не задумывался об этом, Atari делал это сам. И перед тем, как что-то нарисовать, я должен был придумать, какой формат данных использовать и как преобразовать картинку в этот формат. И я не мог запустить проигрывание звука двумя регистрами, надо было писать сложные функции микширования.

Вот так я перебрался из комфортного царства, где можно разрабатывать игры в голове и играть в них на родительском телевизоре, в холодную пучину настоящего программирования.

Tags: prog21, геймдев, давно, переводы
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments