не советую брать оотуда билды, они частенько оказываются нерабочими.
Вид для печати
не советую брать оотуда билды, они частенько оказываются нерабочими.
возможно из-за того что не все коммиты бывают рабочие, т.к. бывают комитты, которые идут в несколько шагов, например когда идет переименование/перенос файлов с редактированием
Начиная с версии 38156 можно задавать частоту дискретизации (должна быть кратной 50) для звуковой платы в unity.config (контейнер winforms, т.к. есть еще xna с аналогичным блоком для XnaSound):
можно даже уменьшить число буферов, это уменьшает время задержки звука, но тогда могут появиться срывы.Код:<!-- Host -->
<register type="IHostSound" mapTo="HostSound_Mdx">
<constructor>
<param name="form" />
<param name="sampleRate" value="44100" />
<param name="bufferCount" value="4" />
</constructor>
<lifetime type="transient" />
</register>
Можно даже попробовать скормить WinForms реализации хост сануд от XNA, но он не запустится - почемуто не хочет без запуска Game класса :smile:
А вот наоборот (DirectX в XNA) - работает :biggrin: Для этого нужно заменить IHostSound регистрацию в контейнере xna (аналогична вышепроцитированной секции для winforms), на такую-же из контейнера winforms.
У кого звуковая плата поддерживает, можно поставить 192 кГц на вывод звука, правда нагрузка на процессор незначительно выростет, поэтому для древних слабеньких машин не рекомендуется.
А начиная с версии 38158 устранен щелчек при запуске. Слабый щелчек все-же остался, но связан с тем что эмулятор AY использует весь диапазон 16 битной амплитуды, поэтому ноль у него не посредине, а в нижней части осциллограммы.
---------- Post added at 17:30 ---------- Previous post was at 15:45 ----------
Записал raw output эмулятора AY на деме BIN LOVE (в том виде как это идет на звуковую карту, до микширования с остальными девайсами).
Частота дискретизации: 192 кГц
Частота AY: 1750000 Гц
Панорама: ABC
Тайминги: Pentagon
Размер файла: 51 МБ в архиве, 237 МБ в распакованом виде
Запись в WAV без компрессии (чтобы сохранить все мельчайшие детали) скачать для изучения можно тут: https://drive.google.com/file/d/0B3U...ew?usp=sharing
Просьба сравнить с риалом, заценить качество эмуляции :)
Конфигурирование IoC это для программистов инструмент, для пользователей бесполезен, непонятен итд, нужно по человечески ini файл делать, либо GUI интерфейс который это месиво xml будет сам собирать и предлагать доступные варианты значений параметров.
Новый UI пока временно не добавляю, т.к. я хочу переделать его архитектуру, чтобы было проще добавлять новые контролы и скрины. Сейчас много зависимостей мешает это сделать, потихоньку от них избавляюсь.
Сейчас просто отвлекся на важные фичи - звук и синхронизация. От них многое зависит, поэтому начал с них.
Конфигурировать тут вобщемто ничего не нужно, достаточно заменить параметры :)
У кого есть ZX Spectrum 48 Late?
Запустите плиз этот тестик, спектакулятор на нем почемуто глючит - из отладчика по шагам показывает 33, а если запустить в нормальном режиме - показывает 0 :smile:
По всей видимости должно быть 33... Нашел тут ошибочку в ZXMAK2, но пока не уверен правильный ли фикс - нужно убедиться :)
Тест тут: minfo.tap.zip
Ну вот и зарелизил версию 2.9.1.38194 :)
Что нового:
- переработана звуковая подсистема, улучшена стабильность синхронизации;
- новая эмуляция AY8910 с оверсэмплингом и хорошим качеством звука;
- добавлена возможность менять частоту дискретизации при выводе звука на звуковую карту (пока без UI - только через unity.config, см. параметр sampleRate="44100" для HostSound_Mdx, обращу внимание что в unity.config два места где задается частота - в первом - для Windows, во втором для XNA4);
- добавлено сохранение загрузка частоты AY, панорамы (ABC, ACB, BAC, BCA, CAB, CBA, MONO) и пресет амплитуд AY (пока тоже без UI, редактировать можно в ZXMAK2.VMZ файле (см. аттрибуты для AY8910);
- исправлена длительность прерывания для Spectrum 48 late ULA;
- добавлена эмуляция ЦАП/микрофона на бипере (актуально для ZX48/128, они могут бипером выводить 2-разрядный звук);
- исправлен щелчек при запуске;
- исправлена ошибка возникавшая при попытка загрузить/сохранить блок данных в отладчике;
- исправлено зависание для XNA4 хоста;
- исправлены маски кое-каких портов для ATM & Scorpion конфигураций;
- исправлены небольшие лаги UI возникавшие в отладчике;
- улучшена буферизация звука, теперь вывод звука происходит без блокировок потоков - все lock убрал (используется concurrent синхронизация потоков), т.е. теперь поток проигрывания звука никогда не притормаживает поток UI, за счет чего улучшилась стабильность синхронизации от звука;
http://savepic.su/4895422.png
PS: частоту дискретизации для звуковой карты можно выбирать от 500 Гц, верхний предел ограничен возможностями звуковой карты, обычно это 44100 Гц или 192 кГц. Частота должна быть кратной 50.
Какие будут отзывы о новом звуке? :)
Звук хороший.
Но я пока что эмулем пользоваться не могу, в связи с его подтормаживаниями на моем Core 2 Duo 1.6Ггц. Т.е. занимает он по времени 30-50% быстродействия, но периодически корябается звук при любой синхронизации, хоть по видео, хоть по аудио. У того же Спекткакулятора звук всегда стабилен, хотя видео может терять кадры.
да, сейчас есть потеря времени на синхронизацию обновления экрана между потоком эмуляции и UI. Нотификация UI потока лочит поток эмуляции, поэтому он приостанавливается, пока UI не обработает WM_PAINT. Поэтому на слабых машинах UI может притормаживать поток эмуляции.
Пробовал вариант когда рендеринг полностью в отдельном потоке - на dlcorp с deathsoft тестили, UI конечно в таком случае уже особой роли не играет, окно стабильно продолжает обновляться даже если на тайтле кликнуть и синхра проще и легче для процессора становится. Но... обнаружились проблемы с поддержкой нескольких дисплеев. Если такое окно перетащить на второй дисплей, оно перестает реагировать на мышь (его даже ухватить за тайтл нельзя), хотя и продолжает прекрасно обновляться...
Проблема в том, чтобы максимально быстро уведомить UI поток о необходимости отрендериться, не задерживая при этом поток эмуляции. Думаю нужно еще покопать вариант с полным рендерингом в отдельном потоке - очень уж красиво работает - никакие UI манипуляции на рендеринг и эмуляцию не влияют :) Т.е. UI и эмуляция живут каждый своей жизнью :)
Разнесенную синхру (когда WaitFrame и PushFrame вызывались из потока эмуляции по отдельности устранил), теперь эмулятор просто кидает серию фреймов, а как их засинхронизировать с дисплеем и звуковухой уже дело хоста. Отдельные вызовы сильно усложняли синхронизацию.
Теперь думаю переделать сам хост, слишком много в нем накручено логики. Нужно проще делать :)
Логика как это должно работать уже понятна, осталось это реализовать. Копаюсь сейчас с возможностями Direct3D :smile:
PS: Ктото в шейдерах разбирается? :smile:
Думаю пора перейти на SlimDX, т.к. MDX устарел и в нем нет фишек от SlimDX. К тому-же SlimDX поддерживает x64 :)
Чего-то я в исходниках потерялся - наворочено всего :) Хотя, это скорее всего я сейчас не в форме.
ZXMAK, смотри. Есть такой старый эмулятор на C# + XNA - http://zx360.codeplex.com/
Там всё просто. Чтобы получить работающий спек под XNA нужно сделать несколько простых шагов.
1. using Core; Здесь всё :)
2. Spectrum spectrum = new Spectrum();
И всё :) В UPDATE - spectru.execute в DRAW spectrum.ScreenBuffer преобразуется в текстуру XNA (правда под XNA 4.0 нужно несколько изменить код, но не суть)
Внимание, вопрос - как по простому сделать также с ZXMAK2?
Т.е. создаём новый XNA проект, подключаем какие нужны для базовой функциональности классы, создаём спек, обновляем его в UPDATE и отрисовываем в DRAW. Т.е без хостов и прочего.
Есть пару идей, а вменяемый и обновляющийся эмуль на C# один твой :)
Так реализация под xna4 и так есть, причем со звуком. правда хост для него сыроват - плохо синхронизируется - запускаешь эмулятор с опцией командной строки /host:xna и все. Чтобы по дефолту xna запускался можно в unity.config прописать viewType="xna" вместо winforms.
UI под xna правда нету - просто окно, файлы можно через командную строку открывать
можно использовать DirectSound вместо XnaSound, для этого нужно в unity.config заменить регистрацию IHostSound в xna контейнере на аналогичную из winforms контейнера
Не знаю получится ли на xbox запустить, т.к. engine к файлы через System.IO читает, если будешь пробовать напиши какие референсы мешают я их уберу.
Пожелание к разработчику: сделать виртуальную клавиатуру не только для справки где какая кнопка, но чтобы можно было на ней мышкой нажимать кнопки.
Эмулятор просто отличный. Но есть еще несколько просьб:
1. В окне Debbuger у меня нет строки для ввода команды, хотя в хэлпе она упоминается. Версия эмулятора 2.9.1.
2. Клавиши на цифровой клавиатуре не работают (работают только /*-+ и ентер). Очень хотелось бы задействовать еще цифры и точку.
3. Выше уже упомянул: виртуальную клавиатуру было бы отлично сделать функциональной, чтобы можно было набирать мышкой (либо пальцем на сенсорном экране!).
4. Если это возможно, сделать функциональной клавишу Delete. По сути там комбинация вперед и Backspace. Но это существенно облегчило бы работу в редакторе Бейсика.
5. Задействовать следующие кнопки на клавиатуре: []{}\|~` - сейчас их нажатие никак не фиксируется.
6. CapsLock кнопка включает режим [E], а не [C]. Наверное, я много очень хочу, но не хватает кнопки Caps. Да и шифты я бы немного не так расположил: Shift левый и правый как Caps Shift, а оба Ctrl как Symbol Shift. В идеале сделать возможность настройки дополнительных клавиш, чтобы каждый как ему удобно разместил все шифты.
7. Добавить в деббагер функцию скопировать программу на Бейсике в буфер обмена, то есть чтобы в буфере был текст программы, который можно вставить, скажем, на форуме.
В общем с такими доработками, по моему мнению, эмулятор вообще будет просто идеальный.
P.S. Сейчас покопаюсь в конфигах эмулятора, может все это удастся сделать самому.
В общем, конфиг ничего не дал, нельзя одно и тоже действие повесить на разные клавиши клавиатуры. Либо я не понял как.
шифты и кнопки можно настроить в Keyboard.Mdx.config, а вот с несколькими кнопками на одну спектрумовскую, это действительно сейчас не получится, нужно будет мэппинг доработать :)
---------- Post added at 18:36 ---------- Previous post was at 18:34 ----------
это можно и не в дебаггер, только вопрос что делать если в памяти вовсе не бейсик программа, или программа немного покуроченная протектором
Идея такая:
<Key Name="CapsShift" Value="LeftShift RightShift" />
или
<Key Name="CapsShift" Value1="LeftShift" Value2="RightShift" />
То есть Name содержит описание спектрумкой кнопки (или комбинации), а Value содержит название кнопки на клавиатуре.
Если программа нормальная - копировать (или сохранять в .txt) нормальную программу, в противном случае как получится. Управляющие символы (цвета и прочее) просто исключить, оставив текст.
Автоматически и переводить по таблице. Там ведь их совсем не много, не проблема массив преобразования задать.
Тут еще какое удобство - можно распечатать программу, так проще будет в ней разбираться, чем на маленьком экранчике.
Я писал примитивный плагин для просмотра бейсик-программ http://zx-pk.ru/showpost.php?p=550932&postcount=642
Добавляется как отладчик. Только два года прошло, он уже не запускается, наверное - архитектура эмуля помнялась. Сам проверить пока не могу.
В общем, проблему копирования программы на Бейсики решил отдельной утилитой. Кому надо, она тут: http://zx-pk.ru/showthread.php?p=779873
Остальные вопросы остаются в силе.
проблема в том что не у всех спектрумов есть CapsShift :smile:
В конфигурации задаются просто имена реальных кнопок клавиатуры PC, но независимые от платформы, а в качестве значения указаны кнопки как они называются на конкретной платформе.
Эмулятор понятия не имеет что такое CapsShift, т.к. на клавиатуре PC такой кнопки нету.
Про эту кнопку знает только конкретный девайс клавиатуры.
Сделал тестовый рендерер на SlimDX, просьба проверить как себя ведет на разных машинах.
При запуске в окне должны плавно и попиксельно двигаться вверх разноцветные квадраты.
Для теста нужно поресайзить окно, посворачивать его, залочить/разлочить комп (Win+L) чтобы программа потеряла видеокарту ну и т.д.
Смотреть нужно - не вылезет ли ошибка и не остановится ли движение квадратов :)
Заодно просьба указать что за комп/система и насколько плавно плывут квадраты :)
К сожалению саму длл-ку SlimDX.dll приаттачить не могу, она в архиве занимает 800 килобайт - форум такой размер не пускает, но ее можно установить с официального сайта, отсюда: http://slimdx.org/download.php
Нужна версия которая .NET 4 / x86
полёт нормальный
Win 7 x64
http://i.imgur.com/ZCH375B.png
http://i.imgur.com/q1azRcE.gif
Core i7-3820, Win7 x64, GF FTX 760 - Ok
Просьба затестить эмулятор с новым алгоритмом для Direct3D рендерера.
Тестовую версию выложил тут: https://zxmak2.codeplex.com/releases/view/611440
Новый алгоритм юзает Direct3D в довольно жестком многопоточном режиме, поэтому нужно проверить как это будет работать на разных машинах.
В этой версии рендерер видео, рендерер аудио, эмуляция и UI - все живут в своих отдельных и независимых параллельных потоках :)
За счет этого стабильность видео вышла на новый уровень, сейчас сбои синхронизации возникают только когда происходит сброс direct3d (при ресайзе окна или потере видеокарты).
Реализация еще полностью не завершена, могут быть баги :)
Что нужно потестить - нормально ли работает (нет ли задержек и т.п.), как ведет себя при ресайзе, сворачивании окна, при блокировке экрана.
Что означает фраза "не лочицца"?
Кстати, очень интересно как на твоей особенной машине эта версия себя ведет?
PS: Релиз вроде стабильный получился, погонял - очень хорошо и плавно работает, нужно подчистить код и можно к видеофильтрам переходить. Для начала думаю неплохо будет blur, black-n-white, emboss и contrast :biggrin:
то и значит. галочку ставлю, мЫшкой дергаю, не размер,просто за окно, сразу меняет размер, ну и галка возле 400% пропадает, как при ресайзе..
с 300% такого фокуса нет.
Просто так. прикольное масштабирование иногда)
http://savepic.net/6387917.jpg[свернуть]
upd
с 1472х1216 сразу меняет на 1472х1002. само.
Хм, видимо баг с вычислением размеров, я правильно тебя понял, что при 400% размер окна сам уменьшается при движении мышью над окном?
Можешь еще снять скриншот с гафиком при синхронизации от времени? и скриншот от видео, но с нормальным размером окна.Чтото у тебя нестабильно vblank ловит. Это только при большом окне?
Теперь держит синхру в режиме по video так же стабильно, как и по audio. Т.е. таскаю окно с эмулем жестко, и почти не затыкается. При ресайзе да, затыкается. Так же, при работе в браузере может затыкаться, очевидно, из-за того, что ты своему эмулю не делаешь приоритет выше, чем у других приложений.
Слева вроде нормально, только смущают вот эти два пика, ты в это время по менюшке view не нажимал? Может ресайз делал или сброс?
А справа это с включеным фильтром noflick? Если да, то все ок :)
---------- Post added at 19:12 ---------- Previous post was at 19:02 ----------
Управлять приоритетом процесса, сам процесс не должен. Это параметр, которым должен управлять юзер. К тому-же во многих случаях у юзера может не быть привелегии на изменение приоритета, тогда процесс не сможет его изменить.
ZXMAK2 задает только относительные приоритеты своим потокам внутри процесса и в управление приоритетами системы не вмешивается, система лучше знает как ей распределить приоритеты. Эмулятор только подсказывает ей какой из его потоков более важный, а какой менее важный.
В том-то и дело, что она них хрена не знает)
Эмуляторы - это класс задач реального времени. Без повышения себе приоритета (не до RealTime, пускай, но хотя бы до High Priority), никак не возвыситься над другими нереалтайм задачами - браузерами и всякой другой офисноподобной, но жрущей время фигней.
Нужно ли повышать приоритет для эмулятра - это должен решать юзер, а не сам эмулятор. У юзера есть соответствующая менюшка в таск менеджере - кликаешь правой кнопкой по процессу и выбираешь ему приоритет.
Для управления приоритетами внутри процесса система предоставляет относительные приоритеты потоков. Однако я бы с осторожностью и к этим приоритетам относился. Как правило планировщик задач достаточно умен, чтобы правильно распределить время.
Поэтому ZXMAK2 использует управление приоритетами по минимуму - подсказывает планировщику что у этого потока приоритет лучше ставить чуть выше, а у этого чуть ниже, и не более.
Мои многочисленные тесты, только подтверждают это - любая попытка вмешательства в приоритеты приводит к нежелательным негативным эффектам. Приложение хорошо работает, только если не вмешивается в приоритеты потоков, не говоря уж о приоритетах процессов в системе.
Ну и кроме того, процесс, который попытается сам себе установить приоритет вылетит с ошибкой на многих системах, т.к. установка приоритета процессу - это административная привелегия. Это как разрешать какой-то программе переформатировать винчестер под себя, т.к. ей это "удобнее". Нужно ли переформатировать винчестер под конкретную программу или пусть она работает так - это решать владельцу машины, а не программе.
Если ты так щепетилен в этом ворпосе, то дай хотя бы юзеру методологию управлять этим приоритетом через твой эмуль (если ему приспичит). Чтобы юзер каждый раз не лазил в настройки процесса. Т.е. если юзер специально не хочет иной приоритет, ты его и не трогай. А если в конфиге все же юзер прописал иной, то имеет право.
А мой опыт тестирования эмуляторов показал, что управление приоритетом прекрасно везде работает. Ни один из пользователей EmuStudio, во всяком случае, никогда не говорил о проблемах с этим.