Должна ли каждая текстура иметь свой собственный рендерер в SDL?

Я пытаюсь изучить SDL2 и испытываю трудности с практической точки зрения. Я чувствую, что у меня есть хорошее понимание окон SDL, средств визуализации и текстур с абстрактной точки зрения. Тем не менее, я чувствую, что мне нужно больше знать о том, что происходит под капотом, чтобы использовать их соответствующим образом.

Например, при создании текстуры мне необходимо предоставить ссылку на визуализатор. Я нахожу это странным. Текстура выглядит так, как будто это ресурс, который загружается в VRAM. Зачем мне нужно давать ресурсу ссылку на рендерер? Я понимаю, почему было бы необходимо дать рендереру ссылку на текстуру, однако, наоборот, это не имеет никакого смысла.

Так что это приводит к другому вопросу. Поскольку каждая текстура требует рендерера, должна ли каждая текстура иметь свой собственный рендерер, или несколько текстур должны иметь общий рендерер?

Я чувствую, что есть последствия, идущие по одному маршруту против другого.

1 ответ

Решение

Короткие ответы

Я считаю, что причина, по которой SDL_Texture требует рендерера, заключается в том, что некоторые реализации бэкэнда (OpenGL?) Имеют контексты (это, по сути, то, что SDL_Renderer is), и данные изображения должны быть связаны с этим конкретным контекстом. Вы не можете использовать текстуру, созданную в одном контексте внутри другого.

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


Как правильно указывает @keltar, никто из рендерера не будет работать с текстурой, созданной другим рендерером из-за регистрации SDL_RenderCopy, Тем не менее, это строго требование API для обеспечения согласованности. Выше я хочу подчеркнуть, что даже если бы эта проверка отсутствовала, она не работала бы для бэкэндов, таких как OpenGL, но нет технической причины, по которой она не будет работать для программного средства рендеринга.,


Некоторые подробности о SDL_Renderer

Помни что SDL_Renderer абстрактный интерфейс для нескольких возможных бэкэндов (OpenGL, OpenGLES, D3D, Metal, Software и т. д.). Каждый из них, возможно, будет иметь ограничения на обмен данными между контекстами, и поэтому SDL должен ограничивать себя таким же образом, чтобы поддерживать здравый смысл.

Пример ограничений OpenGL

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

Как вы можете видеть из этой страницы, что обмен между контекстами имеет ограничения.

  1. Совместное использование может происходить только в той же реализации OpenGL

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

  1. Вы можете обмениваться данными между различными контекстами OpenGL... Это делается с помощью расширений для ОС

Поскольку SDL является кроссплатформенным, это означает, что для каждой платформы им придется писать специальный код, и все реализации OpenGL могут вообще не поддерживать его, поэтому лучше для SDL просто не поддерживать это.

  1. каждый дополнительный контекст рендеринга оказывает значительное влияние на производительность приложений

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

Последнее замечание: "S" в SDL означает "простой". Если вам нужно обмениваться данными между контекстами, SDL - просто неправильный инструмент для работы.

Другие вопросы по тегам