SDL2 / поверхность / текстура / визуализация

Я пытаюсь изучить SDL2. Основное различие (как я вижу) между старыми SDL и SDL2 заключается в том, что у старого SDL было окно, представленное его поверхностью, все изображения были поверхностями, и все операции с изображениями и блики были поверхность к поверхности. В SDL2 у нас есть поверхности и текстуры. Если я правильно понял, поверхности находятся в ОЗУ, а текстуры-в графической памяти. Это правда?

моя цель-сделать объектно-ориентированную оболочку для SDL2, потому что у меня была аналогичная вещь для SDL. Я хочу иметь окно класса и изображение класса (имеет частную текстуру и поверхность). Окно будет иметь его содержимое, представленное экземпляром класса picture, и все blits будут picture to picture object blits. Как организовать эти операции изображения:

  1. пиксельная манипуляция должна быть на уровне поверхности?
  2. если я хочу скопировать часть одного изображения в другое без рендеринга, это должно быть на уровне поверхности?
  3. должен ли я blit поверхность текстуры только тогда, когда я хотите отобразить его на экране?
  4. лучше ли визуализировать все это на одной поверхности, а затем визуализировать его в текстуру окна или визуализировать каждое изображение в текстуру окна отдельно?

вообще, когда я должен использовать поверхность и когда я должен использовать текстуру?

Спасибо за ваше время и помощь и предложения приветствуются :)

1 ответов


сначала мне нужно прояснить некоторые ошибочные представления:рендеринг на основе текстуры не работает, как старый рендеринг поверхности. Пока вы можете использовать SDL_Surfaces в качестве источника или назначения, SDL_TextureS предназначены для использования в качестве источника для рендеринга и бесплатного SDL_Renderer используется в качестве пункта назначения. Как правило, вам придется выбирать между старой платформой рендеринга, которая полностью выполняется на CPU, и новой, которая подходит для GPU, но возможно смешивание.

так для вас вопросы:

  1. текстуры не обеспечивают прямого доступа к пикселям, поэтому лучше делать на поверхностях.
  2. зависит. Не помешает скопировать на текстуры, если это не очень часто и вы хотите сделать его ускоренным позже.
  3. когда речь идет о текстурах вы всегда воздаст SDL_Renderer, и всегда лучше предварительно загружать на поверхности текстуры.
  4. как я объяснил в первом абзаце, текстура окна отсутствует. Вы можете использовать полностью рендеринг на основе поверхности или полностью текстурный рендеринг. Если вам действительно нужны оба (если вы хотите иметь прямой доступ к пикселям и ускоренный рендеринг), лучше сделать, как вы сказали: blit все на одну поверхность, а затем загрузить в текстуру.

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