Что такое SDL-рендерер?
-
21-12-2019 - |
Вопрос
Я начинаю с SDL2, и у меня возникли проблемы с попыткой понять, что такое SDL_Renderer.
Что это такое?Что оно делает?В чем разница между SDL_Renderer, SDL_Window, SDL_Surface и SDL_Texture и как они связаны?
У меня возникли проблемы с этим при попытке понять этот вводный код:
#include <iostream>
#include <SDL2/SDL.h>
int main()
{
/* Starting SDL */
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
return 1;
}
/* Create a Window */
SDL_Window *window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
if (window == nullptr) {
std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
return 1;
}
/* Create a Render */
SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (render == nullptr) {
std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
return 1;
}
/* Load bitmap image */
SDL_Surface *bmp = SDL_LoadBMP("./Tutorial/res/Lesson1/hello.bmp");
if (bmp == nullptr) {
std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
return 1;
}
/* Upload surface to render, and then, free the surface */
SDL_Texture *texture = SDL_CreateTextureFromSurface(render, bmp);
SDL_FreeSurface(bmp);
if (texture == nullptr){
std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
return 1;
}
/* Draw the render on window */
SDL_RenderClear(render); // Fill render with color
SDL_RenderCopy(render, texture, NULL, NULL); // Copy the texture into render
SDL_RenderPresent(render); // Show render on window
/* Wait 2 seconds */
SDL_Delay(5000);
/* Free all objects*/
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(render);
SDL_DestroyWindow(window);
/* Quit program */
SDL_Quit();
return 0;
}
Я использовал учебник Twinklebear (предложенный в SDL Wiki), а также просмотрел документацию SDL Wiki и некоторые книги.Но все они предполагают, что я знаю эти определения.
Решение
SDL_окно
SDL_Window
это структура, которая содержит всю информацию о самом окне:размер, положение, полноэкранный режим, границы и т. д.
SDL_Renderer
SDL_Renderer
— это структура, которая обрабатывает весь рендеринг.Он привязан к SDL_Window
поэтому он может рендериться только внутри этого SDL_Window
.Он также отслеживает настройки, связанные с рендерингом.Есть несколько важных функций, связанных с SDL_Renderer
SDL_SetRenderDrawColor(renderer, r, g, b, a);
Это устанавливает цвет, который вы очищаете на экране (см. ниже).SDL_RenderClear(renderer);
Это очищает цель рендеринга с цветом рисования, установленным выше.SDL_RenderCopy(
Вероятно, это функция, которую вы будете использовать чаще всего, она используется для рендерингаSDL_Texture
и имеет следующие параметры:SDL_Renderer* renderer,
Средство визуализации, которое вы хотите использовать для рендеринга.SDL_Texture* texture,
Текстура, которую вы хотите визуализировать.const SDL_Rect* srcrect,
Часть текстуры, которую вы хотите визуализировать. NULL, если вы хотите визуализировать всю текстуру.const SDL_Rect* dstrect)
Где вы хотите визуализировать текстуру в окне.Если ширина и высота этогоSDL_Rect
меньше или больше размеров самой текстуры, текстура будет растянута в соответствии с этимSDL_Rect
SDL_RenderPresent(renderer);
Другие функции SDL_Render* рисуют скрытую цель.Эта функция возьмет все это и отрисует в окне, привязанном к рендереру.
SDL_Textures и SDL_Surface
А SDL_Renderer
оказывает SDL_Texture
, который хранит информацию о пикселях одного элемента.Это новая версия SDL_Surface
что во многом то же самое.Разница в основном в том, что SDL_Surface
это просто struct
содержащий информацию о пикселях, в то время как SDL_Texture
— это эффективное представление пиксельных данных, зависящее от драйвера.
Вы можете преобразовать SDL_Surface* в SDL_Texture, используя
SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
SDL_Surface* surface)
После этого SDL_Surface следует освободить с помощью
SDL_FreeSurface( SDL_Surface* surface )
Еще одно важное отличие состоит в том, что SDL_Surface
использует программный рендеринг (через ЦП), в то время как SDL_Texture
использует аппаратный рендеринг (через графический процессор).
SDL_Rect
Самая простая структура в SDL.В нем всего четыре короткометражки. x, y
который удерживает позицию и w, h
который содержит ширину и высоту.
Важно отметить, что 0, 0
это верхний левый угол в SDL.Таким образом, более высокий y
-value означает «ниже», а нижний правый угол будет иметь координату x + w, y + h
Вы можете прочитать больше о SDL2 на моем блог.
Другие советы
Подумайте о SDL_Window
как физические пиксели, и SDL_Renderer
и место для хранения настроек / контекста.
Так вы создаете кучу ресурсов и подвесную их рендерера;А потом, когда он готов, вы говорите рендереру, чтобы поставить все это все вместе и отправлять результаты в окно.