User Tag List

Страница 139 из 224 ПерваяПервая ... 135136137138139140141142143 ... ПоследняяПоследняя
Показано с 1,381 по 1,390 из 2231

Тема: ZXMAK2 - Виртуальная машина ZX Spectrum

  1. #1381

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    там запас 5 мс вычитается, оставшиеся 5 мс эмуль опрашивает VBlank и крутит Thread.SpinLock.
    5мс - это больше трети кадра. Что такое Thread.SpinLock?
    Последний раз редактировалось Titus; 15.01.2015 в 16:44.

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

  3. #1382

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    5мс - это больше трети кадра. Что такое Thread.SpinLock?
    опечатался, Thread.SpinWait
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  4. #1383

    Регистрация
    27.04.2008
    Адрес
    Perm, Russia
    Сообщений
    1,026
    Спасибо Благодарностей отдано 
    412
    Спасибо Благодарностей получено 
    304
    Поблагодарили
    106 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от abelenki Посмотреть сообщение
    ZXMAK, есть ли надежда на эмуляцию ULAPlus в будущих релизах?
    нет ли подвижек в этом направлении?
    MAME Stuff | ZX Spectrum favorites | Bubble Bobble Series chart / wiki | PC configuration

  5. #1384

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    опечатался, Thread.SpinWait
    А зачем? Это же, на сколько я понимаю, просто цикл с заданным числом итераций?

  6. #1385

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    А зачем? Это же, на сколько я понимаю, просто цикл с заданным числом итераций?
    не совсем, это цикл операций, в которых не задействуются вычислительные блоки процессора, таким образом они могут быть использованы другими потоками. Но при этом наш поток не переключается на чужие задачи.

    Потестил на других машинах, оказалось не везде такая красивая картинка, на некоторых машинах довольно сильный разброс. Видимо там где time-slice довольно большой и Thread.Sleep со слишком большими квантами времени работает.

    А есть способ уменьшить кванты времени на Win 7? в старых системах помню можно было какой-то апишный вызов сделать и система переходила в рилтайм режим с низким time slice

    ---------- Post added at 19:12 ---------- Previous post was at 19:10 ----------

    Цитата Сообщение от abelenki Посмотреть сообщение
    нет ли подвижек в этом направлении?
    я сам давно хочу его реализовать, но для этого нужно разобраться как оно работает
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  7. #1386

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    не совсем, это цикл операций, в которых не задействуются вычислительные блоки процессора, таким образом они могут быть использованы другими потоками. Но при этом наш поток не переключается на чужие задачи.
    1) На сколько я знаю (может я отстал от новых процессоров) каждое ядро имеет свой набор вычислительных блоков.
    2) Зачем нужен этот цикл? Какая от него польза, если это просто пустой цикл на заданное число итераций?

    ---------- Post added at 23:31 ---------- Previous post was at 23:05 ----------

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Кстати интересный вопрос - можно как-то узнать количество ScanLines для текущего режима? Я сейчас тупо беру Height дисплея, что естественно не очень правильно, т.к. реальное число ScanLines больше Height, т.е. частота ScanLines вычисляется меньше реальной.
    В EmuStidio я делаю так:

    Выполнять в realtime-приоритете процесса. В этом приоритете ни один другой процесс не может получить квант времени, пока вы его не отдадите по Sleep. Т.е. если ваш процесс его не отдаст, то система зависнет железно (во всяком случае с одним ядром, проверял на XP). Возможно, что на современных виндах такой приоритет можно получить только под админом, я не проверял. Альтернативный вариант - это приоритет чуть меньше - high priority. Но он не дает гарантий точного измерения.

    Как известно, высота экрана в сканлайнах состоит из видимой части (которую нам сообщает система) и невидимой (VBlank части). Невидимая часть на LCD мониторах может быть равна 0 или 1. Для CRT-мониторов невидимая часть может быть несколько десятков сканлайнов.

    Алгоритм таков:

    1) Определяем видимую высоту экрана в сканлайнах через dwHeight

    2) Ждем пока луч не дойдет до середины экрана. Делаем это так:

    a) Sleep(1)
    b) Считываем номер сканлайна
    c) Если номер сканлайна меньше dwHeight/2, то цикл --> a)

    Таким образом мы отдаем около 50% быстродействия системе, дабы система не тормознула во время дальнейших измерений, ведь мы в realtime-приоритете.

    3) Далее определяем точку перехода через 0-й сканлайн:

    a) Считываем номер сканлайна
    b) Если номер сканлайна не меньше предыдущего, то цикл --> a)

    Таким образом полная высота экрана будет равна максимальному номеру сканлайна плюс 1

    Данный процесс я делаю несколько раз подряд, и проверяю, чтобы все 3 последовательных результата (за 3 кадра) были одинаковыми. Если так, то считаю измерение выполненным правильно.


    Теперь об установки минимальной дискретности для Sleep (т.е. для переключения процессов). Я это делаю через timeBeginPeriod(1). Во всех системах это прокатывает. Какое получилось реальное разрешение таймера можно потом проверить так:

    Код:
        TIMECAPS    tc;
    
    	timeGetDevCaps(&tc,sizeof(TIMECAPS));
    	printf("Timer Period Min - %dms\n", tc.wPeriodMin);

  8. #1387

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    1) На сколько я знаю (может я отстал от новых процессоров) каждое ядро имеет свой набор вычислительных блоков.
    2) Зачем нужен этот цикл? Какая от него польза, если это просто пустой цикл на заданное число итераций?[COLOR="Silver"]
    На одном ядре обычно два потока исполняется, при этом они шарят между собой вычислительные блоки. Если нужный блок занят одним потоком, то второй простаивает или пытается выполнить другие инструкции, если это возможно до выполнения текущей. Кроме того ядра тоже шарят между собой какието блоки, например общий кэш. Просто цикл, даже из nop загружает блоки процессора и второй поток из-за этого тормозится. Плюс к этому время холостого цикла процессор может использовать для синхронизации кэша или для своих оптимизаций. Если выполнять тупой цикл, то процессор не получит такой возможности
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  9. #1388

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Если выполнять тупой цикл, то процессор не получит такой возможности
    Зачем тебе нужен этот цикл? Тупой он или нет, не важно. Смысл его?

  10. #1389

    Регистрация
    30.01.2006
    Сообщений
    1,921
    Спасибо Благодарностей отдано 
    73
    Спасибо Благодарностей получено 
    119
    Поблагодарили
    80 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение

    Выполнять в realtime-приоритете процесса. В этом приоритете ни один другой процесс не может получить квант времени, пока вы его не отдадите по Sleep. Т.е. если ваш процесс его не отдаст, то система зависнет железно (во всяком случае с одним ядром, проверял на XP). Возможно, что на современных виндах такой приоритет можно получить только под
    Это не так, даже с рилтаймом система отобрает процессор для своих более важных задач. Да и зависаний никаких нет от рилтайма. Сегодня возился, пробовал и realtime+highest приоритет (это максимум) - синхра стабильнее, но видно что система отбирает процессор

    ---------- Post added at 23:00 ---------- Previous post was at 22:58 ----------

    Цитата Сообщение от Titus Посмотреть сообщение
    Зачем тебе нужен этот цикл? Тупой он или нет, не важно. Смысл его?
    Смысл в том что раз уж берем блокируем поток на холостой цикл, то нужно хотябы поделиться блоками процессора с другими потоками и дать прцессору пооптимизировать свои кэши. Это лучше чем тупо жрать вхолостую ресурсы
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  11. #1390

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,394
    Спасибо Благодарностей отдано 
    1,702
    Спасибо Благодарностей получено 
    2,219
    Поблагодарили
    873 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от ZXMAK Посмотреть сообщение
    Это не так, даже с рилтаймом система отобрает процессор для своих более важных задач. Да и зависаний никаких нет от рилтайма. Сегодня возился, пробовал и realtime+highest приоритет (это максимум) - синхра стабильнее, но видно что система отбирает процессор
    На XP с одним ядром если в реалтайм приоритете ты не отдашь управление системе, то комп железно зависнет (замрет экран, мышка и т.д.) и до ресета.

Страница 139 из 224 ПерваяПервая ... 135136137138139140141142143 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Ответов: 7
    Последнее: 06.04.2012, 21:37
  2. Машина Тьюринга для Z80
    от ZXMAK в разделе Эмуляторы
    Ответов: 4
    Последнее: 15.08.2011, 03:26
  3. Продвинутая Мелко Машина 1
    от Black_Cat в разделе Зарубежные компьютеры
    Ответов: 74
    Последнее: 03.03.2009, 09:05
  4. Что за машина такая??? Commodore 128...
    от ILoveSpeccy в разделе Commodore 16/64/128
    Ответов: 5
    Последнее: 31.10.2007, 10:25
  5. Java-машина
    от Error404 в разделе Программирование
    Ответов: 2
    Последнее: 15.01.2007, 15:11

Ваши права

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