Idirect3ddevice9 reset error mta

Direct3ddevice9 reset error 8007000e [Info] ВАЖНО! Перед тем как написать сообщение, внимательно прочтите: Основные процедуры устранения ошибок в MTA SA 1. Переустановите MTA SA используя самую последнюю версию мода, при установке выберите запуск от имени администратора.2. Переустановите GTA SA с нашего сайта, важно что бы она была чистая без модов.3. Переустановите (обновите) DirectX, visual […]

[Info] ВАЖНО! Перед тем как написать сообщение, внимательно прочтите:
Основные процедуры устранения ошибок в MTA SA

1. Переустановите MTA SA используя самую последнюю версию мода, при установке выберите запуск от имени администратора.
2. Переустановите GTA SA с нашего сайта, важно что бы она была чистая без модов.
3. Переустановите (обновите) DirectX, visual c++, .NET Framework, драйвера на видеокарту, звуковые драйвера.
4. Отключите все лишние фоновые программы, особенно антивирус или брандмауер.
5. Важно что бы в папке куда вы устанавливаете GTA и MTA не было кириллических символов, только латинские, например C:GamesGTA это правильно, а вот так не правильно C:игрыгтамта
6. Переустановите МТА на другой системный диск (если есть) или другую директорию, например если у вас диск поделён на два раздела, установите МТА не на системный раздел. И лучше всего в корень диска, например D:MTA San Andreas 1.5
7. Если у вас ошибка при подключении к серверам, а интернет подключен через роутер, то скорее всего виновен именно роутер, для выяснения причины попробуйте подключится к интернету без него, или через смартфон.
8. Иногда помогает снижение графики в игре или удаление файла gtasa.set (DocumentsGTA San Andreas User Filesgtasa.set)
9. Проверьте свой компьютер на наличие вирусов, посторонних программ, шпионского ПО.
10. Если вы когда либо пользовались читами (трейнерами) удалите их, например ArtMoney, Cheat Engine, Injector, Jads и тп
11. Возможно стоит поэкспериментировать с режимом совместимости файлов Multi Theft Auto.exe и gta_sa.exe выставить например совместимость с Windows XP.
12. Если у вас проблемы с каким то определенным сервером, то попробуйте подключится к дефолтному серверу МТА (Default MTA Server) который без модов (см. скриншот)[/Info]

[Info]Совет: Если какая либо ошибка (вылет, зависание и тп.) возникает только на одном из серверов, а остальные работают нормально, следовательно это проблемы конкретного сервера, решение: связывайтесь с админом данного сервера (наверняка есть группа ВК или сайт) не надо оставлять сообщения на этом форуме если у вас проблемы с одним сервером, в крайнем случае играйте на другом. [/Info]

При обновлении Windows 7, есть шанс столкнутся с ошибкой 8007000E.

Чаще всего она связана с отсутствием необходимого обновления KB3083324 для Центра обновлений Windows.

Для того, чтобы скачать и установить обновление для Windows 7 под номером KB3083324, нужно просто перейти по следующим ссылкам (ссылки взяты с официального сайта Microsoft):

После установки обновления нужно запустить поиск обновлений по новой и попробовать установить их.

    • Вадим

    • 04.08.2022 11:58

    Супер, нужно было обновление на виндовс 7, нигде нет, сама не обновляет пишет данную ошибку, с офф сайта, ничего не качает, там открывается всплывающие окно очень узкое, и только крестик стоит и всё. Спасибо!

    Спасибо, теперь смогу нормально ставить обновления на компьютер)

    Интересно, а сколько примерно занимает поиск обновлений?

    По моему опыту, обычно данное время равняется от получаса до нескольких часов.

    Искренне от всей души благодарю за данную статью! Проблема решилась, все супер, компьютер наконец-то может обновить все свои штучки.
    Спасибо!

    офф сайт не пашет ничерта

    Если не удается скачать с официального сайта, попробуйте скачать нужное обновление с торрент раздачи.

    Источник

    ИСПРАВЛЕНИЕ: Не удалось создать D3D, ошибка устройства D3D9 [Steam Games]

    Ошибки при запуске — слишком привычное явление для геймеров, как будто игра чувствует наше желание играть и отказывается дать нам то, что мы ищем. Так обстоит дело с Failed to create D3D device или менее распространенным, но не менее раздражающим Failed to create D3D9 device error .

    Обе эти ошибки сообщают игроки, запускающие игры через Steam, и, похоже, они касаются только нескольких игр:

    • Left 4 Dead 2
    • CS: GO
    • Borderlands 1 и 2
    • Портал
    • Ракетная лига

    К счастью, для исправления ошибок D3D и D3D9 необходимо выбрать один и тот же путь, поскольку они имеют общую причину. Основная причина связана с графикой, в частности с драйвером видеокарты.

    Мы предпримем обычные шаги по устранению неполадок, когда вы увидите эти ошибки.

    Как исправить ошибку «Не удалось создать устройство D3D или D3D9»?

    1. Перезагрузите компьютер.

    • Перейдите в Пуск> Питание> Перезагрузка.

    Вы пробовали выключить и снова включить? Есть причина, по которой айтишники говорят это все время. При большинстве ошибок первое, что вы должны сделать, это перезагрузить устройство.

    Это очистит память и даст вашей системе возможность перезагрузить все файлы, необходимые для работы.

    Процесс перезагрузки стирает текущее состояние программного обеспечения, что во многих случаях является всем, что нужно для устранения ошибок.

    2. Проверьте целостность файлов игры.

    1. Щелкните правой кнопкой мыши проблемную игру
    2. Перейти к свойствам
    3. Перейдите на вкладку Local Files.
    4. Нажмите на Проверить целостность файлов игры.

    Valve любезно добавила в Steam возможность проверять, не были ли файлы вашей игры каким-либо образом повреждены или что-то отсутствует в каталоге установки игры.

    Это может помочь, если ваше антивирусное или антивредоносное программное обеспечение решило заблокировать файл или поместить его в карантин.

    Если ошибка « Не удалось создать устройство D3D» или «Устройство D3D9» было вызвано ошибкой графического драйвера, перезапуск системы может решить проблему.

    Steam не отвечает на вашем ПК? Попробуйте эти простые решения

    3. Обновите Windows до последней версии.

    1. Откройте настройки (сочетание клавиш Win + i)
    2. Перейти к обновлению и безопасности
    3. Нажмите Проверить наличие обновлений

    Постоянное обновление вашей операционной системы Windows важно, потому что вы извлекаете выгоду из последних исправлений ошибок и обновлений безопасности.

    Иногда эти обновления включают исправления совместимости, которые могут исправить такие ошибки, как « Не удалось создать устройство D3D» или « Ошибка создания устройства D3D9» .

    4. Обновите графические драйверы.

    Для видеокарт nVidia:

    1. Открыть GeForce Experience
    2. Перейдите на вкладку Драйверы
    3. Нажмите на проверки обновлений с
    4. Как только новый драйвер будет найден, нажмите Экспресс-установка или Выборочная установка.
    5. Перезагрузите компьютер

    Для видеокарт AMD:

    1. Щелкните правой кнопкой мыши на рабочем столе
    2. Выберите программное обеспечение AMD Radeon
    3. В разделе «Драйверы и программное обеспечение» нажмите » Проверить наличие обновлений».
    4. Установите новый драйвер и перезагрузитесь

    Один из лучших способов исправить ошибку «Не удалось создать устройство D3D или D3D9» — это обновить драйвер видеокарты.

    Эти ошибки вызваны проблемой с видеокартой или ее драйвером, поэтому в большинстве случаев решением будет обновление драйвера.

    Чтобы сделать еще один шаг вперед, мы настоятельно рекомендуем выполнить чистую установку графического драйвера или использовать такую ​​утилиту, как DDU, для полного удаления графического драйвера перед установкой нового.

    Примечание. Если вы используете DDU для удаления графического драйвера, вам необходимо перейти на веб-сайт производителя видеокарты и вручную загрузить драйвер или графическое программное обеспечение (GeForce Experience или AMD Adrenalin).

    Не знаете, как использовать DDU? Нет проблем, у нас есть руководство, чтобы показать вам.

    5. Установите параметры запуска игры.

    • Открыть Steam
    • Щелкните игру правой кнопкой мыши
    • Выбрать свойства
    • На вкладке «Общие» выберите « Установить параметры запуска».
    • Тип -w 1920 -h 1080
    • Нажмите ОК > Закрыть
    • Запустить игру

    Примечание: вместо 1920 и 1080 используйте собственное разрешение вашего монитора.

    Это заставит игру запуститься с указанным разрешением. Поскольку некоторые из этих игр немного старше, они не всегда работают с новым оборудованием и более высокими разрешениями.

    Это может вызвать проблему, когда игра пытается запустить с низким разрешением, поэтому вам нужно будет принудительно установить желаемое разрешение.

    6. Запускаем игру в режиме совместимости.

    1. Перейдите в папку с установкой игры (щелкните игру правой кнопкой мыши в Steam> Управление> Обзор локальных файлов )
    2. Щелкните правой кнопкой мыши исполняемый файл
    3. Выбрать свойства
    4. Перейдите на вкладку » Совместимость».
    5. Либо запустите средство устранения неполадок совместимости, либо установите флажок и вручную выберите старую версию Windows для запуска игры.

    После того, как вы включили режим совместимости, вы сможете запустить игру, и это должно очистить ошибку Failed to create D3D or D3D9 device .

    7. Включите службы для исправления ошибки «Не удалось создать устройство D3D».

    Откройте окно запуска (сочетание клавиш Win + R)

    1. Введите msconfig
    2. Перейдите на вкладку Services
    3. Убедитесь, что все сервисы nVidia или AMD включены
      • Примечание. Если вы не знаете, какие это службы, нажмите « Включить все».
    4. Перезагрузите компьютер

    В погоне за большей производительностью некоторые пользователи отключают определенные службы, которые они считают несущественными, но мы не можем не подчеркнуть этого достаточно: вы никогда не должны отключать их, если вы не вносите 100% изменений, поскольку это может привести к сбоям игры или даже хуже того, нестабильность системы.

    Эти исправления помогут вам исправить ошибки «Не удалось создать устройство D3D» и «Не удалось создать устройство D3D9» при запуске игр в Steam.

    Если у вас возникнут другие проблемы с играми Steam, сообщите нам об этом в разделе комментариев ниже.

    FAQ: Проблемы с устройством D3D или D3D9

    • Что такое ошибка устройства D3D?

    D3D (Direct 3D) — это компонент DirectX API, который ваша система использует для визуализации графики. Если у вас возникли проблемы с D3D, это руководство покажет вам, как их исправить. Для получения дополнительной информации о Direct3D ознакомьтесь с нашей подробной статьей.

    • Что означает ошибка D3D?

    Когда вы получаете сообщение об ошибке D3D, это означает, что у вас проблема с графическим адаптером. Чтобы узнать, как ее исправить, выполните действия, перечисленные выше.

    • Как исправить ошибку D3D CSGO?

    Обновите графический драйвер до последней версии, затем следуйте инструкциям из этого руководства.

    Источник

    Ошибка «Не удалось обнаружить устройство Direct3D»: причины и способы устранения

    Рост производительности компьютеров – благо, которое многими воспринимается как должное. Но какой бы частотой не обладал центральный процессор или GPU, без соответствующего и, нужно сказать, очень сложного программного обеспечения, добиться высокой скорости работы ресурсоёмких приложений не удастся. Особенно это касается программ работы с видео и компьютерных игр. API-интерфейс Direct3D как раз и является таким промежуточным звеном, позволяющим проявить все достоинства современных видеокарт и процессоров.

    Увы, как и любое другое сложное ПО, Direct3D не лишено багов, которые могут проявляться весьма неожиданно. Например, при запуске приложения, использующего этот графический API, могут появляться различные ошибки. Сегодня мы поговорим об одной из них – «Не удалось обнаружить устройство Direct3D».

    Основные причины возникновения ошибки в играх

    Чаще всего с нею сталкиваются геймеры, ведь именно в компьютерных играх достоинства графического интерфейса прикладного программирования проявляются ярче всего. И если при запуске Dota 2, «Глаза дракона» или «Ведьмака» появляется ошибка «Не удалось обнаружить устройство Direct3D», поиграть не получится.

    Критично ли это? Не слишком, если знать причину. А они бывают разными:

    • драйвер видеокарты устарел или повреждён;
    • установлена версия DirectX, не соответствующая рекомендуемым требованиям;
    • игра несовместима с установленной операционной системой;
    • сбой настроек видеокарты в BIOS;
    • потеря важных файлов, входящих в пакет Steam;
    • воздействие вирусов.

    Если при запуске игры комп выдаёт ошибку Failed to initialize Direct3D, причины будут примерно одинаковыми, как и способы их устранения. Обычно в результате экран игры становится чёрным, а если окно свернуть, то можно увидеть окно с ошибкой.

    Первое, что необходимо сделать – проверить, соответствуют ли характеристики железа системным требованиям конкретной игры. Для примера рассмотрим уже упоминавшуюся Dota 2, для которой требуется CPU с тактовой частотой от 3 ГГц, видеокарта, совместимая с DirectX 9, поддерживающая Shader Model0 ATI X800 с памятью объёмом не менее 256 МБ, 1 ГБ ОЗУ, 10 ГБ свободного пространства на диске и скорость интернета не ниже 1 Мб/сек.

    Просмотреть параметры своего ПК и графической подсистемы можно набрав команду dxdiag в консоли «Поиск» или «Выполнить» или через «Диспетчер устройств».

    Как исправить ошибку Direct3D

    Если с системными требованиями всё в порядке, а геймеры обычно смотрят на это в первую очередь, то следует предпринять несколько шагов, один из которых с высокой вероятностью поможет устранить проблемы Direct3D в играх и других использующих этот API программах.

    Обновление DirectX

    При установке Windows 10 вы можете не беспокоиться, что получите устаревшую версию DirectX, но с «семёркой» такая уверенность будет излишней, поскольку вы, скорее всего, будете использовать образ, созданный достаточно давно.

    Проверить, какая версия используется на вашем ПК, можно с помощью описанной выше команды dxdiag. Данные о версии DirectX находятся во вкладке «Сведения о системе».

    Если номер версии меньше 12, рекомендуется обновить DirectX – скачать инсталлятор или использовать веб-установщик. Установка стандартная, нужно просто следовать подсказкам. Единственный нюанс – рекомендуем не ставить галочку для установки панели Bing.

    Обновление драйвера видеокарты

    При установке Windows 7 не факт, что вы получите самый свежий драйвер графического адаптера. В «Десятке» драйверы вообще от Microsoft, а не от производителя. Так что при появлении ошибки Direct3D не исключено, что виновником является устаревший или испорченный драйвер видеокарты.

    В Windows 10 перезагрузка видеодрайвера осуществляется достаточно просто, нажатием комбинации Win + Ctrl + Shift + B. Когда дисплей потухнет на секунду (а может, и несколько раз) – это нормально, пугаться не стоит. Если перезагрузка не помогла, драйвер видеокарты нужно обновить.

    • в консоли «Выполнить» набираем devmgmt.msc, чтобы запустить «Диспетчер устройств»;
    • ищем строку «Видеоадаптеры», раскрываем её и смотрим, нет ли слева от названия графического акселератора серой пиктограммы. Если есть, видеоадаптер банально отключен. Это означает, что вы запускаете игру на встроенной в CPU графической подсистеме, которая, конечно же, имеет слишком слабые характеристики по производительности;
    • кликаем по строке ПКМ и выбираем пункт «Включить»/«Задействовать»;
    • включить производительный видеоакселератор можно и посредством контрольной панели от производителя, иконка которой обычно висит в трее;
    • если включение видеокарты не помогло, в том же диспетчере после нажатия ПКМ выбираем пункт «Удалить». После подтверждения устройство исчезнет из списка, а драйверы будут деинсталлированы;
    • теперь самое время зайти на официальный сайт производителя и скачать самую свежую стабильную версию драйвера (вариантов немного – Intel, Nvidia или AMD), выбрав свою модель графического адаптера, если она не определилась автоматически;
    • запустите инсталлятор, дождитесь окончания установки «дров», перезагрузите компьютер.

    Переустановка Visual C++ Redistributables

    Как ни странно это звучит, но ошибка Direct3D при запуске игры может возникать и при появлении проблем с библиотекой Visual C++, которая является обязательной компонентой Windows – её используют очень многие приложения.

    Ошибка устраняется переустановкой пакета. Скачиваем с официального сайта Microsoft самую свежую версию пакета, удаляем библиотеку из вкладки «Программы и компоненты» «Панели управления», запускаем скачанный инсталлятор. После установки перезагружаем ПК.

    Используем режим совместимости

    Не исключён вариант, что ошибка Direct3D появилась вследствие запуска старой игры на современном компьютере, особенно часто такое случается в «десятке».

    Проблема устраняется следующим образом:

    Если сделать предположение, что вы не знаете, какая версия ОС является текущей, а какая предшествующей, можно поступить следующим образом:

    Включение видеокарты в BIOS

    Геймеры – народ прогрессивный, с вероятностью 98% на их компьютере установлена внешняя дискретная мощная видеокарта. О том, что нужно использовать именно этот адаптер, а не более слабый встроенный, операционная система узнаёт из BIOS. Но настройки BIOS иногда «слетают», и если поддержка внешнего видеоадаптера оказывается отключённой, ошибке «не удалось найти устройство Direct3D» удивляться не стоит.

    Нужно просто зайти в BIOS и исправить ситуацию, активировав использование дискретной видеокарты. Как это сделать, мы описывать не будет по простой причине: версий микропрограммы существует немало, и в каждой включение внешней видеокарты осуществляется по-своему. Читайте инструкцию для вашей материнской платы, хотя минимальных знаний английского достаточно, чтобы выполнить эту операцию без подсказок.

    Проверка целостности файлов (Steam)

    Многие современные игры используют платформу Steam, и если с одной из её компонент произошла непредвиденная ситуация, то игра не запустится. Проблема устраняется легко, непосредственно из клиента – нужно использовать функцию проверки целостности пакета файлов, и если чего-то недостаёт, здесь же можно устранить неисправность.

    Устранение вирусной угрозы

    Проникновение на компьютер вируса может иметь самые непредсказуемые последствия, в том числе повреждение файлов DirectX. Переустановка пакета в подобных случаях чаще всего не помогает, ведь вирус никуда не делся.

    Ошибка инициализации Direct3D с текущими настройками

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

    Но есть и различия: данная ошибка обычно более информативна.

    Например, если сообщение имеет вид «Failed to initialize D3D11», из этого можно сделать вывод, что запускаемая игра требует наличия одиннадцатой версии Direct3D, а ваша видеокарта поддерживает более раннюю. Здесь ничего не поделаешь – нужно либо отказаться от игры, либо менять видеоадаптер.

    Сообщение «Direct3D 9 device initialization error» из той же серии, указывает на необходимость поддержки 9 версии API.

    Устаревший или запорченный драйвер видеокарты – тоже частая причина возникновения ошибки «Can’t init Direct3D», устранить которую можно переустановкой «дров» по алгоритму, описанному ранее.

    Точно так же происходит при повреждении файлов, входящих в пакет DirectX. Причины могут быть разными – результат воздействия зловредного ПО или неумышленные манипуляции пользователя (возможно, малолетнего, всякое бывает). Лечение то же – обновление DirectX.

    Отметим также, что подобные ошибки в большей степени характерны для ноутбуков, поскольку драйверы для них пишутся под конкретную модель, и малейшее отклонение «влево или вправо» может вызвать проблемы. И сбои BIOS в ноутбуках случаются чаще, чем на десктопных ПК.

    Описанные в данной статье способы, как исправить ошибки данного типа, касаются только тех случаев, когда проблема не связана с возникновением серьёзных неполадок с ОС Windows. Впрочем, такие неполадки обязательно проявят себя и вне привязки к играм, и поможет только радикальное средство – переустановка операционной системы.

    Источник

  • When trying to switch to full screen mode I get an error message box with the title «Unexpected error encountered» and the message just says «File:» with Yes and No buttons. I’ve got the whole function below, but I’ve pinpointed the error to occurring when I try to reset the d3d device, which is annoying because I can’t step into it. (and I don’t speak assembly…)

    void EnableFullScreenMode(bool enable)
    {
    	if (enable) // if we're switching to full screen
    	{
    		if (!D3DPresParams.Windowed) 
    			return; // if already full screen, exit function
    		// get current screen settings
    		int width  = GetSystemMetrics(SM_CXSCREEN);
    		int height = GetSystemMetrics(SM_CYSCREEN);
    		// adjust settings
    		D3DPresParams.BackBufferFormat = D3DFMT_X8R8G8B8;
    		D3DPresParams.BackBufferWidth  = width;
    		D3DPresParams.BackBufferHeight = height;
    		D3DPresParams.Windowed			= false;
    		//change window style to be better for full screen mode
    		SetWindowLongPtr(gpGame->mhMainWnd, GWL_STYLE, WS_POPUP);
    		//update to make the changes take effect
    		SetWindowPos(gpGame->mhMainWnd, HWND_TOP, 0, 0,
    			width, height, SWP_NOZORDER | SWP_SHOWWINDOW);
    	}
    	else //if we're switching to windowed mode
    	{
    		if (D3DPresParams.Windowed) 
    			return; // if already windowed, exit function
    		D3DPresParams.BackBufferFormat = D3DFMT_UNKNOWN;
    		D3DPresParams.BackBufferWidth  = 1040;
    		D3DPresParams.BackBufferHeight = 736;
    		D3DPresParams.Windowed			= true;
    		//change window style to be better for windowed mode
    		SetWindowLongPtr(gpGame->mhMainWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);
    		//update to make the changes take effect
    		SetWindowPos(gpGame->mhMainWnd, HWND_TOP, 120, 2,
    			1040, 736, SWP_NOZORDER | SWP_SHOWWINDOW);
    	}
    	//do reset stuff
    	OnLostDevice();
    	gpD3DDevice->Reset(&D3DPresParams); 
    	OnResetDevice();
    }
    

    The program flow steps properly through the first half of the function then skips the second half (as it should) as goes to resetting the device, which fails.

    I normally can debug stuff myself pretty well but I have no idea what would cause this error so I’m a bit stuck. Oh and with the message box if I click No I just get the same message again. If I click yes it just locks up and I have to «End Task» visual studio itself.
    Also, I have have the d3d debug output set to max and have tried this using both retail and debug versions.

    cheers,
    metal

    Sounds like you have the «Break on D3D Error» checkbox checked in your DirectX control panel. Try disabling it so you don’t break at that point, then changing the line to:
    if(FAILED(gpD3DDevice->Reset(&D3DPresParams))) exit(1);
    Then you should be able to examine the debug output to see what the problem is.

    Usually it’s caused by default pool reaources not being Release()d before calling Reset(), or invalid present parameters. The later can be fixed by trying the same present parameters you used to create the device. If it still fails, then you’re probably not releasing some resources.

    Another possibility is that your gpD3DDevice is invalid at the time you call Reset() — that’d cause a hard break to the debugger, or a crash if you’re not running your app in the IDE.

    K, so now it exits at that line and the output is this:

    Direct3D9: (ERROR) :All user created stateblocks must be freed before ResetEx can succeed. ResetEx Fails.
    Direct3D9: (ERROR) :ResetEx failed and ResetEx/TestCooperativeLevel/Release are the only legal APIs to be called subsequently
    The thread ‘Win32 Thread’ (0x102c) has exited with code 1 (0x1).
    The thread ‘Win32 Thread’ (0x142c) has exited with code 1 (0x1).
    The thread ‘Win32 Thread’ (0x984) has exited with code 1 (0x1).

    So does that happen because I’m trying to reset the device without having called OnLostDevice() for something? If that’s the case I’ll scour through and see if there’s anything. What objects need OnLostDevice() and OnResetDevice() to be called before and after a device reset? Is it just any type with an I at the front, like ID3DXFont for example?

    cheers,
    metal

    Quote:Original post by metalmidget
    K, so now it exits at that line and the output is this:

    Direct3D9: (ERROR) :All user created stateblocks must be freed before ResetEx can succeed. ResetEx Fails.
    Direct3D9: (ERROR) :ResetEx failed and ResetEx/TestCooperativeLevel/Release are the only legal APIs to be called subsequently
    The thread ‘Win32 Thread’ (0x102c) has exited with code 1 (0x1).
    The thread ‘Win32 Thread’ (0x142c) has exited with code 1 (0x1).
    The thread ‘Win32 Thread’ (0x984) has exited with code 1 (0x1).

    So does that happen because I’m trying to reset the device without having called OnLostDevice() for something? If that’s the case I’ll scour through and see if there’s anything. What objects need OnLostDevice() and OnResetDevice() to be called before and after a device reset? Is it just any type with an I at the front, like ID3DXFont for example?

    cheers,
    metal

    That means that you’ve not Release()’d something. For ID3DX objects, if the interface has OnLostDevice() and OnResetDevice() functions, you need to call them so D3DX can Release() it’s internal structures. ID3DXFont and ID3DXSprite are two such interfaces.
    Other things you need to release are any resources you create in D3DPOOL_DEFAULT, any state blocks, and any swap chains you may have manually created.

    You could try just exiting your app normally instead of Reset()ing, and see if D3D complains about memory leaks. If it does, then you’ve likely got a leak in your code and fixing it will fix the reset() problem. If not, it means that there’s something you’re not releasing prior to calling Reset().

    Wow I’m surprised and quite impressed! I don’t have any memory leaks!

    OK, so I guess I’ll just go through and find whatever isn’t being Released(). I’m a bit unclear on what Release()ing involves though. For any object that has an OnLostDevice(), that will Release() the object when called right? What about objects that don’t have an OnLostDevice()? Do I have to Release() them myself? Or does the lack of an OnLostDevice() mean that it doesn’t need Release()ing?

    cheers,
    metal

    I found the culprit, it was just an ID3DXEffect I wasn’t OnLostDevice()ing. Thanks very much for that.

    cheers,
    metal

    Quote:Original post by metalmidget
    OK, so I guess I’ll just go through and find whatever isn’t being Released(). I’m a bit unclear on what Release()ing involves though. For any object that has an OnLostDevice(), that will Release() the object when called right? What about objects that don’t have an OnLostDevice()? Do I have to Release() them myself? Or does the lack of an OnLostDevice() mean that it doesn’t need Release()ing?

    OnLostDevice() is only used for D3DX objects. They have D3D resources internally, and so they can be Release()d, you need to call OnLostDevice(). That won’t destroy the object itself (I.e. you’ll still be able to use the ID3DXSprite pointer after calling OnLostDevice(), but not after calling Release().
    You only need to call Release() on these objects when you’re finished with them and want to destroy the object (Usually at application shutdown).

    For non-D3DX objects, you need to Release()anything that you created in the default pool and any state blocks. Basically, anything that will be in VRAM (Since when you Reset() the device, you’re purging VRAM). You’ll also need to Release() these objects when you’re done with them (Again, usually at app cleanup time).

    OK thanks that clears everything up.
    So for something I had in the default pool, say, a vertex buffer (mine are actually in the managed pool), what would I do with them to preserve the data? Would I have to manually copy everything out of the buffer into RAM (which would mean my own set of variables), then release the index buffer then after resetting the device recreate the buffer and load the data back in again manually?

    cheers,
    metal

    Quote:Original post by metalmidget
    OK thanks that clears everything up.
    So for something I had in the default pool, say, a vertex buffer (mine are actually in the managed pool), what would I do with them to preserve the data? Would I have to manually copy everything out of the buffer into RAM (which would mean my own set of variables), then release the index buffer then after resetting the device recreate the buffer and load the data back in again manually?

    Yup, exactly. This is what the managed pool does internally — it has a system memory copy of the data as well as a default pool copy.

    You should always be using the managed pool unless you have a good reason not to. The only exceptions to that are dynamic resources, where they have to be created in the default pool. Since they’re dynamic, you’re probably updating them once a frame anyway, so it doesn’t matter that you can’t keep the data in them — you’ll be filling it in with new data anyway.

    Awesome. Thanks, you’ve been a big help.
    lol, looks like my rating is too low to send yours any higher than it already is.

    cheers,
    metal

    Решил я на выходных поностальгировать в Silent Storm. Установил, запустил и как-то не пошло… Разрешение, то ладно, можно и в 4:3 поиграть. Но, отсутствие теней, эффектов и дикий FPS мешали погрузиться в игру.

    В сообществе стима уже были варианты исправлений, но использовать чужую dll-ину не хотелось. Да и не все мои хотелки она правила. Автор патча Novik65 в одном из обсуждений рассказал, что именно надо поправить и, даже, дал ссылку на исходники. Которые, к сожалению, за давностью лет потерялись.

    Вот и появился повод прокачать скилл программинга 😊 Итак, порядок действий был таков:

    • Написать «чистый» прокси для библиотеки d3d9.dll и проверить работоспособность экспортируемых функций.
    • Реализовать свои интерфейсы IDirect3D9 и IDirect3DDevice9, которые будут вызывать методы настоящих.
    • Поправить функцию Direct3DCreate9, так чтобы она создавала фальшивый IDirect3D9.
    • Поправить метод IDirect3D9::CreateDevice, так чтобы он создавал фальшивый IDirect3DDevice9. Здесь же принудительно включается VSync.
    • Поправить метод Direct3DDevice9::GetAvailableTextureMem. Дело в том, что игра кушает результат в int и не переваривает размер видеопамяти современных видюх. Надо урезать результат до 2-х гигов, чтобы все работало правильно.

    Пишем чистый прокси.

    Я в этом вопросе плохо разбираюсь, поэтому нашел статью грамотного человека:

    Она рассказывает про прокси для ddraw.dll, но принцип тот же: получаем полный перечень всех экспортируемых функций, загружаем оригинальную библиотеку и получаем их адреса. А дальше работает такой код для всех «чистых» функций:

    extern «C» __declspec(naked) void Fake_D3DPERF_BeginEvent()
    {
    _asm { jmp[d3d9dll.D3DPERF_BeginEvent] }
    }

    Его прелесть заключается в том, что для вызова «чистой» функции достаточно знать только ее адрес. Параметры и возвращаемое значение лежат тихонько в стеке и нашей прокси-функцией не портятся.

    На этом все! Собрал и подкинул фейковую d3d9.dll в папку с игрой. Игра запустилась и заработала без проблем. Значит можно продолжать.

    Реализовываем свои IDirect3D9 и IDirect3DDevice9.

    Открываем заголовочный файл d3d9.h и охреневаем 🤔

    Интерфейс IDirect3DDevice9. И каждую строчку нужно реализовать.

    В этот момент, мне расхотелось играть в Silent Storm 😊 Ладно, копаем дальше, должны же быть извращенцы помимо меня. И я нашел аналогичный прокси для Pac-Man Battle Royale.

    Я не скажу, что весь код этого автора мне понравился. Пришлось его рихтовать под себя. Но самое главное, прокси-методы мне не пришлось писать самому и огромный пласт нудных работ я просто скопировал себе:

    void FakeDirect3DDevice9::SetCursorPosition(int X, int Y, DWORD Flags)
    {
    return(m_pIDirect3DDevice9->SetCursorPosition(X, Y, Flags));
    }

    Подмена интерфейсов и правка багов.

    Вот тут начинается самое интересное. Мне нужно было переписать некоторые функции, чтобы они возвращали мои липовые интерфейсы. И, конечно, исправляли недочеты игры. Первым делом переписал Direct3DCreate9, возвращающую интерфейс на объект Direct3D9.

    extern «C» IDirect3D9* WINAPI Fake_Direct3DCreate9(UINT SDKVersion)
    {
    typedef IDirect3D9* (WINAPI * DIRECT3DCREATEPROC)(UINT SDKVersion);
    DIRECT3DCREATEPROC Direct3DCreate9Proc = (DIRECT3DCREATEPROC)d3d9dll.Direct3DCreate9;
    IDirect3D9* pFakeDirect3D9 = Direct3DCreate9Proc(SDKVersion);
    return new FakeDirect3D9(pFakeDirect3D9);
    }

    Идея всех подобных функций проста: сначала я создаю настоящий Direct3D9 объект (первые три строчки в теле функции), а потом создаю свой прокси-объект, которому скармливаю настоящий (последняя строка). В дальнейшем все методы прокси либо будут передавать управление настоящему объекту, либо вносить правки и уже потом передавать управление. Наружу из такой функции, естественно возвращается интерфейс на поддельный объект.

    Теперь очередь за IDirect3D9::CreateDevice.

    HRESULT FakeDirect3D9::CreateDevice(UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface)
    {
    pPresentationParameters->PresentationInterval = D3DPRESENT_INTERVAL_ONE; // force VSYNC
    HRESULT hres = m_pIDirect3D9->CreateDevice(Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
    *ppReturnedDeviceInterface = new FakeDirect3DDevice9(*ppReturnedDeviceInterface);
    return(hres);
    }

    Тут, тоже самое. За исключением первой строчки в теле метода. Именно она отвечает за включение вертикальной синхронизации. Никаких дополнительных проверок я делать не стал — ребята из Nival дичи не творили, все параметры передают хорошие.

    Ну и последний метод, исправляющий баг с тенями и эффектами:

    UINT FakeDirect3DDevice9::GetAvailableTextureMem(void)
    {
    UINT ret = m_pIDirect3DDevice9->GetAvailableTextureMem();
    if (ret > (UINT)INT_MAX)
    ret = (UINT)INT_MAX;
    return(ret);
    }

    Исправляем то, о чем я писал выше. Игра внутри себя хранит результат в int (максимум 2’147’483’647), а надо хранить в unsigned int (максимум 4’294’967’296). Ну т.е. на видюхе с более чем 2 гига оперативки, int захлебывается и уходит в отрицательные значения, что и приводит к неверному авто-определению настроек. Данный метод, просто обрубает настоящий результат по границе в 2 гига.

    Итог.

    Update: Добавил фикс для разрешения 1920х1080. Мне не нравится результат — многие надписи обрезаются по вертикали. В комментариях есть скриншоты с примерами. Чтобы перейти в FullHD, в игре нужно установить разрешение 800х600.

    Тут лежат исходники и собранная dll. Так как я играю на рабочем компьютере и не сильно заморачивался со сборкой, то возможны зависимости от 2019-й студии. Ну да это уже совсем другая история 😊

    Недавно я нашел ошибку в своем 3D-приложении, использующем DirectX 9. Ошибка в том, что каждый раз, когда я использую alt-tab или ctrl-alt-delete, программа зависает или ничего не делает. Я осмотрелся и узнал, что мне нужно перезагрузить свое устройство, используя IDirect3DDevice9::TestCooperativeLevel и IDirect3DDevice9::Reset. Но то, что я изо всех сил на в данный момент является то, что (насколько я знаю), прежде чем я Reset устройство, мне нужно освободить Resouce в D3DPOOL_MANAGE, прежде чем перезагрузить устройство и перераспределить ресурс вернуться к нему после сброса? Как мне это сделать? Ниже приведен код, который у меня есть для сброса моего устройства (в функции IsDeviceLost()).

    DirectX.h

    #pragma once
    #pragma comment(lib, "d3d9.lib")
    
    #include<d3d9.h>
    #include<d3dx9math.h>
    
    #include"Window.h"
    #include"Vertex.h"
    #include"Shader.h"
    
    #define VERTEXFORMAT (D3DFVF_XYZ | D3DFVF_TEX1) //Flags for the Flexible Vertex Format (FVF)
    
    class Shader;
    
    class DirectX
    {
    public:
        DirectX(std::string windowTitle, int x, int y, unsigned int windowWidth, unsigned int windowHeight, bool fullscreen);
        virtual ~DirectX();
    
        static LPDIRECT3D9 direct3D;
        static LPDIRECT3DDEVICE9 device;
        static IDirect3DVertexDeclaration9* vertexDec;
        static ID3DXEffect* currentShaderEffect;
    
        void CheckShaderVersion();
        bool IsDeviceLost();
    
    protected:
        D3DPRESENT_PARAMETERS direct3DPresPara;
    
        Window *window;
        unsigned int width;
        unsigned int height;
        D3DXMATRIX projMatrix;
    
    private:
        void Initialize(bool fullscreenMode);
    };
    

    Direct.cpp

    #include"DirectX.h"
    
    LPDIRECT3D9 DirectX::direct3D = NULL;
    LPDIRECT3DDEVICE9 DirectX::device = NULL;
    IDirect3DVertexDeclaration9* DirectX::vertexDec = NULL;
    ID3DXEffect* DirectX::currentShaderEffect = NULL;
    
    DirectX::DirectX(std::string windowTitle, int x, int y, unsigned int windowWidth, unsigned int windowHeight, bool fullscreen)
    {
        width = windowWidth;
        height = windowHeight;
    
        window = new Window(windowTitle.c_str(), windowWidth, windowHeight, x, y, fullscreen);
    
        Initialize(fullscreen);
    
        D3DXMatrixPerspectiveFovLH( &projMatrix,
                                    D3DXToRadian(45),
                                    (float)width/(float)height,
                                    1.0f,
                                    15000.0f);
    
        //device->SetTransform(D3DTS_PROJECTION, &projMatrix);
    }
    
    DirectX::~DirectX()
    {
        direct3D->Release();
        device->Release();
        vertexDec->Release();
    
        delete vertexDec;
        delete currentShaderEffect;
        delete window;
    }
    
    void DirectX::Initialize(bool fullscreenMode)
    {
        direct3D = Direct3DCreate9(D3D_SDK_VERSION);
    
        ZeroMemory(&direct3DPresPara, sizeof(direct3DPresPara));
    
        switch(fullscreenMode)
        {
            case true:
                direct3DPresPara.Windowed = false;
            break;
            case false:
                direct3DPresPara.Windowed = true;
        }
    
        direct3DPresPara.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //turns off VSync, comment this line of code to turn VSync back on
        direct3DPresPara.SwapEffect = D3DSWAPEFFECT_DISCARD;
        direct3DPresPara.hDeviceWindow = window->GetHandle();
        direct3DPresPara.BackBufferFormat = D3DFMT_X8R8G8B8;
        direct3DPresPara.BackBufferWidth = width;
        direct3DPresPara.BackBufferHeight = height;
        direct3DPresPara.EnableAutoDepthStencil = TRUE;
        direct3DPresPara.AutoDepthStencilFormat = D3DFMT_D16;
    
        direct3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, window->GetHandle(), D3DCREATE_SOFTWARE_VERTEXPROCESSING, &direct3DPresPara, &device);
    
        D3DVERTEXELEMENT9 vertexElement[] = {   {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
                                                {0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
                                                D3DDECL_END()};
    
        device->CreateVertexDeclaration(vertexElement, &vertexDec);
    
        //currentShaderEffect = 0;
    }
    
    void DirectX::CheckShaderVersion()
    {
        D3DCAPS9 caps;
    
        device->GetDeviceCaps(&caps);
    
        bool stop = false;
        int i = 6;
        while(!stop)
        {
            if(caps.VertexShaderVersion < D3DVS_VERSION(i, 0))
            {
                i--;
            }
            else
            {
                std::cout << "you are using shader model " << i << std::endl;
                stop = true;
            }
        }
    
        //std::cout << caps.VertexShaderVersion << std::endl;
        //std::cout << D3DVS_VERSION(3, 0) << std::endl;
    }
    
    bool DirectX::IsDeviceLost()
    {
        HRESULT result = device->TestCooperativeLevel();
    
        if(result == D3DERR_DEVICELOST)
        {
            Sleep(20); //Sleep for a little bit then try again.
            return true;
        }
        else if(result == D3DERR_DRIVERINTERNALERROR)
        {
            MessageBox(0, "Internal Driver Error. The program will now exit.", 0, 0);
            PostQuitMessage(0);
            return true;
        }
        else if(result == D3DERR_DEVICENOTRESET)
        {
            device->Reset(&direct3DPresPara);
            return false;
        }
        else
        {
            return false;
        }
    }
    

    Любая помощь или совет будут очень признательны. благодаря

    Понравилась статья? Поделить с друзьями:

    Читайте также:

  • Idirect3ddevice9 reset error 88760868
  • Identified by mysql ошибка
  • Icon error message
  • Icloud ошибка 101
  • Ibm mq 2035 error

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии