Обновить
79
0.5
Алексей@BiTL

Пользователь

Отправить сообщение

Кто там чего поселил? Госпаде... Не было никакого заговора, никто целеноправлено не разваливал СССР. Экономически он естественным путем дошел до ручки.

Но вы почему-то сравниваете какие-то "действия со стороны народа" с сегодняшними реалиями. Начнем с того, что и тогда в РСФСР не было никаких "действий народа". Это народ в республиках (начиная с Прибалтики) решил выйти из состава СССР.

Ну и года этак с 1985-1987 - начинаются очереди 

Очереди и дефицит был постоянным явлением в СССР, а не "начинался" в каком-то там году. Просто в одном регионе за маслом стояли в одни годы, за молоком в другие, а в другом регионе наоборот... Но кризис и дефицит то на одни товары, то на другие - был нормой жизни. В одном городе велосипеды "Салют" в "спорттоварах" стояли свободно, в другом городе их приходилось за взятку со склада покупать в моменты их завоза (партией в 50 штук на весь город).

Где-то люди БК и Агат видали в магазинах, но не могли купить нормальную фотопленку и проявитель. Где-то пепси-колу пили в любое время, а где-то лимонад "колокольчик" бы не постоянным гостем прилавков.

А уж отличия в снабжении каких-нибудь закрытых "академ-городков" и Москвы с остальными средне-статистическими регионами - вообще космические. Я уж не говорю о социальном разделении на парт-номенклатуру(и управленцев) и остальных трудящихся.

Что-то подобное VFX-1 я в принципе видел в 90-х, но играть в нем не доводилось. Говорят - играть в них было не очень приятно, вестибулярка выходила покурить.

Признаю, был не прав. Как минимум в DosBox-X "Gobliiins" на 8086 запускается. VGA конечно да, с обязательностью я тоже погорячился, просто я как поклонник данной серии игр не представляю себе гоблинов на CGA, EGA, это кощунство :)

Arcanoid, Popcorn, Shamus, Socoban, Sopwich,..

Да, но те реализации что работали на XT-шке выглядели как гавно. По сравнению с тем что было на тех же аркадных автоматах, а позже на приставках и Амиге.

Я в курсе. Хотя например Gobliiins и Gods это порты с Амиги и вышли в 91-92 годах, требуют VGA-адаптер, и что-то очень сомнительно, что будут на XT-шке работать. Ну и уж точно там юзается и таймер и прерывания (в Gods апаратный скроллинг, в Gobliiins звуковое сопровождение очень продвинутое.

PS: погуглил, Gods требует минимум 286-го, Gobliiins минимум 386-й. Так ша не морочьте мне голову.

Это не значит что при портировании на другие платформы все также и осталось. В дизасемблированных сорцах ДОС-порта таймер используется.

"лишь на 286" - ну до 286-го то что было на PC и играми сложно назвать. На 286-м что-то както шевелиться начало, но все еще по сравнению с приставками и Амигой - это все был шлак.

Хотя, сейчас есть энтузиасты, которые и для XT-шки делают прикольные движки https://www.youtube.com/watch?v=nsXIA7VIqXM (исходники доступны, можете ознакомится, посмотреть - зачем и как используются прервывания :) )

Это если ваш цикл работает с достаточной скоростью и эта скорость никак не меняется. Вообще так никто не делал. Это и неудобно и неправильно. Прерывания для того и существуют, чтобы распараллелить процессы, и звук и ввод с клавиатуры никак не зависели от текущей позиции выполнения кода в основном цикле. Вы там можете хоть все на паузу поставить, но это не повредит плееру и обработки клавиатуры (мыши, или джойстика).
Ну а тем более в старых играх... И на старых IBM PC. Там рендер-цикл ваще никогда 60 фпс не выдавал. Графика очень медленная была. Отрисовка очередного кадра могла быть и 10 фпс, и 5 фпс.

По вашей схеме можно делать игры аля "Поле чудес", или "Балда", или какой-нибудь пасьянс, "шарики", "Перестройка". Даже какой-нибудь квест, вроде первых версий Space Quest и Larry. Но что-то более аркадное и технологичное, вроде Dangerous Dave, Prince of Persia или Commander Keen так не создать. Уже не говоря о чем-то вроде Алладина, Zool, Червяка Джима, Golden Axe, Jazz JackRabbit, Prehistorik 2, Realms of Chaos и прочем.

В ДОС тоже можно получить 1 мс таймер. Просто готовой API не было.

Ммм, а зачем нам нужно прерывание? Как раз наоборот, мы запрещаем прерывания

Берем прерывание таймера, вешаем туда обработчик типа timer=timer+1, и вот у вас счетчик милисекунд, и можете делать хоть делэй правильный, хоть считать скорость рендера кадров, чтобы правильно инкременировать переменную анимации. И это позволит вашей игре работать правильно и на быстрых компьютерах, и на медленных.

Если вы запретите прерывания (даже на время вашего delay) станет невозможно озвучить игру фоновой музыкой и управление станет плохо-отзывчатым.

То, про что вы пишете, это стало актуальным где-то во времена второго Дума.


Во времена второго Дума уже Пентиумы и Виндовс вышли. Нет, все было актуально раньше :) Кармак написал Commander Keen в 1990-м, и там уже все было как надо. Хотя полно и более ранних игр, где все синхронизировано правильно и надежно :)

Но проверить не могу.

Ну а я могу :) И проверял.

Не страшно, скролл раз в 30 секунд тоже плавный.

На глаз сильно отличается. Скролл с 60 фпс намного приятнее :)

Надо просто расставить по коду рендера проверки.

Ясно... Вопросов больше нет )

Если железо не тянет - тут ничего не исправить.

Ну как... Если железо тянет 30 фпс, то игра все еще вполне гладко выглядит. Просто надо шаг анимации (движения камеры, и т.д.) умножить на количество пропущенных кадров, или прокрутить логику анимации/физики n-раз (в самом упрощенном случае. Есть, конечно, более продвинутые формулы). То есть компенсировать число пропущенных кадров.

Так делается в любых играх. Кто с этим неумеет работать? Не представляю.

Можно и без прерывания, главное чтобы сам таймер был.


Без прерывания как? Аппаратный скроллинг экрана нужно инициировать только в момент обратного хода луча. Иначе будут дёргания экрана. При этом компьютер может и не успевать выполнить рендер-цикл за 1/60 секунды.

Также, если у нас (в DOS-игре) есть звук, музыка - как это должно работать без прерываний? Как в некоторых поделках , где все замирает в момент, когда из PC Speaker'a раздаются звуки? :)

Это сработает если рендер работает со скоростью вертикальной развертки или быстрее. Что будет когда рендер делает только 30 фпс? Делэй очевидно в этом случае не происходит, и не нужен. Но у вас все будет двигаться в два раза медленее.

Что касается старого железа и старых игр под DOS. Вы играли когда-нибудь в Jazz Jackrabbit, или в Zool? Ну или в подобные платформеры с плавной прокруткой экрана?
Так используется аппаратный скроллинг. Чтобы он работал, нужно 60 раз в секунду (или 70, зависит от видео-режима) дергать порты видеокарты. При этом спрайты в игре могут и не обновлятся/двигаться с такой же частотой. Реализуется это через прерывание, которое срабатывает 60 раз в секунду, выполняя вашу определенную процедуру. При этом рендер цикл может и не успевать обновляться, скроллинг экрана будет всеравно гладким.

в типичном игровом цикле нужен именно delay.

Ну допустим вы откалибровали delay и он задает более менее одинаковую паузу на железе с разной производительностью.
Но рендер кадра ведь в разной ситуации может происходить с разной скоростью. И конечно на разных компьютерах кадр будет рендерится за разной время. В итоге и получается, что на 286-м игра работает с задуманной авторами скоростью, а уже на 386-м начинает летать в 2 раза быстрее. А на XT-шке наоборот будет все трагически медленно.

Вы же понимаете для чего нам таймер и как с его помощью сделать скорость движения объектов одинаковой на компьютерах с совершенно разной производительностью?

Интересное решение, но документацию тут вообще не найти.

Да совершенно традиционная штука. Какая документация вам нужна? Вот традиционный код ожидания начала обратного хода вертикальной развертки:

  mov  dx, 3DAh
@w1:
    in   al, dx
    test al, 8h
  jnz  @w1
@w2:
    in   al, dx
    test al, 8h
  jz   @w2

Ну вот с таким опытом программирования люди и писали на PC игрушки, незная ничего о таймере, которые в итоге на более быстрых процессорах начинали работать ненормально быстро :)

И одно дело написать игру аля Alley cat, а другое дело - действительно что-то сложное и которая будет нормально работать на разном железе. Поэтому старые игры Кармака работают хоть на 286-м, хоть на Пентиуме, не требуя замедления. Кармак знал как программировать таймер :)

Почему "самого первого"? Игры, например, далеко не сразу на IBM PC появились. И уж в 80-х годах вполне себе были стандарты.

Как вы вообще представляете себе работу анимации в играх без использования таймера? Как создать музыкальное сопровождение?

Вы программировали мультимедиа под DOS?

Скорость таймера программируется. Программа может любое разрешение поставить, 1/100 секунды, или 1/1000.

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

Чтобы пользоваться хотя бы нулевым с каким-то иным разрешением, нежели 18.2мс, нужно было, чтобы ваша софтинка сама контролировала системное время.

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

Вкратце:

Скрытый текст
#include <dos.h>
#include "timer.h"

static void interrupt (*old_timer)();

void interrupt timer()   // ticks once per millisecond
{
    static unsigned count_55ms = 0;

    // our code

    // execute default handler
    if (++count_55ms == 55)
    {
       old_timer();
       count_55ms = 0;
    }
    else outp (0x20, 0x20);
};


void main()
{
   // timer init
   new_divisor (1193);           // 1 tick per 1ms
   old_timer = _dos_getvect (8); // save vector
   _dos_setvect (8, timer);      // set new vector

   // our program

   new_divisor (0);   // restore timer
   _dos_setvect (8, old_timer);
};


Если бы я сам не программировал таймер, я бы не спорил. А вы спорите со мной по вещам, которые я делал буквально вчера (чекайте мои статьи).

И как вы думаете в DOS работают музыкальные плееры Adlib (OPL2), в том числе в играх, у которого в отличии от Sound Blaster нет своего прерывания? Ессесно на таймер вешается.

Пытаться измерить производительность и на этой основе выставлять временные коэфициенты - это полная хрень. Нам ведь нужно прерывание, а не просто delay(). А просто "делэй" можно сделать ожиданием обратного хода луча развертки, поскольку частота развертки у конкретных видеорежимов была одинаковая на всех компьютерах. Но это полумера.

Информация

В рейтинге
2 290-й
Откуда
Актобе (Актюбинск), Актюбинская обл., Казахстан
Дата рождения
Зарегистрирован
Активность