SDL2/Поверхность/Текстура/Render

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

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

  • Пиксельная манипуляция должна быть на уровне поверхности?
  • Если я хочу скопировать часть одной картинки в другую без ее рендеринга, она должна быть на уровне поверхности?
  • Должен ли я заливать поверхность текстурой только тогда, когда я хочу отобразить ее на экране?
  • Лучше ли отображать все это на одной поверхности, а затем отображать ее в текстуре окна или отдельно отображать каждую картинку в текстуру окна?

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

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

Ответ 1

Сначала мне нужно прояснить некоторые заблуждения: рендеринг на основе текстур не работает, как это делал старый рендеринг поверхности. Хотя вы можете использовать SDL_Surface как источник или пункт назначения, SDL_Texture предназначены для использования в качестве источника для рендеринга, а бесплатный SDL_Renderer используется как пункт назначения. Как правило, вам придется выбирать между старой средой рендеринга, которая полностью выполняется на процессоре, а новая - для графического процессора, но возможно смешение.

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

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

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