Управление ресурсами устройства
Обновлен: Ноябрь 2007
В управляемом программировании Direct3D для мобильных устройств имеется два основных типа ресурсов: ресурсы, которые должны повторно создаваться при сбросе состояния устройства, и ресурсы, для которых это не требуется. При сбросе состояния устройства объекты различных типов могут заполняться или не заполняться данными. В отличие от средств Direct3D в приложениях для настольных компьютеров, пул памяти, используемый для создания ресурса, не является фактором, определяющим, должен ли ресурс повторно создаваться при сбросе устройства.
Использование пулов памяти
В управляемом программировании Direct3D для мобильных устройств имеется три пула памяти:
Система
Выделяется в обычной системной памяти мобильного устройства, обычно более медленной в использовании, чем видеопамять.
Видео
Выделяется в области памяти, которая специально предназначена для использования видеоаппаратурой мобильного устройства. На некоторых устройствах видеопамять может быть очень ограниченным ресурсом.
Управляемая память
Видеопамять выделяется в качестве кэша системной памяти. Для реализации схемы кэширования драйвер может использовать несколько алгоритмов, включая алгоритм замены LRU (с наиболее давним использованием).
Если текстура или другой ресурс создается в управляемом пуле, для текстуры выделяется пространство в пуле системной памяти. Если текстура назначается на этапе создания текстур при помощи метода SetTexture, текстура загружается в пул видеопамяти и удерживается в нем, пока она не становится элементом с наиболее давним использованием, после чего она удаляется, чтобы освободить пространство для другого ресурса. Если в видеопамяти необходимо выделить место для загрузки управляемой поверхности, и ни один из элементов не удовлетворяет определению алгоритма LRU, драйвер должен использовать свойство Priority, чтобы определить, какой из ресурсов управляемой памяти должен быть удален из видеопамяти.
В управляемом пуле можно создавать ресурсы VertexBuffer, IndexBuffer и Texture, но при этом в нем нельзя создавать передние и задние буферы, буферы глубины и поверхности изображений.
Чтобы определить при создании ресурса, какие пулы памяти доступны, можно использовать экземпляр структуры SurfaceCaps.
Мобильное устройство может поддерживать различные пулы памяти для различных типов ресурсов. Драйверы экрана указывают свою поддержку пула управляемых ресурсов при помощи свойства SupportsManagedPool структуры SurfaceCaps. Если это свойство имеет значение true, устройство поддерживает управляемый пул для ресурсов VertexBuffer, IndexBuffer и Texture. Приложение не может создать поверхность из управляемого пула, если драйвер не поддерживает управляемый пул. Если устройство поддерживает для текстур как пул системной памяти, так и пул видеопамяти, приложение может реализовать свою собственную схему кэширования памяти, используя метод UpdateTexture.
Приложение может также принудительно загрузить поверхность в видеопамять заранее при помощи метода PreLoad объекта Resource. Этот метод вызывает отбрасывание необходимого числа байтов и немедленную загрузку поверхности.
Наконец, приложение может также принудительно заставить управляемый ресурс отбросить определенное число байт при помощи метода ResourceManagerDiscardBytes объекта Device. Этот метод принимает число байт, которые нужно отбросить, в качестве параметра. Если приложение передает значение 0, сбрасываются все управляемые байты видеопамяти.
Все методы, контролирующие диспетчер ресурсов, действуют немедленно; они не буферизуются в буфере команд. Помимо этого, они заканчиваются неудачей, если устройство не поддерживает управляемый пул.
Экземпляры объектов и их жизненный цикл
При сбросе состояния управляемого устройства и при использовании индексных буферов или буферов вершин необходимо использовать соответствующие конструкторы, чтобы объекты создавались с соответствующими сроками существования.
Средства Windows Mobile Direct3D на смартфоне или карманном ПК поддерживают существование только одного экземпляра Device в любой момент времени. Можно использовать статический метод ReleaseD3DMobile объекта Manager для удаления всех ресурсов устройства Direct3D, чтобы можно было запустить другое приложение Windows Mobile Direct3D на том же карманном ПК или смартфоне.
Следующие объекты должны создаваться заново, когда сбрасывается Device. Повторное создание может быть выполнено в обработчике событий для события DeviceReset.
Объекты Texture.
Объекты Mesh.
Объекты Surface.
Объекты VertexBuffer, которые были созданы при помощи конструктора VertexBuffer(Device, Int32, Usage, VertexFormats, Pool).
Объекты IndexBuffer, которые были созданы при помощи конструктора IndexBuffer(Device, Int32, Usage, Pool, Boolean).
Следующие объекты не должны создаваться заново, когда сбрасывается Device:
Объекты Font.
Объекты Sprite.
Объекты VertexBuffer, созданные при помощи конструктора VertexBuffer(Type, Int32, Device, Usage, VertexFormats, Pool).
Объекты IndexBuffer, созданные при помощи конструктора IndexBuffer(Type, Int32, Device, Usage, Pool).
Объекты Font и Sprite автоматически выполняют все необходимые действия в ответ на сброс состояния устройства.
Объекты IndexBuffer и VertexBuffer автоматически создают себя повторно при сбросе устройства, но внутри них не будет данных. Можно определить обработчик событий для события IndexBuffer.Created или VertexBuffer.Created, чтобы заполнять индексный буфер или буфер вершин данными после сброса устройства.
См. также
Другие ресурсы
Мобильное программирование Direct3D в .NET Compact Framework