Распараллеливание эмуляции не такая простая задача, как кажется.
Единственная идея была- все влияющие на звукогенерацию выводы в порт ставить в очередь вместе с временнОй меткой и рендерить либо в конце фрейма (для однопоточного режима) либо по мере поступления (для двухпоточного, но возможны затраты на синхронизацию).
Например, вот как делается рендеринг AY в ZXTune.
На вывод в порт зовется метод:
Т.е. ничего не делаем, просто ставим в очередь.Код:virtual void RenderData(const DataChunk& src) { BufferedData.Add(src); }
Когда у нас конец фрейма, можно проанализировать очередь и выбросить всякие левые устройства (например, не было вывода в порт ковокса, нафига его микшировать?). Потом просто все элементы очереди обрабатываются:
гдеКод:void RenderChunks(Renderer& render) { for (const DataChunk* it = BufferedData.GetBegin(), *lim = BufferedData.GetEnd(); it != lim; ++it) { RenderSingleChunk(*it, render); } BufferedData.Reset(); }
Код:void RenderSingleChunk(const DataChunk& src, Renderer& render) { render.SetNewData(src); if (!Clock.HasOutputBefore(src.TimeStamp)) { return; } Clock.SetFrameEnd(src.TimeStamp); MultiSample result; while (const uint_t toEnd = Clock.GetTicksToFrameEnd()) { const uint_t toSound = Clock.GetTicksToSample(); const uint_t toTick = 1 + std::min(toSound, toEnd); render.Tick(toTick); if (Clock.Tick(toTick)) { render.GetLevels(result); Target->ApplyData(result); } }
По ходу, для потоков надо всё переделывать.
Созданный с pthread_create поток помирает, когда вызываший его метод заканчивает работу, даже если сам pthread_t определен вне этого метода? Например, внутри обработчика таймера я создаю поток, обновляющий окно. Некоторое время он работает, но потом вдруг перестаёт - экран не обновляется, хотя звук идёт.
Все любят гипножабу
Вставлю свои 10 копеек. Сделал я в SDL выводе заодно и заливку в файл. Вот что происходит если нет никакого звука:
Это генерит конкретно вот этот вот кусок кода:Код:00083D14 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083D40 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083D6C 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083D98 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083DC4 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083DF0 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083E1C 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083E48 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083E74 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083EA0 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083ECC 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00083EF8 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F │ 3F 3F 3F 3F ???????????????????????????????????????????? 00
У меня появилось сильностойкое подозрение что проблема в 8-битном звуке. Попробую переделать на 16 бит и посмотреть.Код:gsPair gsvol = gsGetVolume(zx->gs); levl += gsvol.left * gsVolume / 100.0; levr += gsvol.right * gsVolume / 100.0;
build 20130115
- Вернул формирование звука обратно
- Заодно избавился от щелчков в некоторых случаях (смена состояния паузы эмуляции)
- Вроде, получилось вывести обновление окна в отдельный поток, осталось получше подобрать время задержки между проверками сигнала на обновление
А 8-битный звук у меня был с самого его появления. Раз раньше играло ровно, то проблема все-таки не в этом.
[ deb x86 ][ win32 ]
жуки
- при изменении палитры (ATM2, Evo) рушится (фикс залит на гитхаб). Дело сугубо SDL-овое, из-за смены палитры. Собранных файлов выше не касается.
Последний раз редактировалось SAM style; 21.01.2013 в 22:20.
Все любят гипножабу
Попытался запустить в режиме пентагона, но на этапе подстановки ромов стал в ступор: как их правильно расставить? Что значат эти пейджи и цифирьки рядом?
И кста обидно, что нужно диски заново подставлять в тырдос - не запоминает на выходе...
Последний раз редактировалось mungo; 07.02.2013 в 10:54.
Сомневаюсь, и вам советую!
*.rom - файлы лежат в ${CONFIGDIR}/roms. ${CONFIGDIR} - директория конфигов, зависит от оси и указана в первом посте темы.
Обычно страницы распределены так:
Page0 - бейсик-128
Page1 - бейсик-48
Page2 - теневое ПЗУ
Page3 - TRDOS
Цифры справа от названия файлов - это номер части. 0 значит, что берутся первые 16К из файла, 1 - 16К начиная со смещения 16К, 2 - 16К начиная со смещения 32К итд.
Если файл ПЗУ собран в один (64К, 128К итд), его можно указать как single file - тогда первые 16К файла пойдут в Page0, вторые - в Page1 итд до конца (максимум 512К)
Все любят гипножабу
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)