跳到内容

SDL (简单直接媒体层) - 渲染表面

来自维基教科书,开放书籍,开放世界

在本节中,我们将修改代码以使用 SDL_ConvertSurface 优化 SDL_Surface 的 blitting,并使用 SDL_BlitScaled 将图像拉伸到全屏。

您可以在此 GitLab 仓库 中下载本节的源代码。所有源代码都存储在 此组 中。

优化 SDL_Surface 以进行 blitting

[编辑 | 编辑源代码]

我们可以优化 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_Surface 渲染到全屏

[编辑 | 编辑源代码]

我们将使用 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 等相比是一个相对较小的结构,因此我们不必为它动态分配内存。

华夏公益教科书