Про ZXMAK2

emulators

Postby zxmak » 20 Jan 2015, 23:35

deathsoft, откуда такой сарказм? :)

Тебя не насторожило то, что по твоему графику фпс в ZXMAK2 прыгает с 25 до 50, хотя по эмулятору видно что он стабильно 50 держит? ;)

Дело в том, что ZXMAK2 на лишних кадрах не делает Present. Это те точки вверху графика. Убери их, останутся только нижние, по ним и сравнивать нужно
Last edited by zxmak on 20 Jan 2015, 23:48, edited 1 time in total.
Эмулятор-виртуальная машина ZX Spectrum - ZXMAK2: https://zxmak2.codeplex.com/
User avatar
zxmak
 
Posts: 83
Joined: 26 Oct 2012, 02:25
Group: Registered users

Postby zxmak » 20 Jan 2015, 23:47

эмуляция синхронизации по TSC нагло попизжена из унриала, а потом идут рассказы о том, что в zxmak2 синхронизация выполняется точнее...


если внимательнее посмотреть, то там вообще нет TSC, идея засыпать действительно подсмотрена в unreal (о чем кстати даже в коменте к изменению сказано), но ты смотришь код синхронизации по времени. А смотреть нужно WaitFrame в RenderVideo.cs, где синхра по видео.
Там во первых тоже вместо TSC используется системный таймер, у которого частота не скачет.
А во вторых системный таймер используется только для отслеживания пропуска vblank.
Для синхронизации же, в качестве таймера используется развертка дисплея.

И нужно принять во внимание, что ZXMAK2 в отличие от унриала, умудряется в одном потоке вместе с вызовом Present, прокачивать и оконные месиджи полноценного UI, обрабатывая клики, менюшки и т.п.
Обработка таких сообщений естественно может заблочить Present, поэтому для чистоты эксперимента кликать по окну эмулятора во время замеров не нужно, а лучше вообще даблкликнуть по нему, чтобы захватить мышу :)

и zxmak2 действительно стабильнее держит синхру, убедиться в этом можно на интре в ZXTIME#15. В unreal каждые 5-10 секунд происходит смена кадров и цвета меняются, а в zxmak2, хоть пол часа держи - смены кадров нет, стабильно держит :)
Если в zxmak2 включить синхру по Time, то эффект тот-же что и в unreal.

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

В unreal кстати тоже можно улучшить стабильность, заменив TSC на системный таймер, в unreal это значительно проще, т.к. ему не нужно прокачивать очередь сообщений полноценного ui. А вот в zxmak2 сложнее, у него полноценная очередь сообщений ui прокачивается и нужно все затачивать под то, чтобы очередь и Present не мешали друг другу.
Эмулятор-виртуальная машина ZX Spectrum - ZXMAK2: https://zxmak2.codeplex.com/
User avatar
zxmak
 
Posts: 83
Joined: 26 Oct 2012, 02:25
Group: Registered users

Postby deathsoft » 21 Jan 2015, 01:43

zxmak wrote:И нужно принять во внимание, что ZXMAK2 в отличие от унриала, умудряется в одном потоке вместе с вызовом Present, прокачивать и оконные месиджи полноценного UI, обрабатывая клики, менюшки и т.п.
Обработка таких сообщений естественно может заблочить Present, поэтому для чистоты эксперимента кликать по окну эмулятора во время замеров не нужно, а лучше вообще даблкликнуть по нему, чтобы захватить мышу

Вообщето unreal работает точно также, более того, если схатить за заголовок окна винда сама уйдет во внутренний модальный цикл отработки перетаскивания/ресайза окна и эмулятор вообще перестанет на это время работать.
User avatar
deathsoft
 
Posts: 4744
Joined: 07 Apr 2007, 00:58
Group: Registered users

Postby deathsoft » 21 Jan 2015, 01:50

zxmak wrote:если внимательнее посмотреть, то там вообще нет TSC, идея засыпать действительно подсмотрена в unreal (о чем кстати даже в коменте к изменению сказано), но ты смотришь код синхронизации по времени.

Если внимательно прочитать доку микрософт то QueryPerformanceFrequecy/QueryPerformanceCounter всегда используют rdtsc если на данном проце это возможно сделать, только делают это в разы медленнее чем команда проца rdtsc (т.к. нужно переключится в ядро, да еще сделать коррекцию между всеми процами). Если rdtsc использовать невозможно (проц с плавающей частотой tsc, то винда (XP) использует обычный таймер, который не точнее 1мс, vista и выше умеет использовать HPET и PMTimer разрешение которых выше (10Мгц и 3.57Мгц соответственно)). Современные процы типа core i7 и подобных давно имеют frequency invariant tsc, который работает на фиксированной частоте и не зависит от повер стэйтов проца и всяких там турбо бустов, зато частота этого tst гигагерцы (например 3ГГц или 2.6ГГц), что позволяет получить существенно более точную синхронизацию. На C# подобное не сделать, ибо rdtsc нельзя вызвать в принципе, т.к. не нейтив язык.

У микрософта етсь статья про таймеры https://msdn.microsoft.com/en-us/librar ... 08(v=vs.85).aspx (как видно из таблицы в конце минимальный оверхэд у rdtsc (в 10 раз меньше чем у QueryPerformanceCounter)).
User avatar
deathsoft
 
Posts: 4744
Joined: 07 Apr 2007, 00:58
Group: Registered users

Postby deathsoft » 21 Jan 2015, 01:59

zxmak wrote:т.к. ему не нужно прокачивать очередь сообщений полноценного ui. А вот в zxmak2 сложнее, у него полноценная очередь сообщений ui прокачивается и нужно все затачивать под то, чтобы очередь и Present не мешали друг другу.

Унриал прокачивает полноценную очередь сообщений, см. файл util.cpp функцию process_msgs().
User avatar
deathsoft
 
Posts: 4744
Joined: 07 Apr 2007, 00:58
Group: Registered users

Postby deathsoft » 21 Jan 2015, 02:05

zxmak wrote:И кстати синхра была доработана после того той версии что ты тестил, она стала еще стабильнее. Хотя я все еще не удовлетворен, стабильность синхронизации еще можно улучшить, но тут уже дело идет на грани возможностей планировщика потоков винды, поэтому все сильно зависит от мелких деталей

Я смотрел все версии zxmak2 и действительно, чем новее версия, етм стабильнее fps, в самой новой - наиболее стабильный. Стабильность синхронизации действительно можно улучшить и Titus писал тебе как это можно сделать, нужно во первых своему процессу выставить Realtime Prioriti Class во вторый главному потоку поставить приотриет Time Critical, в сретьих сделать timeBeginPeriod(1), чтобы Sleep(1) и прочие подобные функции делали действительно слип на ~1мс, а не на 10/15. Приоритет подниматьможно только на многоядерных процах, иначе малейший подвисон эмулятора равен подвисону всего компа (более того будут постоянно вытестены потоки файловой системы и служебные потоки винды), для time critical требуется специальная привилегия/либо права админа, т.ч. при их отсутствии можно поднимать до high. Ну и таки основной поток эмуля нужно привязать к конкретному ядру, чтобы он не болтался как Г в проруби по всем ядрам.
User avatar
deathsoft
 
Posts: 4744
Joined: 07 Apr 2007, 00:58
Group: Registered users

Postby deathsoft » 21 Jan 2015, 02:10

zxmak wrote:Тебя не насторожило то, что по твоему графику фпс в ZXMAK2 прыгает с 25 до 50, хотя по эмулятору видно что он стабильно 50 держит?

График не fps показывает, а время между соседними кадрами, оно должно быть ровно 20мс в идеале, а в zxmak2 плавает от 20 до 24мс. (Это при том что частота развертки монитора 100Гц, кратная 50Гц). И кстати синхонизация по видео в zxmak2 работает только если у монитора 60Гц развертка, тогда zxmak2 дает 50фпс, если развертка 100Гц, то zxmak2 дает 100фпс вместо 50.
Last edited by deathsoft on 21 Jan 2015, 02:12, edited 1 time in total.
User avatar
deathsoft
 
Posts: 4744
Joined: 07 Apr 2007, 00:58
Group: Registered users

Postby zxmak » 21 Jan 2015, 02:11

Если внимательно прочитать доку микрософт то QueryPerformanceFrequecy/QueryPerformanceCounter всегда используют rdtsc если на данном проце это возможно сделать, только делают это в разы медленнее чем команда проца rdtsc (т.к. нужно переключится в ядро, да еще сделать коррекцию между всеми процами).


чтото тут не то. Частота TSC 2.6 ГГц, а частота QueryPerformanceFrequecy 2 МГц... Неужто система делит значение TSC? :)

затести плиз вот эту версию, если можно выложи скриншот что получилось: https://zxmak2.codeplex.com/releases/view/610909
Тут при синхре от видео на каждом фрейме Present вызывается, чтобы удобнее было сравнивать
Эмулятор-виртуальная машина ZX Spectrum - ZXMAK2: https://zxmak2.codeplex.com/
User avatar
zxmak
 
Posts: 83
Joined: 26 Oct 2012, 02:25
Group: Registered users

Postby deathsoft » 21 Jan 2015, 02:13

zxmak wrote:чтото тут не то. Частота TSC 2.6 ГГц, а частота QueryPerformanceFrequecy 2 МГц... Неужто система делит значение TSC?

Все очено просто, на твоем компе система не может заюзать TSC для QueryPerformanceFrequecy, отключи в биосе управление энерго сбережением и возможно заюзает.
User avatar
deathsoft
 
Posts: 4744
Joined: 07 Apr 2007, 00:58
Group: Registered users

Postby zxmak » 21 Jan 2015, 02:15

На C# подобное не сделать, ибо rdtsc нельзя вызвать в принципе, т.к. не нейтив язык.


в C# действительно сделать средствами самого языка асмовую вставку очень проблематично, но не проблема вызвать ее из unmanaged кода :)
Но тогда теряется кроссплатформенность, т.к. dll с анменеджед кодом прийдется делать под каждую платформу свою
Эмулятор-виртуальная машина ZX Spectrum - ZXMAK2: https://zxmak2.codeplex.com/
User avatar
zxmak
 
Posts: 83
Joined: 26 Oct 2012, 02:25
Group: Registered users

PreviousNext

Return to Эмуляторы

Who is online

Users browsing this forum: No registered users and 6 guests

cron