Когда XNA отбрасывает содержимое Render Target? - PullRequest
3 голосов
/ 01 августа 2011

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

Я хотел бы просто нарисовать объект рендеринга один раз, а затем использовать его как Texture2D на неопределенный срок. Это возможно? Нужно ли мне включить RenderTargetUsage.PreserveContents, чтобы это работало правильно? Я читал, что PreserveContents очень медленный на Xbox и аппаратном обеспечении телефона.

Ответы [ 2 ]

7 голосов
/ 01 августа 2011

Джонатан дал отличное объяснение RenderTargetUsage, но я хотел бы уточнить некоторые вещи относительно исходного вопроса, включая использование RenderTarget2D в качестве Texture2D:

Проще говоря, RenderTargetUsage контролирует поведение поверхности, когда она установлена ​​на устройстве в качестве цели рендеринга.Если не установлено сохранение содержимого, они будут удалены.На Xbox 360 это происходит как причуды аппаратного обеспечения (для производительности).В Windows это эмулируется для соответствия Xbox 360, просто очищая поверхность при ее установке.

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

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

Что вас волнует, так это свойство IsContentLost ( MSDN *)1019 *) или событие ContentLost ( MSDN ).Они будут установлены / подняты, если содержимое, которое вы визуализировали для цели рендеринга, было потеряно (из-за изменений устройства, например: переход в полноэкранный режим).

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

(Обратите внимание, что вымне не нужно беспокоиться о потере контента, происходящем на полпути во время вашего Draw вызова. Я вполне уверен, что это может произойти только между кадрами.)

4 голосов
/ 01 августа 2011

Во-первых, в отношении RenderTargetUsage.PreserveContents ваше чтение правильное.Существуют некоторые аппаратные ограничения (по крайней мере, для XBox), которые не позволяют ему сохранять содержимое резервного буфера изначально, это означает, что его необходимо скопировать в системную RAM до того, как произойдет возможный сброс, и затем скопировать обратно.

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

Если выЕсли вы сомневаетесь, установите среду выполнения для разработчика DirectX при разработке приложения (которое является частью любого пакета DirectX SDK ) - у него есть опция принудительного удаления обратных буферов (потому что на платформе ПК резервные буферы не гарантируютсябыть сброшенным, даже если PreserveContents не установлен).

...