Это не динамическое изменение размера, нет; единственная проблема с использованием RenderTarget2D, как если бы это был Texture2D, заключается в том, что содержимое является изменчивым. Я использую цель закадрового рендера с заданным размером. Я не уверен, что вы предлагаете.

уб, учусь каждый день. Я только что разработал, как объединить несколько текстур в одну, используя RenderTarget2D. Однако, хотя я могу использовать RenderTarget2D в качестве Texture2D для большинства целей, есть критическое различие: эти визуализированные текстуры теряются при изменении размера буферного буфера (и, без сомнения, при других обстоятельствах, например, на графическом устройстве с нехваткой памяти).

На данный момент я просто копирую готовый RenderTarget2D в новый энергонезависимый объект Texture2D. Мой код, чтобы сделать это довольно глупо, хотя. Есть ли более изящный способ сделать это? Может быть, я просто устал, но я не могу найти ответ на Google или SO.

Немного упрощено:

public static Texture2D  MergeTextures(int width, int height, IEnumerable<Tuple<Texture2D, Color>> textures)
    {
    RenderTarget2D  buffer = new RenderTarget2D(_device, width, height);

    _device.SetRenderTarget(buffer);
    _device.Clear(Color.Transparent);

    SpriteBatch  spriteBatch = new SpriteBatch(_device);
    spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied);

    // Paint each texture over the one before, in the appropriate color
    Rectangle  rectangle = new Rectangle(0, 0, width, height);
    foreach (Tuple<Texture2D, Color> texture in textures)
        spriteBatch.Draw(texture.Item1, rectangle, texture.Item2);

    spriteBatch.End();
    _device.SetRenderTarget((RenderTarget2D)null);

    // Write the merged texture to a Texture2D, so we don't lose it when resizing the back buffer
    // This is POWERFUL ugly code, and probably terribly, terribly slow
    Texture2D  mergedTexture = new Texture2D(_device, width, height);
    Color[]    content       = new Color[width * height];
    buffer.GetData<Color>(content);
    mergedTexture.SetData<Color>(content);
    return mergedTexture;
    }

Я полагаюдолжен проверьте IsContentLost и повторите визуализацию по мере необходимости, но это происходит в середине моего основного цикла рисования, и, конечно, вы не можете вкладывать SpriteBatches. Я мог бы поддерживать список «render TODO», обрабатывать их после окончания основного SpriteBatch, и тогда они будут доступны для следующего кадра. Это предпочтительная стратегия?

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

Ответы на вопрос(3)

Ваш ответ на вопрос