SDL (简单直接媒体层) - 渲染表面
外观
在本节中,我们将修改代码以使用 SDL_ConvertSurface
优化 SDL_Surface
的 blitting,并使用 SDL_BlitScaled
将图像拉伸到全屏。
您可以在此 GitLab 仓库 中下载本节的源代码。所有源代码都存储在 此组 中。
我们可以优化 SDL_Surface
以进行 blitting,这反过来又会提高性能。SDL_ConvertSurface
用于优化图像以实现更快的重复 blitting。这是通过转换原始图像并将结果存储为新的表面来实现的。
我们将使用以下代码更新我们的 wb_loadImage
函数。
/* Set temporary SDL_Surface */
SDL_Surface *temp = NULL;
/* Load the image from its file path to a SDL_Surface */
temp = IMG_Load(WB_IMAGE_PATH);
if (temp == NULL) {
fprintf(stderr, "WikiBook failed to load image: %s\n", IMG_GetError());
return -1;
}
/* Optimise SDL_Surface for blitting */
wb->image = SDL_ConvertSurface(temp, wb->screen->format, 0);
/* Destroy temporary SDL_Surface */
SDL_FreeSurface(temp);
请记住使用相应的函数销毁 SDL 对象指针,在本例中为 SDL_FreeSurface
。
我们将使用 SDL_BlitScaled
替换 SDL_BlitSurface
。我们将编写一个静态(因此是私有的)函数,该函数将表面渲染到全屏。
/* Maximise surface to full screen */
static int setSurfaceFullScreen(SDL_Surface *surface, SDL_Surface *screen) {
/* Create SDL_Rect to full screen */
SDL_Rect rt = { 0, 0, WB_WIDTH, WB_HEIGHT };
/* Blit SDL_Surface to the size of SDL_Rect */
if (SDL_BlitScaled(surface, NULL, screen, &rt) < 0) {
fprintf(stderr, "Failed to set surface to full screen: %s\n", SDL_GetError());
return -1;
}
return 0;
}
我们将需要使用整个窗口的大小初始化并声明一个 SDL_Rect
,并使用该 SDL_Rect
的尺寸进行表面 blitting。
我们在 wb_loadImage
中替换 blitting 函数
/* Blit SDL_Surface to full screen */
if (setSurfaceFullScreen(wb->image, wb->screen) < 0) {
return -1;
}
您会注意到我们没有声明 SDL_Rect
指针,它与 SDL_Surface
等相比是一个相对较小的结构,因此我们不必为它动态分配内存。