Подтвердить что ты не робот

В чем смысл текстуры SDL2?

Я как бы зациклился на логике текстуры SDL2. Для меня они бессмысленны, так как вы не можете привлечь к ним.

В моей программе у меня есть несколько поверхностей (или то, что было поверхностями, прежде чем я переключился на SDL2), которые я только что объединил, чтобы сформировать слои. Теперь, кажется, мне нужно создать несколько рендерингов и текстур, чтобы создать тот же эффект, поскольку SDL_RenderCopy принимает указатель текстуры.

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

Все это кажется чрезвычайно громоздким и медленным. Я что-то упускаю? Есть ли способ напрямую рисовать текстуру? Какова точка текстур, и могу ли я иметь несколько (если не сотни) рендереров вместо поверхностей?

4b9b3361

Ответ 1

SDL_Texture объекты хранятся как можно ближе к памяти видеокарты и поэтому могут быть легко ускорены вашим GPU. Повышение размера, альфа-смешивание, сглаживание и почти любая операция с тяжелыми вычислениями могут сильно повлиять на это повышение производительности. Если вашей программе необходимо запустить логику на пиксель в ваших текстурах, вам рекомендуется временно преобразовать текстуры в поверхности. Также возможно выполнение обходного пути с потоковыми текстурами.

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

Если вы предпочитаете использовать рабочий процесс Texture -> Surface -> Texture, чтобы применить операцию на пиксель, убедитесь, что вы кешируете свою окончательную текстуру, если вам не нужно пересчитывать ее в каждом цикле рендеринга. Текстуры в этом решении создаются с флагом SDL_TEXTUREACCESS_STATIC.

Потоковые текстуры (флаг создания SDL_TEXTUREACCESS_STREAMING) рекомендуется использовать в случаях, когда источником данных пикселя является сеть, устройство, сервер кадров или какой-либо другой источник, который выходит за пределы охвата приложений SDL, и когда очевидно, что кэширование кадров из источника неэффективно или не работает.

Можно создавать поверх текстур, если они созданы с флагом SDL_TEXTUREACCESS_TARGET. Это ограничивает источник операции рисования другими текстурами, хотя это может быть уже в первую очередь. "Текстуры как объекты рендеринга" - одна из новейших и наименее широко поддерживаемых функций SDL2.

Информация о Nerd для любопытных читателей:

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

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

Шейдеры записываются в GLSL, язык, который компилируется в сборку графического процессора. Ускорение аппаратного/графического ускорения фактически относится к коду, распараллеленному на ядрах графического процессора, и использование шейдеров - предпочтительный способ достижения этого для целей рендеринга.

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

TL;DR; Это быстрее обрабатывать и обрабатывать текстуры, чем поверхности, хотя их изменение иногда может быть затруднено.

Ответ 2

Создавая текстуру SDL2 как тип STREAMING, можно заблокировать и разблокировать всю текстуру или просто область пикселей для выполнения операций с прямым пикселем. Необходимо создать ранее поверхность SDL2 и связать с блокировкой-разблокировкой следующим образом:

SDL_Surface surface = SDL_CreateSurface(..);
SDL_LockTexture(texture, &rect, &surface->pixels, &surface->pitch);
// paint into surface pixels
SDL_UnlockTexture(texture);

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

Я испытал разумную производительность, и модель использования не слишком сложна для понимания.

Ответ 3

В SDL2 можно визуализировать off-screen/render непосредственно текстуре. Используемая функция:

int SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture);

Это работает только в том случае, если рендеринг разрешает SDL_RENDERER_TARGETTEXTURE.