Перейти к содержимому

Dxgi adapter cache что это за процесс

  • автор:

DirectX 12 — от Леонардо да Винчи к современному искусству

Компьютерная графика — обширная и быстроразвивающаяся дисциплина. С каждым годом интерфейсы прикладного программирования становятся более гибкими, что позволяет на их основе реализовывать более сложные алгоритмы формирования и обработки изображений. Однако возможности интерактивной графики не достигли уровня пакетов 3d-моделирования и визуализации. Все это подталкивает к активным исследованиям в данной области.

image

DirectX 12 — компонент интерфейса программирования высокопроизводительной графики. Основные цели нового интерфейса — снижение CPU-оверхеда драйвера, понижение уровня абстрагирования оборудования, возможность объединения графических карт на уровне API (до этого существовали только vender-specific решения CrossFireX, NVIDIA SLI). Официально выпущен Microsoft в июле 2015.

Статья рассчитана на тех, кто уже работал с графическими библиотеками (OpenGL, DirectX 11). Однако для людей, которые планирует начать изучение графики именно с 12 версии возможно тоже будет полезной.

В ней мы рассмотрим следующие темы:

  • Окружение
  • Краткое описание графического пайплайна
  • Новые возможности DirectX 12
    1. Состояния
    2. Команды
    3. Синхронизация
    4. Прикрепление ресурсов

Окружение

DirectX 12 является частью Windows SDK в Windows 10. В качестве IDE используем Visual Studio, язык программирования C++. Для работы с DirectX, необходимо подключить хедеры d3d12.h dxgi1_6.h и библиотеки d3d12.lib, dxguid.lib, dxgi.lib, d3dcompiler.lib. Все это лежит в стандартных каталогах Windows SDK. Так же распространяется «D3D12 Helper Library» в виде одного заголовочного файла d3dx12.h, она позволяет сократить количество boilerplate кода. Его можно просто скачать по адресу d3dx12.h и вложить в проект.

Краткое описание графического пайплайна

В основе графической библиотеки лежат функции рисования, которые запускают графический конвейер — программно-аппаратное средство визуализации трехмерной графики. Аппаратная составляющая представлена видеоадаптером, программная — драйвером. Графический конвейер можно представить в виде черного ящика, разделенного на этапы и выполняющего необходимые преобразования. Содержимое этого черного ящика может быть различным. Выполняемые преобразования зависят от назначения графической системы, стоимости, требуемого уровня универсальности и многих других факторов. Также, конкретный видеоадаптер — сложный механизм, правила работы которого зачастую известны лишь непосредственно производителю.

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

Преобразование вершин

Каждая вершина имеет определенный набор атрибутов таких, как позиция, цвет, текстурные координаты, вектор нормали или все векторы из касательного пространства и, возможно, некоторые другие. Трансформация вершин — это первая стадия графического конвейера. На этом этапе входными данными являются атрибуты конкретной вершины, над которыми производятся математические преобразования. Эти операции включают трансформацию позиции вершины, генерацию и преобразование текстурных координат, расчет освещения для каждой отдельной вершины, а также любые другие операции, которые необходимо выполнить на уровне вершин. Каждая вершина обрабатывается параллельно с другими вершинами на доступных ядрах графического ускорителя. Основной результат вершинной программы — преобразовать координаты из модельного пространства в специальное пространство отсечения (clip space).

Построение примитивов и растеризация

Входные данные этого этапа — трансформированные вершины, а также информация о их соединении. Из этих данных осуществляется сборка геометрических примитивов. В результате получается последовательность треугольников, линий или точек. Над этими примитивами может производиться отсечение плоскостям, определенными в программе. Также на этом этапе могут быть отброшены задние треугольники объектов. Определяются эти треугольники по направлению обхода вершин (по часовой стрелке или против). Какое направление обхода соответствует заднему треугольнику задается через графическое API. Полигоны, прошедшие отсечение, могут растеризироваться.

Текстурирование и окрашивание

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

Пофрагментные операции

На этом этапе проводится ряд пофрагментных тестов, таких как тест отсечения (scissor test), тест трафарета (stencil test) и тест глубины (depth test). Эти тесты определяют конечный вид, цвет и глубину фрагмента перед обновлением экранного буфера. Если какой-либо тест проходит с ошибкой, то фрагмент не обновляется. После тестов выполняется операция смешивания, которая комбинирует финальный цвет фрагмента с текущим цветом пиксела, а итоговый результат записывается в экранный буфер. Операция смешивания выполняется на этом этапе, поскольку стадия текстурирования и окрашивания не имеют доступа к экранному буферу.

Более детальное устройство конвейера можно посмотреть в спецификации DirectX 11 (документ по DiretcX 12 затрагивает лишь изменения с предыдущей версией)

Новые возможности DirectX 12

Мы переходим от теоретической части непосредственно к описанию конкретных возможностей DirectX 12.

Состояния

В 11 версии программистам известны различные функции изменения состояний графического ускорителя: RSSetState(), OMSetDepthStencilState(), OMSetBlendState(). Оказалось, что такой подход плохо ложится на оборудование. В конечном итоге драйвер устанавливает адаптеру одно монолитное состояние, а отдельные вызовы или некоторые комбинации состояний могли приводить к непредсказуемым задержкам со стороны драйвера. В новой версии инженеры переосмыслили этот подход и исключили атомарное изменений состояний, теперь они объединены в одно — PSO (Pipeline State Object). Такое нововведение кажется более удобным со стороны пользователя: теперь не нужно беспокоиться о «висячих состояниях», которые остались с прошлых проходов. Более того, для лучшей эффективности установки, теперь дополнительно требуется передавать информацию о всех прикрепленных ресурсах в шейдер через Root Signature (об этом ниже).

Команды

В ранних версиях пользователи отправляли команды через так называемый immideate context. Под капотом создавались отложенные командные очереди и по мере заполнения отправлялись оборудованию. Необходимо отметить, что в DirectX 11 существует возможность создания deferred context. В DirectX 12 immideate context был исключен и deferred концепция стала основной. Теперь программист должен заполнить deferred command list, и в необходимый момент отправить его на исполнение.

Таким образом, реализация двойной и тройной буферизаций теперь выглядит более явно: создаются соответствующее количество command list, как только они заполнены, CPU переходит в режим ожидания свободного листа.

Здесь же стоит упомянуть о ресурсах, которые прикреплены к конкретному командному листу. Теперь удаление ресурса, использующегося на GPU, ведет к непредсказуемым последствиям. Например, раньше легально было выполнить Release() для текстуры которая еще используются — драйвер автоматически отследит, когда ресурс перестанет использоваться и только после этого удалит его.

Синхронизация

Для возможности отслеживания работы GPU, DirectX 12 предоставляет концепцию fence, которая инкапсулирована объектом ID3D12Fence интерфейсом. Fence — это целое число, которое представляет выполненную работу GPU на текущий момент. Сначала происходит эмитинг следующего «свободного» значения, вызывая ID3D12CommandQueue::Signal() в командной очереди. Затем с помощью ID3D12Fence::SetEventOnCompletion(UINT64 Value, HANDLE hEvent) происходит ассоциирование значения с примитивом winapi event. Теперь поток с помощью WaitForSingleObject() над подготовленным event-ом может приостановить выполнение до момента выполнения всей работы, предшествующий контрольному значению. Как только вся работа на GPU выполнится, значение в fence обновится, вызов WaitForSingleObject() разблокируется и поток продолжит выполнение.

Прикрепление ресурсов

Биндинг ресурсов в шейдер — одна из самых запутанных тем современного DirectX.

Обзор

В DirectX 11 использовалась следующая модель биндинга: каждый ресурс устанавливался в шейдер соответствующим вызовом API. Например, для установки двух текстур (если не задумываться о семплерах) в 5 и 6 слоты пиксельного шейдера применялся следующий код:

ID3D11ShaderResourceView* srvs[] = < texture1->GetShaderResourceView(); texture2->GetShaderResourceView(); >; context->PSSetShaderResources(5, 2, srvs);

Где GetShaderResourceView() возвращает указатель на объект типа ID3D11ShaderResourceView.
В шейдере затем текстуры использовались так:

Texture2D texture1 : register(t5); Texture2D texture2 : register(t6);

Такая система достаточно удобная со стороны программиста, но с точки зрения графического ускорителя нет. Допустим, нам необходимо прикрепить текстуру на чтение в шейдере. Как должна быть передана информация о текстуре? Если мы заглянем в документацию GCN ISA, найдем следующий параграф:

All vector memory operations use an image resource constant (T#) that is a 128- or 256-bit value in SGPRs. This constant is sent to the texture cache when the instruction is executed. This constant defines the address, data format, and characteristics of the surface in memory.

Это означает, что для того чтобы описать текстуру, нам нужен этот небольшой дескриптор (128 или 256-битный), который нужно поместить в любое место памяти. Если мы прочтем остальную часть документации, мы заметим, что этот же шаблон также используется для всех других типов ресурсов. Фактически, когда дело доходит до доступа к ресурсу, понятие «слот» бессмысленно. Графический адаптер оперирует дескрипторами: текстуры (T#), сэмплера (S#) или константы (V#). С Direct3D 12 эти дескрипторы, наконец, отображаются непосредственно на дескрипторы оборудования — некоторая память GPU.

Дескрипторы

Сейчас ресурсы не прикрепляются в графический пайплайн прямо через вызовы методов, прикрепление происходит опосредовано через дескрипторы. Дескриптор — небольшой кусочек памяти, который содержит информацию о ресурсе (GPU виртуальный адрес, и, например, количество мипов, формат). Множество дескрипторов хранятся в дескрипторной куче — это просто массив дескрипторов фиксированного размера. Дескрипторные кучи могут содержать информацию о разных типах ресурсов:

  • Constant buffer views (CBVs)
  • Unordered access views (UAVs)
  • Shader resource views (SRVs)
  • Samplers

CBVs, UAVs, SRVs могут содержаться в одной дескрипторной куче, а описания семплеров — в отдельной. Это разделение выражает тот факт, что семплеры в ускорителе обрабатываются отдельно.

Выше мы упомянули так называемые shader visible ресурсы. Соответственно, существуют non shader visible ресурсы:

  • Render Target Views (RTVs)
  • Depth Stencil Views (DSVs)
  • Stream Output Views (SOVs)

Такие views ресурсов предназначаются только для прикрепления ресурса в пайплан (но не для использования в шейдере), и поэтому их нужно создавать в отдельной non shader visible дескрипторной куче (это задается флагом D3D12_DESCRIPTOR_HEAP_FLAGS::D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE при создании кучи).

Есть еще одна группа view’s, для которых дескрипторы (и, соответственно, дескрипторная куча) не требуются:

  • Index Buffer View (IBV)
  • Vertex Buffer View (VBV)

Представлены типами D3D12_INDEX_BUFFER_VIEW и D3D12_VERTEX_BUFFER_VIEW соответственно. То есть описания индексных и вершинных буферов содержатся в указанных выше структурах и затем передаются напрямую в Pipeline State Object. Вся память в PSO автоматически версионируется драйвером.

Таким образом, теперь вместо создания множества объектов типа ID3D11. View, мы создаем дескрипторы в дескрипторной куче.

Root signature

Root signature — объект DirectX 12 API который задает соответствие лэйаута дескрипторов и данных в слоты шейдера. Это, в некотором смысле, действительно сигнатура шейдера только с точки зрения использования ресурсов. Root signature не содержит конкретных дескрипторов и данных, она лишь задает лэйаут (устройство) дескрипторов, которые биндятся уже позднее на этапе рендеринга.

Root signature состоит из массив записей, которые называются root parameter. Действительные данные root parameter устанавливаются в рантайме и называются root arguments. Меняя root argument, меняются данные которые читает шейдер. Root parameter бывают трех типов:

  • Root constants (1 DWORD == 32bit value)
  • Inline descriptors (так как 64-bit GPU virtual addresses, стоит 2 DWORDs каждый)
  • Таблица дескрипторов (1 DWORD)

Максимальный размер root signature — 64 DWORDs. Типы отсортированы по возрастанию уровня косвенности доступа ресурса в шейдере, но по убыванию возможностей.

Root constant это встроенное в root signature 32-битное значение, которое используется в шейдере как constant buffer. Предназначается для наиболее активно изменяющихся констант (например, MVP матрицы), но имеет жесткие ограничения на максимальный размер (всего поместится 4 матрицы). Так же такие данные доступны в шейдере с нулевым уровнем косвенности, и имеют более быстрый доступ чем все остальные способы. Полностью версионируются драйвером: их можно «установить и забыть».

Приложение может поместить дескрипторы напрямую в root signature во избежании хранения дескрипторов в куче дескрипторов — это второй способ inline descriptors. Пример таких данных — константа per object. Таким образом, не нужно беспокоиться о свободном месте в куче дескрипторов. Имеет первый уровень косвенности. Версионируется сам дескриптор (то есть описание ресурса), но ресурс который описывает этот дескриптор должен быть доступен до завершения его использования на GPU. Установка конкретных данных производится, например, методом ID3D12GraphicsCommandList::SetGraphicsRootConstantBufferView, в него передается индекс root parameter нашего inline descriptor и виртуальный адрес буфера.

Мы подошли к третьему, основному и универсальному способу прикрепления ресурсов. Таблица дескрипторов содержит массив descriptor range. Descriptor range — описание непрерывной цепочки дескрипторов определенного типа. Описание одной записи в таблицы дескрипторов проще показать кодом:

typedef enum D3D12_DESCRIPTOR_RANGE_TYPE < D3D12_DESCRIPTOR_RANGE_TYPE_SRV = 0, D3D12_DESCRIPTOR_RANGE_TYPE_UAV = ( D3D12_DESCRIPTOR_RANGE_TYPE_SRV + 1 ) , D3D12_DESCRIPTOR_RANGE_TYPE_CBV = ( D3D12_DESCRIPTOR_RANGE_TYPE_UAV + 1 ) , D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER = ( D3D12_DESCRIPTOR_RANGE_TYPE_CBV + 1 ) >D3D12_DESCRIPTOR_RANGE_TYPE; typedef struct D3D12_DESCRIPTOR_RANGE < D3D12_DESCRIPTOR_RANGE_TYPE RangeType; UINT NumDescriptors; UINT BaseShaderRegister; //. >D3D12_DESCRIPTOR_RANGE;

Видим, что RangeType — указывает тип дескриптора, NumDescriptors — количество, BaseShaderRegister — номер регистра внутри шейдера. Остальные параметры служат для расширенной настройки и пока не будем их рассматривать. В рантайме дескрипторы устанавливаются методом ID3D12GraphicsCommandList::SetGraphicsRootDescriptorTable, в него передается индекс root parameter нашей таблицы дескрипторов и первый дескриптор. Все дескрипторы, указанные в описании таблицы дескрипторов, подхватываются автоматически. Из этого следует, что они должны располагаться непрерывно друг за другом в descriptor heap.

Заключение

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

Dxgi adapter cache что это за процесс

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

Страницы: 1

  • Форумы
  • » Firefox
  • » Firefox 58.0.x крашится при старте

№1 08-02-2018 12:18:27

Firefox

lisenok0202 Участник Группа: Members Зарегистрирован: 08-02-2018 Сообщений: 4 UA: 58.0

Firefox 58.0.x крашится при старте

Привет, после перехода на Win 7 x64 перестал запускаться браузер, каждый запуск краш. Пробовал и 32х битную версию и 64 битную, и разные версии 0.0-0.2. Причем старая портабл версия 54я запускается без вопросов. Грешу на nvidia iOn 2, тк когда запускаешь на intel GMA 3150 все работает. Пробовал менять драйвера на nvidia iOn, ничего не меняется. DirectX 11 установлен.

скрытый текст

Код:
AdapterDeviceID: 0x0a76 AdapterDriverVersion: 9.18.13.697 AdapterSubsysID: 00000000 AdapterVendorID: 0x10de Add-ons: activity-stream%40mozilla.org:2018.01.04.0062-4997c81d,aushelper%40mozilla.org:2.0,firefox%40getpocket.com:1.0.5,followonsearch%40mozilla.com:0.9.6,formautofill%40mozilla.org:1.0,onboarding%40mozilla.org:1.0,screenshots%40mozilla.org:25.0.0,shield-recipe-client%40mozilla.org:76.1,webcompat%40mozilla.org:1.1,%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:58.0.2 AppInitDLLs: nvinitx.dll AvailablePageFile: 7331889152 AvailablePhysicalMemory: 3099025408 AvailableVirtualMemory: 8794595909632 BIOS_Manufacturer: American Megatrends Inc. BlockedDllList: BreakpadReserveAddress: 53739520 BreakpadReserveSize: 83886080 BuildID: 20180206200532 CPUMicrocodeVersion: 0x107 ContentSandboxCapable: 1 ContentSandboxLevel: 4 CrashTime: 1518084836 DOMIPCEnabled: 1 EMCheckCompatibility: true Email: FramePoisonBase: 9223372036600889344 FramePoisonSize: 65536 GPUProcessLaunchCount: 2 GPUProcessStatus: Destroyed GraphicsCriticalError: |[0][GFX1-]: [D3D11] failed to get compositor device. (t=7.97899) |[1][GFX1-]: [D3D11] Failed to init compositor with reason: FEATURE_FAILURE_D3D11_NO_DEVICE (t=7.97899) |[2][GFX1-]: [D3D11] failed to get compositor device. (t=8.22685) |[3][GFX1-]: [D3D11] Failed to init compositor with reason: FEATURE_FAILURE_D3D11_NO_DEVICE (t=8.22685) |[4]CP+[GFX1-]: Could not get a DXGI adapter (t=14.7257) |[5]CP+[GFX1-]: Could not get a DXGI adapter (t=14.7257) |[6][GFX1-]: GPU process disabled after 2 attempts (t=14.7257) GraphicsSanityTest: 1 InstallTime: 1518080676 Notes: AdapterVendorID: 0x10de, AdapterDeviceID: 0x0a76, AdapterSubsysID: 00000000, AdapterDriverVersion: 9.18.13.697 Has dual GPUs. GPU-#2: AdapterVendorID2: 0x8086, AdapterDeviceID2: 0xa001, AdapterSubsysID2: 00000000, AdapterDriverVersion2: 8.14.10.2230FP(D00-L1000-W00001000-T000) DWrite? DWrite+ WR? WR- OMTP? OMTP+ D3D11 Layers? D3D11 Layers- ProductID: ProductName: Firefox ReleaseChannel: release SafeMode: 0 SecondsSinceLastCrash: 1110 StartupCrash: 0 StartupTime: 1518084828 SystemMemoryUsePercentage: 27 TelemetryEnvironment: <"build":<"applicationId":"","applicationName":"Firefox","architecture":"x86-64","buildId":"20180206200532","version":"58.0.2","vendor":"Mozilla","platformVersion":"58.0.2","xpcomAbi":"x86_64-msvc","hotfixVersion":null,"updaterAvailable":true>,"partner":<"distributionId":null,"distributionVersion":null,"partnerId":null,"distributor":null,"distributorChannel":null,"partnerNames":[]>,"system":,"os":,"hdd":,"binary":,"system":>,"gfx":<"D2DEnabled":false,"DWriteEnabled":true,"ContentBackend":"Skia","adapters":[<"description":"NVIDIA ION ","vendorID":"0x10de","deviceID":"0x0a76","subsysID":"00000000","RAM":512,"driver":"nvd3dumx,nvwgf2umx,nvwgf2umx nvd3dum,nvwgf2um,nvwgf2um","driverVersion":"9.18.13.697","driverDate":"10-2-2012","GPUActive":true>,],"monitors":[],"features":,"advancedLayers":,"d3d11":,"d2d":>>,"appleModelId":null,"isWow64":false>,"settings":,"userPrefs":,"sandbox":,"addonCompatibilityCheckEnabled":true,"isDefaultBrowser":null>,"profile":<>,"addons":,"aushelper@mozilla.org":,"firefox@getpocket.com":,"followonsearch@mozilla.com":,"formautofill@mozilla.org":,"onboarding@mozilla.org":,"screenshots@mozilla.org":,"shield-recipe-client@mozilla.org":,"webcompat@mozilla.org":>,"theme":<>,"activePlugins":[],"activeGMPlugins":,"gmp-widevinecdm":>,"activeExperiment":<>,"persona":null>> Theme: classic/1.0 ThreadIdNameMapping: 3792:"Gecko_IOThread",452:"Timer",3744:"Link Monitor",940:"Socket Thread",4052:"JS Watchdog",1832:"Hang Monitor",3456:"Cache2 I/O",1084:"Cookie",1800:"GMPThread",3532:"SoftwareVsyncThread",3732:"Compositor",3100:"VRListener",3424:"ImgDecoder #1",428:"ImgDecoder #2",3080:"ImgDecoder #3",1820:"ImageIO",2040:"HTML5 Parser",524:"IPDL Background",3220:"StreamTrans #3",3040:"ImageBridgeChild",3976:"ProcessHangMon",3476:"DOM Worker", Throttleable: 1 TotalPageFile: 8567042048 TotalPhysicalMemory: 4284473344 TotalVirtualMemory: 8796092891136 URL: UptimeTS: 15.300519731 Vendor: Mozilla Version: 58.0.2 Winsock_LSP: MSAFD Tcpip [TCP/IP] : 2 : 2 : 1 : 6 : 0x20066 : 0x8 : %SystemRoot%\system32\mswsock.dll : : e70f1aa0-ab8b-11cf-8ca3-00805f48a192 MSAFD Tcpip [UDP/IP] : 2 : 2 : 2 : 17 : 0x20609 : 0x8 : %SystemRoot%\system32\mswsock.dll : : e70f1aa0-ab8b-11cf-8ca3-00805f48a192 MSAFD Tcpip [RAW/IP] : 2 : 2 : 3 : 0 : 0x20609 : 0xc : %SystemRoot%\system32\mswsock.dll : : e70f1aa0-ab8b-11cf-8ca3-00805f48a192 MSAFD Tcpip [TCP/IPv6] : 2 : 23 : 1 : 6 : 0x20066 : 0x8 : %SystemRoot%\system32\mswsock.dll : : f9eab0c0-26d4-11d0-bbbf-00aa006c34e4 MSAFD Tcpip [UDP/IPv6] : 2 : 23 : 2 : 17 : 0x20609 : 0x8 : %SystemRoot%\system32\mswsock.dll : : f9eab0c0-26d4-11d0-bbbf-00aa006c34e4 MSAFD Tcpip [RAW/IPv6] : 2 : 23 : 3 : 0 : 0x20609 : 0xc : %SystemRoot%\system32\mswsock.dll : : f9eab0c0-26d4-11d0-bbbf-00aa006c34e4 Поставщик услуг RSVP TCPv6 : 2 : 23 : 1 : 6 : 0x22066 : 0x8 : %SystemRoot%\system32\mswsock.dll : : 9d60a9e0-337a-11d0-bd88-0000c082e69a Поставщик услуг RSVP TCP : 2 : 2 : 1 : 6 : 0x22066 : 0x8 : %SystemRoot%\system32\mswsock.dll : : 9d60a9e0-337a-11d0-bd88-0000c082e69a Поставщик услуг RSVP UDPv6 : 2 : 23 : 2 : 17 : 0x22609 : 0x8 : %SystemRoot%\system32\mswsock.dll : : 9d60a9e0-337a-11d0-bd88-0000c082e69a Поставщик услуг RSVP UDP : 2 : 2 : 2 : 17 : 0x22609 : 0x8 : %SystemRoot%\system32\mswsock.dll : : 9d60a9e0-337a-11d0-bd88-0000c082e69a MSAFD RfComm [Bluetooth] : 2 : 32 : 1 : 3 : 0x20026 : 0x8 : %SystemRoot%\system32\mswsock.dll : : 9fc48064-7298-43e4-b7bd-181f2089792a useragent_locale: ru

Процесс System грузит Windows, что делать? Загруженность жесткого диска или процессора 100%

#ОкейГик

Операционная система Windows выполняет большое количество «фоновых» задач, которые могут негативно сказываться на производительности маломощных компьютеров. Одним из процессов, который грузит оперативную память, диск или CPU, является System.exe. В «Диспетчере задач» можно увидеть, что файл System грузит Windows, а если уточнить, то нагружает «железо» компьютера. Решить данную проблему владелец компьютера может самостоятельно, если выполнит ряд простых действий.

Оглавление: 1. Процесс System грузит жесткий диск и память до 100% 2. Как отключить автоматическое обновление Windows 10 и системные службы 3. Видеоинструкция 

Процесс System грузит жесткий диск и память до 100%

System – это процесс операционной системы Windows, который не является вирусом, вопреки распространенному заблуждению. Он отвечает за работу приложений в «фоновом» режиме, то есть без активного контроля со стороны пользователя. Данный процесс не скрывается, и его можно с легкостью обнаружить в «Диспетчере задач».

Главная проблема процесса System.exe, что его нельзя остановить. Таким образом, если System грузит оперативную память или жесткий диск компьютера, выключить простыми методами его не удастся. Понижение приоритета процесса с помощью стандартных средств Windows так же не приводит к успеху.

Процесс System грузит память

Процесс System примечателен тем, что он забирает оперативную память понемногу, и в итоге полностью ее нагружает. При этом в «Диспетчере задач» может отмечаться, что System грузит не более 200-400 Мб оперативной памяти, а она будет заполнена полностью, и компьютер начнет сильно зависать при выполнении любых задач. Подобным образом системный процесс System может грузить жесткий диск.

Чтобы файл System не грузил компьютер, расходуя непомерные ресурсы, следует отключить в операционной системе Windows некоторые «фоновые» задачи:

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

Как отключить автоматическое обновление Windows 10 и системные службы

Компания Microsoft в операционной системе Windows 10, и более ранних версиях, предусмотрела возможность автоматического обновления программного обеспечения. К сожалению, данная функция на некоторых компьютерах приводит к тому, что при проверке доступных обновлений на сервисах Microsoft, файл System грузит оперативную память или жесткий диск. В таком случае единственным решением является отключение автоматического обновления Windows 10. Внимание: Если вы отключили автоматическое обновление Windows 10, рекомендуем раз в несколько месяцев (или недель) самостоятельно проверять наличие новых сборок операционной системы.

Отключить автоматическое обновление Windows 10 довольно просто, для этого необходимо:

services.msc

    Нажать на клавиатуре сочетание клавиш Windows+R, и в открывшемся меню «Выполнить» прописать команду services.msc, а после нажать «ОК».

Процесс System грузит компьютер

Команда services.msc позволит открыть меню, в котором отображаются все системные службы. Листаем немалый список до тех пор, пока не обнаружим службу «Центр обновления Windows (локальный компьютер)». Жмем на обнаруженный элемент правой кнопкой мыши, и в выпавшем меню выбираем «Свойства».

отключить автоматическое обновление Windows 10

Откроются свойства выбранной службы, и здесь надо сперва нажать кнопку «Остановить», если она активна, а после изменить «Тип запуска» на «Отключена».

Выполнив указанные выше инструкции, в операционной системе будет отключена служба, которая занимается автоматической проверкой, в «фоновом» режиме, актуальности действующей на компьютере версии Windows.

Помимо автоматического обновления Windows 10, чтобы процесс System не грузил систему, необходимо отключить и некоторые службы. В меню «Служб», которое открывается командой services.msc, также необходимо остановить, а после отключить, следующие локальные службы:

System грузит Windows - отключение служб

  • KtmRm для координатора распределенных транзакций
  • Snupchat
  • Superfetch
  • Агент политики IPsec
  • Клиент отслеживания изменившихся связей
  • Служба политики диагностики

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

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

Обзор DXGI

Инфраструктура графики Microsoft DirectX (DXGI) распознает, что некоторые части графики развиваются медленнее, чем другие. Основной целью DXGI является управление низкоуровневыми задачами, которые могут быть независимы от среды выполнения графики DirectX. DXGI предоставляет общую платформу для будущих графических компонентов; Первым компонентом, используюющим преимущества DXGI, является Microsoft Direct3D 10.

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

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

Схема взаимодействия между приложениями, dxgi, драйверами и оборудованием

Приложение может напрямую обращаться к DXGI или вызывать API Direct3D в D3D11_1.h, D3D11.h, D3D10_1.h или D3D10.h, которые обрабатывают взаимодействие с DXGI. Вы можете работать с DXGI напрямую, если приложению необходимо перечислить устройства или управлять представлением данных в выходных данных.

В этом разделе содержатся следующие подразделы.

  • Перечисление адаптеров
    • Новые сведения о перечислении адаптеров для Windows 8
    • Создание цепочки буферов
    • Уход и кормление цепочки буферов
    • Обработка изменения размера окна
    • Выбор выходных данных и размера DXGI
    • Отладка в режиме Full-Screen
    • Уничтожение цепочки буферов
    • Использование повернутого монитора
    • Переключение режимов
    • Совет по производительности в полноэкранном режиме
    • Рекомендации по многопоточности

    Чтобы узнать, какие форматы поддерживаются оборудованием Direct3D 11, выполните следующие действия:

    • Поддержка формата DXGI для оборудования Уровня компонентов Direct3D 12.1
    • Поддержка формата DXGI для оборудования Уровня компонентов Direct3D 12.0
    • Поддержка формата DXGI для оборудования Уровня компонентов Direct3D 11.1
    • Поддержка формата DXGI для оборудования уровня компонентов Direct3D 11.0
    • Аппаратная поддержка форматов Direct3D 10Level9
    • Поддержка оборудования для форматов Direct3D 10.1
    • Аппаратная поддержка форматов Direct3D 10

    Перечисление адаптеров

    Адаптер — это абстракция аппаратных и программных возможностей компьютера. На вашем компьютере, как правило, есть много адаптеров. Некоторые устройства реализованы в виде оборудования (например, видео карта), а некоторые — в программном обеспечении (например, эталонный растеризатор Direct3D). Адаптеры реализуют функциональные возможности, используемые графическим приложением. На следующей схеме показана система с одним компьютером, двумя адаптерами (видеоадаптерами) и тремя мониторами вывода.

    схема компьютера с двумя видеоадаптеры и тремя мониторами

    При перечислении этих элементов оборудования DXGI создает интерфейс IDXGIOutput1 для каждого вывода (или монитора) и интерфейс IDXGIAdapter2 для каждого видео карта (даже если это видео карта встроенный в системную плату). Перечисление выполняется с помощью вызова интерфейса IDXGIFactoryIDXGIFactory::EnumAdapters для возврата набора интерфейсов IDXGIAdapter , представляющих видеоустройство.

    Если вы хотите выбрать определенные возможности видеоустройства при использовании API Direct3D, рекомендуется итеративно вызывать функцию D3D11CreateDevice или D3D11CreateDeviceAndSwapChain с каждым дескриптором адаптера и возможным уровнем функций оборудования. Эта функция выполняется успешно, если уровень компонентов поддерживается указанным адаптером.

    Новые сведения о перечислении адаптеров для Windows 8

    Начиная с Windows 8, адаптер с именем Microsoft Basic Render Driver всегда присутствует. Этот адаптер имеет значение VendorId 0x1414 и DeviceID 0x8c. Этот адаптер также имеет значение DXGI_ADAPTER_FLAG_SOFTWARE , заданное в элементе Flags структуры DXGI_ADAPTER_DESC2 . Этот адаптер является устройством только для отрисовки, которое не имеет выходных данных. DXGI никогда не возвращает DXGI_ERROR_DEVICE_REMOVED для этого адаптера.

    Если драйвер дисплея компьютера не работает или отключен, основной адаптер компьютера (NULL) также может называться Microsoft Basic Render Driver. Но у этого адаптера есть выходные данные и не задано значение DXGI_ADAPTER_FLAG_SOFTWARE . Операционная система и приложения используют этот адаптер по умолчанию. Если драйвер дисплея установлен или включен, приложения могут получать DXGI_ERROR_DEVICE_REMOVED для этого адаптера, а затем повторно перечислять адаптеры.

    Если основным видеоадаптером компьютера является microsoft Basic Display Adapter (АДАПТЕР WARP ), этот компьютер также имеет второй адаптер. Этот второй адаптер является устройством только для отрисовки, которое не имеет отображаемых выходных данных и для которого DXGI никогда не возвращает DXGI_ERROR_DEVICE_REMOVED.

    Если вы хотите использовать WARP для отрисовки, вычислений или других длительных задач, рекомендуется использовать устройство только для отрисовки. Вы можете получить указатель на устройство, доступное только для отрисовки, вызвав метод IDXGIFactory1::EnumAdapters1 . Устройство, доступное только для отрисовки, также создается при указании D3D_DRIVER_TYPE_WARP в параметре DriverTypeD3D11CreateDevice, так как устройство WARP также использует адаптер WARP только для отрисовки.

    Уровень представления

    Задача приложения — отрисовка кадров и запрос DXGI для представления этих кадров в выходные данные. Если у приложения есть два доступных буфера, оно может отрисовыть один буфер, представляя другой. Приложению может потребоваться более двух буферов в зависимости от времени, необходимого для отрисовки кадра, или требуемой частоты кадров для представления. Созданный набор буферов называется цепочкой буферов, как показано ниже.

    Иллюстрация цепочки буферов

    • Создание цепочки буферов
    • Уход и кормление цепочки буферов
    • Обработка изменения размера окна
    • Выбор выходных данных и размера DXGI
    • Отладка в режиме Full-Screen
    • Уничтожение цепочки буферов
    • Использование повернутого монитора
    • Переключение режимов
    • Совет по производительности в полноэкранном режиме
    • Рекомендации по многопоточности

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

    Иллюстрация вложенной системы отображения

    Подсистема отображения (которая часто является видео карта но может быть реализована на системной плате) содержит GPU, цифровой аналоговый преобразователь (DAC) и память. Цепочка буферов выделяется в этой памяти, чтобы сделать презентацию очень быстрой. Вложенная система отображения представляет данные из переднего буфера в выходные данные.

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

    Создание цепочки буферов

    Эффект переключения D3D9 Эффект переключения DXGI
    D3DSWAPEFFECT_DISCARD DXGI_SWAP_EFFECT_DISCARD
    D3DSWAPEFFECT_COPY DXGI_SWAP_EFFECT_SEQUENTIAL с 1 буфером
    D3DSWAPEFFECT_FLIP DXGI_SWAP_EFFECT_SEQUENTIAL с 2 или более буферами
    D3DSWAPEFFECT_FLIPEX DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL с 2 или более буферами

    Буферы цепочки буферов создаются в определенном размере и в определенном формате. Приложение задает эти значения (или вы можете наследовать размер из целевого окна) при запуске, а затем при необходимости может изменить их по мере изменения размера окна в ответ на входные данные пользователя или события программы.

    После создания цепочки буферов обычно требуется преобразовать в нее изображения. Ниже приведен фрагмент кода, который настраивает контекст Direct3D для отрисовки в цепочку буферов. Этот код извлекает буфер из цепочки буферов, создает представление render-target-view из этого буфера, а затем задает его на устройстве:

    ID3D11Resource * pBB; ThrowFailure( pSwapChain->GetBuffer(0, __uuidof(pBB), reinterpret_cast(&pBB)), "Couldn't get back buffer"); ID3D11RenderTargetView * pView; ThrowFailure( pD3D11Device->CreateRenderTargetView(pBB, NULL, &pView), "Couldn't create view" ); pD3D11DeviceContext->OMSetRenderTargets(1, &pView, 0); 

    После отрисовки кадра в буфер цепочки буферов вызовите IDXGISwapChain1::P resent1. Затем приложение может перейти на отрисовку следующего изображения.

    Уход и кормление цепочки буферов

    После отрисовки изображения вызовите МЕТОД IDXGISwapChain1::P resent1 и отрисуйте следующее изображение. Это степень вашей ответственности.

    Если вы ранее называли IDXGIFactory::MakeWindowAssociation, пользователь может нажать сочетание клавиш Alt-Enter, и DXGI переключит приложение из оконного режима в полноэкранный режим. Рекомендуется использовать IDXGIFactory::MakeWindowAssociation, так как настоятельно необходим стандартный механизм управления для пользователя.

    Хотя вам не нужно писать больше кода, чем было описано, несколько простых шагов могут повысить скорость реагирования приложения. Наиболее важным аспектом является изменение размера буферов цепочки буферов в ответ на изменение размера окна вывода. Естественно, лучший маршрут приложения — реагировать на WM_SIZE и вызывать IDXGISwapChain::ResizeBuffers, передав размер, содержащийся в параметрах сообщения. Это поведение, очевидно, заставляет приложение хорошо реагировать на пользователя, когда он перетаскивает границы окна, но это также именно то, что обеспечивает плавный переход в полноэкранный режим. Окно будет получать WM_SIZE сообщение всякий раз, когда происходит такой переход, и вызов IDXGISwapChain::ResizeBuffers является шансом цепочки буферов повторно выделить хранилище буферов для оптимального представления. Именно поэтому приложение должно освободить все ссылки на существующие буферы перед вызовом IDXGISwapChain::ResizeBuffers.

    Сбой вызова IDXGISwapChain::ResizeBuffers в ответ на переключение в полноэкранный режим (естественно, в ответ на WM_SIZE) может исключить оптимизацию перелистывания, при этом DXGI может просто поменять отображаемый буфер, а не копировать данные на весь экран.

    IDXGISwapChain1::P resent1 сообщит, если окно вывода полностью заключено через DXGI_STATUS_OCCLUDED. В этом случае рекомендуется, чтобы приложение перешел в режим ожидания (путем вызова IDXGISwapChain1::P resent1 с DXGI_PRESENT_TEST), так как ресурсы, используемые для отрисовки кадра, будут потрачены впустую. Использование DXGI_PRESENT_TEST предотвратит представление любых данных при выполнении проверка окклюзии. Как только IDXGISwapChain1::P resent1 вернет S_OK, следует выйти из режима ожидания; Не используйте код возврата для переключения в резервный режим, так как это может оставить цепочку буферов не в состоянии отказаться от полноэкранного режима.

    Среда выполнения Direct3D 11.1, которая доступна, начиная с Windows 8, предоставляет цепочку буферов с использованием модели переворачивания (т. е. цепочку буферов, которая содержит значение DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, заданное в элементе SwapEffectDXGI_SWAP_CHAIN_DESC или DXGI_SWAP_CHAIN_DESC1). При представлении кадров в выходные данные с помощью цепочки буферов модели переворачивания DXGI отменяет привязку обратного буфера из всех расположений состояния конвейера, таких как целевой объект отрисовки вывода и слияния, которые записывают данные в задний буфер 0. Поэтому рекомендуется вызывать ID3D11DeviceContext::OMSetRenderTargets непосредственно перед отрисовкой в задний буфер. Например, не вызывайте OMSetRenderTargets , а затем выполняйте работу вычислительного шейдера, которая не приводит к отрисовке ресурса. Дополнительные сведения о цепочках буферов модели переворачивания и их преимуществах см. в разделе DXGI Flip Model.

    В Direct3D 10 и Direct3D 11 не нужно вызывать IDXGISwapChain::GetBuffer , чтобы получить обратно буфер 0 после вызова IDXGISwapChain1::P resent1 , так как для удобства удостоверения задних буферов изменяются. В Direct3D 12 этого не происходит, и приложение должно вручную отслеживать индексы буфера.

    Обработка изменения размера окна

    Для обработки изменения размера окна можно использовать метод IDXGISwapChain::ResizeBuffers . Перед вызовом ResizeBuffers необходимо освободить все оставшиеся ссылки на буферы цепочки буферов. Объект, который обычно содержит ссылку на буфер цепочки буферов, является представлением объекта render-target.

    В следующем примере кода показано, как вызывать ResizeBuffers из обработчика WindowProc для WM_SIZE сообщений:

     case WM_SIZE: if (g_pSwapChain) < g_pd3dDeviceContext->OMSetRenderTargets(0, 0, 0); // Release all outstanding references to the swap chain's buffers. g_pRenderTargetView->Release(); HRESULT hr; // Preserve the existing buffer count and format. // Automatically choose the width and height to match the client rect for HWNDs. hr = g_pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0); // Perform error handling here! // Get buffer and create a render-target-view. ID3D11Texture2D* pBuffer; hr = g_pSwapChain->GetBuffer(0, __uuidof( ID3D11Texture2D), (void**) &pBuffer ); // Perform error handling here! hr = g_pd3dDevice->CreateRenderTargetView(pBuffer, NULL, &g_pRenderTargetView); // Perform error handling here! pBuffer->Release(); g_pd3dDeviceContext->OMSetRenderTargets(1, &g_pRenderTargetView, NULL ); // Set up the viewport. D3D11_VIEWPORT vp; vp.Width = width; vp.Height = height; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0; vp.TopLeftY = 0; g_pd3dDeviceContext->RSSetViewports( 1, &vp ); > return 1; 

    Выбор выходных данных и размера DXGI

    По умолчанию DXGI выбирает выходные данные, содержащие большую часть клиентской области окна. Это единственный вариант, доступный DXGI при переходе в полноэкранный режим в ответ на alt-ввод. Если приложение само по себе переходит в полноэкранный режим, оно может вызвать IDXGISwapChain::SetFullscreenState и передать явное значение IDXGIOutput1 (или NULL, если приложение радо разрешить DXGI решить).

    Чтобы изменить размер выходных данных в полноэкранном или оконном режиме, рекомендуется вызвать IDXGISwapChain::ResizeTarget, так как этот метод также изменяет размер целевого окна. Так как размер целевого окна изменен, операционная система отправляет WM_SIZE, и код в ответ будет вызывать IDXGISwapChain::ResizeBuffers . Таким образом, это пустая трата усилий, чтобы изменить размер буферов, а затем изменить размер целевого объекта.

    Отладка в полноэкранном режиме

    Цепочка буферов DXGI отключает полноэкранный режим только при крайней необходимости. Это означает, что можно отлаживать полноэкранное приложение с помощью нескольких мониторов, если окно отладки не перекрывает целевое окно цепочки буферов. Кроме того, можно полностью запретить переключение режима, не устанавливая флаг DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH .

    Если переключение режима разрешено, цепочка буферов будет отказаться от полноэкранного режима всякий раз, когда окно вывода будет заключено другим окном. Проверка окклюзии выполняется во время IDXGISwapChain1::P resent1 или отдельным потоком, целью которого является watch, чтобы проверить, не отвечает ли приложение (и больше не вызывает IDXGISwapChain1::P resent1). Чтобы отключить возможность отдельного потока вызывать переключение, задайте для следующего раздела реестра любое ненулевое значение.

    HKCU\Software\Microsoft\DXGI\DisableFullscreenWatchdog

    Уничтожение цепочки буферов

    Вы не можете освободить цепочку буферов в полноэкранном режиме, так как это может привести к состязанию потоков (что приведет к тому, что DXGI вызовет исключение, не являющееся непрерывным). Перед выпуском цепочки буферов сначала переключитесь в оконный режим (с помощью IDXGISwapChain::SetFullscreenState( FALSE, NULL )), а затем вызовите IUnknown::Release.

    Использование повернутого монитора

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

    • Используйте DXGI_SWAP_CHAIN_FLAG_NONPREROTATED. Это уведомляет DXGI о том, что приложение создаст повернутое изображение (например, путем изменения матрицы проекции). Следует отметить, что этот флаг действителен только в полноэкранном режиме.
    • Выделите каждый буфер цепочки буферов в повернутом размере. При необходимости используйте IDXGIOutput::GetDesc , чтобы получить эти значения.

    Выполняя ротацию в приложении, DXGI просто выполняет копирование, а не копирование и поворот.

    Среда выполнения Direct3D 11.1, доступная начиная с Windows 8, предоставляет цепочку буферов модели переворачивания (т. е. цепочку буферов, которая содержит значение DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, заданное в элементе SwapEffectDXGI_SWAP_CHAIN_DESC1). Чтобы максимально повысить эффективность оптимизации презентации, доступных с помощью цепочки буферов модели переворачивания, рекомендуется настроить ориентацию содержимого приложений в соответствии с конкретными выходными данными, на которых находится содержимое, когда это содержимое полностью занимает выходные данные. Дополнительные сведения о цепочках буферов модели переворачивания и их преимуществах см. в разделе DXGI Flip Model.

    Переключение режимов

    Цепочка буферов DXGI может изменить режим отображения выходных данных при выполнении полноэкранного перехода. Чтобы включить автоматическое изменение режима отображения, необходимо указать DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH в описании цепочки буферов. Если режим отображения изменится автоматически, DXGI выберет самый скромный режим (размер и разрешение не изменятся, но глубина цвета может измениться). Изменение размера буферов цепочки буферов не вызовет переключение режима. Цепочка буферов дает неявное обещание, что если выбрать задний буфер, который точно соответствует режиму отображения, поддерживаемму целевыми выходными данными, он переключится в этот режим отображения при входе в полноэкранный режим на этом выходе. Следовательно, вы выбираете режим отображения, выбрав размер и формат заднего буфера.

    Советы по повышению производительности в полноэкранном режиме

    При вызове IDXGISwapChain1::P resent1 в полноэкранном приложении цепочка буферов переворачивает содержимое обратного буфера в передний буфер. Для этого необходимо, чтобы цепочка буферов была создана с использованием перечисленного режима отображения (указанного в DXGI_SWAP_CHAIN_DESC1). Если не удается перечислить режимы отображения или неправильно указать режим отображения в описании, цепочка буферов может выполнять передачу битового блока (bitblt). Bitblt вызывает дополнительную растягивающую копию, а также некоторое увеличение использования видеопамять, и его трудно обнаружить. Чтобы избежать этой проблемы, перечислите режимы отображения и правильно инициализируйте описание цепочки буферов перед созданием цепочки буферов. Это обеспечит максимальную производительность при перелистывание в полноэкранном режиме и избежать дополнительных затрат на память.

    Рекомендации по многопотоковой работе

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

    • Поток отрисовки не является потоком потока потока сообщений.
    • Поток, выполняющий API DXGI, не является потоком, создающим окно.

    Будьте осторожны, чтобы поток конвейера сообщений никогда не ждал в потоке отрисовки при использовании полноэкранных цепочек буферов. Например, вызов IDXGISwapChain1::P resent1 (из потока отрисовки) может привести к тому, что поток отрисовки будет ожидать потока потоков сообщений. При изменении режима этот сценарий возможен, если Present1 вызывает ::SetWindowPos() или ::SetWindowStyle() и любой из этих методов вызывает ::SendMessage(). В этом сценарии, если поток потока потоков сообщений имеет критически важный раздел, охраняющий его, или поток отрисовки заблокирован, то два потока будут взаимоблокированы.

    Дополнительные сведения об использовании DXGI с несколькими потоками см. в разделе Многопоточность и DXGI.

    Ответы DXGI от DLLMain

    Так как функция DllMain не может гарантировать порядок, в котором она загружает и выгружает библиотеки DLL, мы рекомендуем не вызывать функции и методы Direct3D или DXGI, включая функции или методы, создающие или освобождающие объекты. Если функция DllMain вашего приложения вызывает определенный компонент, этот компонент может вызвать другую библиотеку DLL, которая отсутствует в операционной системе, что приводит к сбою операционной системы. Direct3D и DXGI могут загружать набор библиотек DLL, обычно набор драйверов, который отличается от компьютера к компьютеру. Таким образом, даже если ваше приложение не завершает работу на компьютерах разработки и тестирования, когда его функция DllMain вызывает функции или методы Direct3D или DXGI, оно может завершиться сбоем при запуске на другом компьютере.

    Чтобы предотвратить создание приложения, которое может привести к аварийному завершению работы операционной системы, DXGI предоставляет следующие ответы в указанных ситуациях:

    • Если функция DllMain вашего приложения освобождает последнюю ссылку на фабрику DXGI, DXGI создает исключение.
    • Если функция DllMain приложения создает фабрику DXGI, DXGI возвращает код ошибки.

    Изменения DXGI 1.1

    Мы добавили следующие функции в DXGI 1.1.

    • Поддержка синхронизированных общих поверхностей Синхронизированные общие поверхности для Direct3D 10.1 и Direct3D 11 обеспечивают эффективное совместное использование поверхностей чтения и записи между несколькими устройствами Direct3D (возможно совместное использование между устройствами Direct3D 10 и Direct3D 11). См . статьи IDXGIKeyedMutex::AcquireSync и IDXGIKeyedMutex::ReleaseSync.
    • Поддержка высокого цвета Поддерживает формат DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM.
    • IDXGIDevice1::SetMaximumFrameLatency и IDXGIDevice1::GetMaximumFrameLatency
    • IDXGIFactory1::EnumAdapters1 перечисляет локальные адаптеры без подключенных мониторов или выходных данных, а также адаптеры с подключенными выходами. Первым возвращенным адаптером будет локальный адаптер, на котором отображается основной рабочий стол.
    • Поддержка формата BGRA DXGI_FORMAT_B8G8R8A8_UNORM и DXGI_FORMAT_B8G8R8A8_UNORM_SRGB см. в разделах IDXGISurface1::GetDC и IDXGISurface1::ReleaseDC.

    Изменения DXGI 1.2

    Мы добавили следующие функции в DXGI 1.2.

    • Стерео цепочка буферов
    • Цепочка буферов модели flip
    • Оптимизированная презентация (прокрутка, грязное прямоугольники и поворот)
    • Улучшены общие ресурсы и синхронизация
    • Дублирование рабочего стола
    • Оптимизированное использование видеопамять
    • Поддержка форматов 16 бит на пиксель (bpp) (DXGI_FORMAT_B5G6R5_UNORM, DXGI_FORMAT_B5G5R5A1_UNORM, DXGI_FORMAT_B4G4R4A4_UNORM)
    • API отладки

    Дополнительные сведения о DXGI 1.2 см. в разделе Улучшения DXGI 1.2.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *