Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2011, 02:22   #1
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию Точная задержка (ну и обработка клавиатуры).

Здравствуйте!
Пишу графическу игрушку, буду продолжать, но есть важная проблема, которая меня бесит - задержка. Стандартная процедура Delay не катит, ибо недостаточно точна для меня, да и на разных компах будет разная скорость - тоже не подходит. Перелопатил интернет в поисках точного дилея, много чего нашел, но мало что понимаю. Те дилеи, которые я смог прикрутить, слишком грубы (минимальная задержка не дает желаемой скорости игры, для некратных отклонений скорости не подходит тем более). Кто-нибудь может мне объяснить этот код:

Код:
{In an article of Sun, 19 Jan 1997 in comp.lang.pascal.borland, Martin Lafferty (robots@enterprise.net) wrote :-}

I find the best way to get a small machine independent delay is to do a harmless read from something on the ISA bus.}
{Reading a byte port takes about a microsecond, I reckon.}
{I suspect I have run into trouble mixing dummy loops and port reads, as the pentium can get clever and do the port read before it finishes the loop!}

{e.g. This can fail, even if BigNumber is really big, because the second read can occur before the loop has completed.}

    something := Port[somewhere] ;
    for i := 0 to BigNumber do {hardware requires delay in here}
       Junk := 1 ;
    somethingElse := Port[somewhereelse] ;

{I do it like this}
    something := Port[somewhere] ;
    for i := 0 to RelativelySmallNumber do {hardware requires delay in here}
       Junk := Port[HarmlessReadonISABus] ;
    somethingElse := Port[somewhereelse] ;
Или же это не будет зависеть от таймера или как оно там называется, уже не понимаю ничего. В общем, задача:
Нужна задержка, с точностью не менее 1мс, дающая одинаковую задержку на всех компьютерах PC.

Про клавиатуру спрошу, когда разберусь с задержкой.

Буду премного благодарен тому, кто мне поможет!

Последний раз редактировалось mmx358; 22.03.2011 в 02:39.
mmx358 вне форума Ответить с цитированием
Старый 22.03.2011, 08:46   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) А зачем Вам старый мёртвый MS DOS ?! (я же правильно понял - Вы ваяте под TurboPascal ?)

2) стандартный delay (как и любые манипуляции с GetTickCount, так же как и манипуляции с прерываением таймера (0x1C, если память не изменяет) не могут дать точность выше 1/18 секунды (это примерно 55 мс)
хотите точнее - попытайтесь использовать мультимедийный таймер (если не ошибаюсь, то под DOS он был доступен в DOS Extender'ах)


Добавлено

Автор: Юрий Ревич
Опубликовано в журнале "Компьютерра" №42 от 27 октября 1998 года

И снова о проблеме Delay

Последний раз редактировалось Serge_Bliznykov; 22.03.2011 в 09:00.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.03.2011, 02:20   #3
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

Serge_Bliznykov, я работаю под FreePascal for DOS, потому что только в нем более-менее нормально работает графический режим.

Спасибо, я читал эти материалы, 99% из них не понял. Жаль, что некому помочь. Ведь куча игр, которые писались для дос, нормально работают со временем и на современных компах... Узнать бы, как это реализовано там.

По поводу моей программки. Я прикинул, что лучшим вариантом было бы создание точки начала отсчета и точки конца отсчета, выполнение вычислений, затем, пока время не будет равно или больше точки конца отсчета, выполнять пустой цикл. Подобное мне пришло в голову сразу же, с использованием GetTime, однако точность составляет сотые доли секунды, что слишком долго.
mmx358 вне форума Ответить с цитированием
Старый 26.03.2011, 11:20   #4
MacTepCnupTa
Новичок
Джуниор
 
Регистрация: 26.03.2011
Сообщений: 1
По умолчанию

А не получится просто в начале программы с помощью таймера отловить сколько циклов проходит за 1 секунду на этом компьютере, а потом из этого исходить?
MacTepCnupTa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка прерываний клавиатуры. Borland Pascal. Kingdom_Reborn Помощь студентам 0 19.02.2011 18:02
Точная копия программы на любом языке westcoastkilla Фриланс 2 20.12.2008 17:59
Точная копия программы на любом языке westcoastkilla Помощь студентам 5 20.12.2008 09:23