Реинициализация при смене дисплея
Никак не получаеться изменить режим работы с полноэкранногь на оконный, чуствую, что гдето туплю,
но где онять не могу :( может кто подскажет причину ?
Вот пример, программа запускаеться в окне, потом переходит в полноэкраннный, а потом опять в оконный
Что именно не работает?
Так на вскидку могу сказать - hDeviceWindow надо записывать в presentation paremeters после создания окна, а не до :)
Пересоздавать девайс не обязательно, лучше делать ему Reset.
Для фуллскрина ставь FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE (или D3DPRESENT_INTERVAL_ONE, чтобы делать верт. синхронизацию).
также лучше в фуллскрине SwapEffect ставить D3DSWAPEFFECT_FLIP.
Оконный режим жестко прописывать нельзя, потому что у юзера может на рабочем столе стоять как 16, так и 32 бита. Его надо брать функцией GetAdapterDisplayMode.
>> Что именно не работает?
не могу поменять режим работы с полноэкранного на оконный, а наоборот не работает
>> Пересоздавать девайс не обязательно, лучше делать ему Reset.
попробовал, никакой разницы :(
>> Оконный режим жестко прописывать нельзя
ну первый раз то он с этими параметрами запустился, а второй раз уже после полноэкранного не хочет :(
я так понимаю, что то не так делаю при переинициализации
неужели никто не пробовал менять полноэкранный режим на оконный ?
"переключение"
1. если мы в full-screen, выходим на раб. стол
2. убиваем окно, ре-регистрируем класс окна, сносим контекст рендеринга(если есть)
3. снова создаем окно
4. reset-им устройство D3D под нужный режим(g_presentationWin или g_presentationFull)
Как-то слишком сложно. В первый раз CreateDevice, потом Reset и все.
хм. сложно - но зато более безопасно ;)
Dark
Хы, дошло, почему у тебя не так как надо работает. Ты после фуллскрина не выставил окну размеры/положение. Надо после последнего пересоздания девайса воткнуть что-то вроде:
Ну плюс по идее неплохо-бы выставить нужные флаги и стили окну - вобщем, гляди примеры.
DagMen
Зачем такие сложности, обычный ресет вполне надежен..
сложновато как то :)
>> Хы, дошло, почему у тебя не так как надо работает. Ты после фуллскрина не выставил окну размеры/положение. Надо
>> после последнего пересоздания девайса воткнуть что-то вроде:
Помогите, что то я делаю не так, после того как я с окна переключаюсь на FullScreen отрисовка прекращаеться, черный крвадрат и все (
после прогона этого куска включается FullScreen но отрисовка прекращается
Возможно еще что-то стоит ресетнуть?
До перехода в FullScreen выводиться полигон оптянутый текстурой
Teranozavr_REX
Тебе необходимо восстанавливать все что было до ресета и не создавалось через менеджер.
и не создавалось через менеджер.
Через менеджер чего? :) Я понимаю что я еще зелен ) но про никакие менеджеры не слышал?
Тебе необходимо восстанавливать все что было до ресета
Например текстуру надо опять загружать из файла ?
Teranozavr_REX
Заново загружать текстуру или меш не нужно, нужно восстановить RenderStates и TextureStageStates.
И вот он я со своим баяном.
pDevice->SetSamplerState( 0, D3DSAMP_MINFILTER,pGraphSS->D3DTextureFlite);
pDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER,D3DTEXF_NONE);
pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
на сколько я понял с написаного выше все должно работать)
на практике
IDirect3DVertexBuffer9 *pVBuf
//Инизиализация до ресета
CreateVertexBuffer(. );
// ресет, и ближайший
FRAMEVERTEX* v;
pVBuf->Lock(0, 0, (void**)&v, 0))
Media Player Classic - Home Cinema
MPC-HC — бесплатный проигрыватель аудио и видеофайлов под Windows. Может использовать как встроенные кодеки, так и внешние DirectShow фильтры, QuickTime, RealMedia, ShockWave. Поддерживает DXVA. Есть русский интерфейс. Проект является развитием оригинального Media Player Classic от Gabest.
Об основных возможностях >>читать тут
Последняя официальная версия: 1.5.2.3456 (x86 / x64) 22.07.2011
Последняя бета-версия: 1.5.3.3757 (x86/x64) 12.10.2011
Другие ссылки:
— сплиттер для MKV, MP4, OGG/OGM, MPEG TS. Включает Haali Renderer.
— рендерер, нацеленный на максимальное качество воспроизведения.
(зеркало) — позволяет смотреть Smacker и Bink видео.
— определение возможностей видеокарты по декодированию видео.
— сплиттер на основе libavformat и набор декодеров.
— DirectShow-декодер видео, использующий возможности аппаратного декодирующего устройства (движка) NVIDIA из состава GPU посредством CUDA Video Decoding API ("CUVID"). C версии LAV Filters 0.36 LAV CUVID Decoder интегрирован в состав его компонента LAV Video.
— сплиттер с продвинутыми настройками. (тема на хоботе)
— инструмент для автоматического изменения частоты экрана в зависимости от видео.
Пока будет так - почему так, объяснять не буду . просто так надо. Либо убери галку в настройках - Вывод->Реинициализация при смене монитора.
А ты проверь - при полноэкранном режиме нажатие Win+D при вкл/выкл. этой опции.
Пока? То есть, в будущем исправите? Ибо это ужасно бесит во многих случаях. Иногда просто не успеваешь прочитать, что там выскочило в OSD, когда машинально переходишь в полноэкранный режим или наоборот
Честно говоря не могу понять что там может бесить, да и что надо видеть в OSD при переходе в олный экран и обратно . но в любом случае, починил.
Директор:
Наблюдалось что при наличии внешних воздействий (предположительно ЭМ помех), настройки экрана "портятся" что приводит к тому что изображение выводится не корректно.
Предлагается периодически инициализировать экран "заново".
Например в момент "просыпания".
История изменений (32)
comment:1 Изменён 4 года назад пользователем alx
Мне удалось найти в драйвере функцию fbtft_init_display(), при вызове которой дисплей инициализируется. Однако процесс инициализации дисплея длится почти 200 мс. Не помешает ли такое длительное занятие шины SPI работе установки (например опросу датчиков)?
Если нет, буду думать дальше - каким образом сообщить драйверу, что надо выполнить эту функцию.
comment:2 следующий: ↓ 6 Изменён 4 года назад пользователем san
Думаю что помешает.
comment:3 Изменён 4 года назад пользователем alx
Тогда есть вариант выполнять инициализацию при нажатии оператором какой-то определенной комбинации клавишь. Или, например, при длительном удержании какой-нибудь кнопки (например ОТМ).
comment:4 Изменён 4 года назад пользователем san
Наверное стоит обсудить это с директором, предложившим тикет.
comment:5 Изменён 4 года назад пользователем alx
comment:6 в ответ на: ↑ 2 Изменён 4 года назад пользователем alx
А, кстати, не мог бы ты более подробно написать, чему именно помешает?
comment:7 Изменён 4 года назад пользователем san
Например, при движении вверх за 200 мс. можно проскочить датчик, двигатели будут пытаться тащить шток который "встал на упор" и привод остановится по превышению нагрузки на штоке или по аварии ЧРП
comment:8 Изменён 4 года назад пользователем san
Есть предложение проводить реинициализацию экрана в определённый момент. Например когда привод не движется или сразу после начала движения, тогда, кажется эти 200мс. ничему особо не помешают
comment:9 Изменён 4 года назад пользователем alx
Согласен. Но вариант "ручной" инициализации мне тоже кажется полезным. Представь себе, что оператор работает с установкой, и вдруг дисплей "испортился" - отображает мусор. Без ручного сброса оператору придется ждать пять минут прежде чем он сможет продолжить работу. Вместо этого он мог бы, например, подержать "ОТМ" 5 секунд - и все.
comment:10 следующий: ↓ 11 Изменён 4 года назад пользователем san
Насколько я помню идея директора была в такой инициализации экрана "чтобы оператор ничего не заметил".
comment:11 в ответ на: ↑ 10 Изменён 4 года назад пользователем alx
В таком случае, предложение тикета нереализуемо.
comment:12 следующий: ↓ 17 Изменён 3 года назад пользователем andrei
А за RESET его подергать не достаточно?
Было бы хорошо на столе поймать этот баг.
comment:13 Изменён 3 года назад пользователем san
Так после резета, "настройки" дисплея сбросятся и без инициализации он корректно работать не будет.
comment:14 Изменён 3 года назад пользователем andrei
Если кабель DB-9/DB-9 соединяющий панель оператора с контроллером отключить и подключить обратно дисплей перестает отображать информацию. Ресетом вылечить не получилось. Перезагрузка процессора SAM5 помогает.
comment:15 Изменён 3 года назад пользователем andrei
Думаю, что с момента создания тикета баг побежден аппаратно.
А если случится "зависание" дисплея, то это будет очень редкий случай и поможет сброс питания.
Артем, твои соображения?
comment:16 Изменён 3 года назад пользователем san
Тикет создан мной по просьбе директора(смотри описание), предлагаю узнать что по этому поводу думает автор тикета.
comment:17 в ответ на: ↑ 12 Изменён 3 года назад пользователем alx
Поторопился я, оказывается, Саша уже ответил, почти теми же словами. :)
comment:18 Изменён 3 года назад пользователем andrei
Саша, раз уж ты от директора принес этот тикет, тебе и обсуждать с директором его актуальность.
А мы ждем решения.
comment:19 Изменён 3 года назад пользователем san
Директор добавлен в копию этого тикета.
comment:20 Изменён 3 года назад пользователем andrei
Директор подтвердил актуальность задачи.
Думаем.
Реализуем.
comment:21 следующий: ↓ 22 Изменён 3 года назад пользователем san
Если ты не заметил, мы зашли в тупик. Читай комменты.
comment:22 в ответ на: ↑ 21 Изменён 3 года назад пользователем alx
Если ты не заметил, мы зашли в тупик.
Как бывший руководитель группы разработчиков могу сказать, что именно в подобных случаях (когда группа заходит в тупик и не может принять решение) решение принимает руководитель. Насколько я понял, руководитель принял решение периодическую переинициализацию делать.
comment:23 Изменён 3 года назад пользователем san
Это я понял.
Но закончили мы диалог этим:
В таком случае, предложение тикета нереализуемо.
Это я и назвал тупиком, каким образом предлагается реализовать нереализуемое?
comment:24 Изменён 3 года назад пользователем alx
Под "таким случаем" подразумевалось и "чтобы оператор ничего не заметил", и чтобы задержка 200 мс ничему не помешала. С такими условиями задача, получается, нереализуема. Следовательно, необходимо чем-то пожертвовать: либо наплевать на возможность "проскочить" датчик положения, либо выбирать для инициализации дисплея "безопасный" с точки зрения работы датчиков момент (см. comment:8) или "оживлять" дисплей вручную (см. comment:3), при этом смирившись с тем, что это будет заметно для оператора.
comment:25 Изменён 3 года назад пользователем andrei
В тупик, Саша, ты сам это завел наводящими комментариями.
Только инициализация нас спасет? Сброс питания я пока не рассматриваю.
Тогда предлагаю два варианта инициализации дисплея: 1- Ручками, удерживая какую-либо кнопку. 2- Автоматически.
Если речь о 200 мс, то это не так страшно.
Можно инициализировать в автомате при выводе дисплея из "ждущего режима". Нужно понять когда это не помешает работе станции (а может придумать как обойти это и инициализировать с приоритетом ниже опроса датчиков).
А если он сломается в активном состоянии, то оператор подержит кнопку и оживит его.
comment:26 Изменён 3 года назад пользователем andrei
Сколько времени длится сработанное состояние датчика положения при наиболее быстром движении штока?
Наверно можно это посмотреть осциллографом в гтп.
comment:27 следующий: ↓ 28 Изменён 3 года назад пользователем san
инициализировать в автомате при выводе дисплея из "ждущего режима"
Я считаю что намеренно "тупить" 200 мс. в практически произвольный момент времени неправильно и даже опасно: решая мизерную проблему мы создаём потенциальную дыру в алгоритме.
У меня есть сильное подозрение что оператор , которому посчастливиться встретить этот баг, даже не будет знать/помнить, что есть такая волшебная кнопка, а просто сбросит питание контроллера и нашии усилия будут напрасными.
Ну и ручной сброс - это точно не то что хотел директор.
На мой взгляд Андрей и должен решить чем жертвовать.
comment:28 в ответ на: ↑ 27 Изменён 3 года назад пользователем andrei
это точно не то что хотел директор.
Не тебе это знать
На мой взгляд Андрей и должен решить чем жертвовать.
А это знать тебе, да.
comment:29 Изменён 3 года назад пользователем san
Андрей, хватит превращать тикеты во флуд.
comment:30 Изменён 3 года назад пользователем andrei
comment:31 Изменён 3 года назад пользователем san
5 месяцев прошло, Андрей, предлагаю закрыть как "не будем делать", аргументы уже приводил выше.
comment:32 Изменён 3 года назад пользователем san
Т.к. за время эксплуатации жалоб на "зависшие экраны" не поступало, директор предложил закрыть тикет.
Хотя технология DisplayLink имеет свои преимущества, она далека от совершенства, и время от времени могут возникать проблемы, которые могут доставлять вам неудобства, но не беспокойтесь, у нас есть несколько решений, которые могут вам помочь.
Многие пользователи используют технологию DisplayLink, но иногда могут возникнуть проблемы с DisplayLink. Что касается проблем, вот некоторые распространенные проблемы, о которых сообщили пользователи:
- DisplayLink не будет работать — если у вас возникла эта проблема, попробуйте переустановить драйверы DisplayLink и проверьте, помогает ли это.
- DisplayLink показывает только один монитор. Иногда DisplayLink может отображать только один монитор. В этом случае обязательно выберите параметр «Расширить» в настройках дисплея.
- DisplayLink HDMI не работает — иногда HDMI не работает с монитором DisplayLink. Если это произойдет, обновите все ваши драйверы и проверьте, решает ли это проблему.
- Видео DisplayLink не работает — эта проблема может возникнуть, если вы используете соединение USB 2.0. Если можете, переключитесь на порт USB 3.0 и проверьте, сохраняется ли проблема.
- Черный экран DisplayLink — эта проблема может появиться из-за функции Nvidia Share, но как только вы ее отключите, проблема должна быть решена.
Решение 1. Переустановите драйверы DisplayLink
Пользователи сообщали об ошибках Blue Screen of Death при использовании двух или более мониторов на своих ПК, и в этом случае причиной проблемы обычно является драйвер DisplayLink, поэтому давайте попробуем переустановить его:
Решение 2. Установите флажок Расширить эти дисплеи
Пользователи сообщили, что их дисплей не отображается в настройках дисплея после того, как они отключили его. Это нормальное поведение, когда вы выбираете Показать только на 1 или на любом другом мониторе в настройках дисплея. Эта опция используется, когда вы хотите работать только на большом дисплее, но вы не сможете увидеть дополнительные мониторы в настройках дисплея.
Чтобы решить эту проблему, вам просто нужно установить флажок «Расширить эти дисплеи» в настройках дисплея и нажать «Применить», чтобы сохранить изменения.
Решение 3 — Используйте кабель USB 2.0 или порт USB 2.0
Пользователи также сообщают о некоторых проблемах с док-станциями USB DL-3xxx и DL-5xxx. По их словам, если вы используете кабель USB 3.0, у вас могут возникнуть некоторые проблемы со звуком. Следует отметить, что эта проблема касается только воспроизводящих устройств, таких как наушники, динамики и мониторы, которые подключены к док-станции.
Насколько нам известно, эта проблема вызвана проблемным драйвером USB 3.0 в Windows 10 , и в настоящее время обходной путь заключается в том, чтобы использовать кабель USB 2.0 для подключения док-станции к компьютеру или использовать вместо него порт USB 2.0.
С другой стороны, у некоторых пользователей были проблемы с DisplayLink при использовании соединения USB 2.0. После подключения монитора к порту USB 3.0 проблема была полностью решена, и все снова заработало.
Решение 4. Используйте параметры экрана для изменения разрешения
В некоторых случаях пользователи не могут изменить режим отображения или разрешение своего внешнего монитора с помощью меню значков DisplayLink. Это не такая большая проблема, но в Windows 10, чтобы изменить разрешение экрана внешнего монитора, вы должны использовать настройки дисплея из Windows 10.
Решение 5 — Зеркальное отображение основного дисплея
Пользователи также жалуются на то, что они не могут войти в режим планшета, когда подключены внешние мониторы, и это нормальное поведение, когда внешние мониторы расширяют основной дисплей. Чтобы войти в режим планшета, внешние мониторы должны отражать основной дисплей.
Решение 6 — Запустите средство устранения неполадок
Если у вас есть проблемы с DisplayLink, проблема может быть в вашей системе. Тем не менее, Windows поставляется со встроенными средствами устранения неполадок, которые могут решить эту проблему для вас. Чтобы решить эту проблему, вам просто нужно запустить встроенное средство устранения неполадок, выполнив следующие действия:
После завершения устранения неполадок проверьте, сохраняется ли проблема с монитором DisplayLink. Имейте в виду, что это не самое эффективное решение, но немногие пользователи сообщили, что оно работает для них, поэтому обязательно попробуйте его.
Решение 7 — Отключить функцию Nvidia Share
По словам пользователей, проблемы с DisplayLink могут возникать из-за функции Nvidia Share. Если вы не знакомы, это накладка Nvidia, которая позволяет создавать видеозаписи и снимки экрана во время сеансов игры.
Хотя эта функция полезна, иногда она может вызывать проблемы с DisplayLink, и единственный способ решить эту проблему — полностью отключить Nvidia Share. Для этого выполните следующие действия:
После этого проблема должна быть полностью решена. Имейте в виду, что вам необходимо постоянно отключать эту функцию, если вы хотите избежать любых будущих проблем с DisplayLink.
Решение 8. Обновите драйверы DisplayLink
В некоторых случаях, чтобы решить эту проблему, вам просто нужно обновить драйверы DisplayLink. Для этого просто скачайте последнюю версию драйвера с веб-сайта DisplayLink и установите его. Как только ваши драйверы обновлены, проблема должна быть окончательно решена.
Загрузка драйверов вручную может быть немного утомительной задачей, но вы можете легко обновить все ваши драйверы автоматически с помощью TweakBit Driver Updater . Просто запустите этот инструмент, и пусть он загрузит и обновит все ваши драйверы для вас.
Как только ваши драйверы будут обновлены, проблема должна быть полностью решена. В дополнение к драйверам DisplayLink некоторые пользователи также рекомендуют обновить драйверы чипсета, поэтому обязательно сделайте это.
Решение 9. Удалите драйвер DisplayLink и снова подключите док-станцию
В некоторых случаях вы можете решить проблему, просто удалив драйвер DisplayLink. Для этого просто перейдите в раздел « Приложения » в приложении «Настройки» и удалите драйвер DisplayLink.
После этого вам необходимо отключить док-станцию, выключить ее, подождать несколько минут и снова подключить. После подключения док-станции требуемый драйвер будет установлен автоматически, и проблема должна быть решена.
Решение 10. Обновление драйверов универсальной последовательной шины
В некоторых случаях проблемы с DisplayLink могут возникать из-за проблем с драйверами универсальной последовательной шины. Чтобы устранить проблему, вам просто нужно обновить драйверы до последней версии и проверить, решает ли это проблему. Для этого выполните следующие действия:
После обновления всех драйверов универсальной последовательной шины проблема должна быть полностью решена. Если проблема с DisplayLink все еще существует, вы можете решить проблему, просто переустановив драйверы контроллера универсальной последовательной шины. Для этого выполните следующие действия:
Это простое решение, но оно может работать для некоторых пользователей, поэтому обязательно попробуйте его.
Это все, я надеюсь, что эта статья помогла вам решить проблему с разъемом DisplayLink в Windows 10. Если у вас есть какие-либо комментарии или вопросы, просто запишите их ниже.
Примечание редактора : этот пост был первоначально опубликован в феврале 2016 года и с тех пор был полностью переработан и обновлен для обеспечения свежести, точности и полноты.
Добрый день! Искренне благодарю разработчиков SVP за такую великолепную софтину, пользуюсь Вашим продуктом давно , с удовольствием и рекомендую знакомым!
К делу..
Всё работало отлично на предыдущей версии SVP , но лучшее враг хорошего, увы, решил я обновиться и установил новую версию 3.17, а после и только что ставшую доступной 4.0 (билд 25).
SVP работает отлично пока видео находится в оконном режиме, но стоит его развернуть в полный экран, начинаются тормоза . В видео плеере включаю тест ctrl+j и вижу что всё идёт гладко, красиво и с запасом по производительности, однако, при переводе проигрывателя в полноэкранный режим, fps проседает, начинает колебаться в большой амплитуде, картинка замедляется, как будто несколько кадров показывает нормально, а потом как будто slow motion включается и звук тоже в такт картинке искажается ("рвётся"). Устанавливая версию 4.0 надеялся от этих странностей избавиться, но они остались. Пока была установлена версия 3.17 были автоматически определены профили в которых максимальное разрешение было 1980х1920х24 фпс. Это не верно, поскольку мой монитор имеет родное разрешение 2560х1440, с частотой 144hz (Acer xb270hu). При попытке задать профиль с этим разрешением самостоятельно, профиль создался и отобразился, но вот ни разу не был задействован, всегда по умолчанию идёт именно fullhd.
Кстати с предыдущей версией (имеется виду версия до 3.17) проблемы такого рода не было, т.е. я спокойно открывал видео на разрешении 2560х1440 и смотрел его на 144 кадрах которые выдаёт монитор.
Техническая информация: Компьютер мощный 6 ядер (12 с гипертрейдингом), памяти много 32Гб, видюха GTX 980, вобщем производительности хватает с запасом, комп почти "отдыхает" выдавая 144 фрейма в секунду, и всё бы прекрасно, если бы не эта ложка дёгтя в бочке мёда.
Друзья, пожалуйста помогите решить эту досадную техническую проблему.
Резюмирую. SVP работает корректно в оконном режиме видеоплеера, но тормозит при переходе в полноэкранный режим, который по размеру больше fullhd , а именно wqhd 2560х1440.
2 Reply by MAG79 05-09-2015 08:16:59
Видимо, видеокарта не тянет все включенные улучшалки качества видео в отрисовщике madVR. Надо настроить madVR. Или временно сменить его на EVR.
Читайте также: