User Tag List

Показано с 1 по 5 из 5

Тема: ускорить Unreal Speccy ? timeBeginPeriod()

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    14.03.2005
    Адрес
    Комсомольск-на-Амуре
    Сообщений
    2
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Lightbulb ускорить Unreal Speccy ? timeBeginPeriod()

    Здравствуйте!

    Хотется подельтся некоторыми соображениями о эмуляторе.
    В ini файле есть такая строка:
    ; give idle timeslices to other applications
    ShareCPU=1 ; 1 - only for fast CPUs (incompatible with SoundDrv=none)
    Если флаг установлен, то эмуль отдаёт время CPU вызывая Sleep(SLEEP_DELAY). По умолчанию SLEEP_DELAY = 2.

    На самом деле, в ОС NT задержка получается совершенно другая. Её время определяется ключём
    HKLM\SYSTEM\CurrentControlSet\Control\PriorityCont rol\Win32PrioritySeparation
    и составляет (на не серверных версиях) ~15мс.

    Измерить время можно, поместив в файл emul.cpp (после стандартных хидеров) код:
    Код:
    #define SLEEP_TIMING
    #ifdef SLEEP_TIMING
    unsigned _tsc;
    #define Sleep(X) _tsc = rdtsc(), Sleep(X),                \
       printf("Sleep(%u) time = %u microseconds\r\n",         \
          X,((rdtsc()-_tsc)/(conf.cpufq/1000000?conf.cpufq/1000000:1)))
    #endif
    На практике числа могут быть иные (см. далее)

    Так как длительность кадра Спектрума составляет =20мс, то мулятору при [VIDEO]VSync=1 нужно уложиться в оставшиеся 5мс для вывода кадра. Иначе возможны тормоза. Причём виновата в этом ОС

    Документированных способов влиять на планировщик мне не известно, но есть полудокументированный - вызвать где-нибудь при инициализации timeBeginPeriod(1). При этом точность Sleep станет на порядок выше (реально: аргумент_ф-ции+1мс).
    Теоретически, это должно позволить мулятору работать на более слабых машинах, чем сейчас.

    timeBeginPeriod(1) можно вызывать из любой программы, поэтому, скорость работы эмуля может сильно различаться в зависимости от конфигурации софта (afaik, winamp и некоторые плагины миранды вызывают эту ф-цию).

    У меня проц AXP2000+, но при SoundDrv=none fps падает до 35, поскольку Sleep() вызывается в цикле (2*15мс) - с включеным звуком этих проблем нет. При использовании timeBeginPeriod всё нормально
    Думаю, такая фича окажется полезной ещё для кого-то.

    ЗЫ: На всякий случай аттачу отдельный тест для измерения Sleep и примитивную прогу, которая делает timeBeginPeriod(1) (пока не закрыт MessgeBox) - проверить можно не перекомпилируя эмуль.
    Вложения Вложения

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Порт Unreal Speccy под Linux!
    от ^m00h^ в разделе Эмуляторы
    Ответов: 63
    Последнее: 24.07.2025, 01:02
  2. Ответов: 6
    Последнее: 09.04.2021, 00:28
  3. USB+Speccy
    от amiguser в разделе Несортированное железо
    Ответов: 73
    Последнее: 15.07.2006, 00:47
  4. Как в Unreal ускорить загрузку TAP файлов?
    от lavstudio в разделе Эмуляторы
    Ответов: 1
    Последнее: 19.02.2005, 01:50
  5. Unreal Unreal commands ;)
    от MadCat! в разделе Эмуляторы
    Ответов: 8
    Последнее: 10.02.2005, 14:10

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •