首次启动后 SDL 窗口中没有背景

问题描述 投票:0回答:1

我有一个使用 SDL2 的简单 C 程序:

#include <stdio.h>
#include <SDL2/SDL.h>

int main(int argc, char** argv) {
  if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
    return 1;
  }

  SDL_Window* window = SDL_CreateWindow(
      "Hello, SDL2!",
      SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
      200, 400,
      SDL_WINDOW_SHOWN
  );

  if (window == NULL) {
    const char* error_message = SDL_GetError();
    printf("error creating window: %s\n", error_message);
    SDL_Quit();
    return 1;
  }

  SDL_Surface* surface = SDL_GetWindowSurface(window);
  if (surface == NULL) {
    const char* error_message = SDL_GetError();
    printf("surface is NULL. error: %s\n", error_message);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 1;
  }

  if (SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 0, 255, 0)) != 0) {
    const char* error_message = SDL_GetError();
    printf("FillRect failed. error: %s\n", error_message);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 1;
  }
  
  if (SDL_UpdateWindowSurface(window) != 0) {
    const char* error_message = SDL_GetError();
    printf("UpdateWindowSurface failed. error: %s\n", error_message);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 1;
  }

  SDL_Delay(2000);

  SDL_DestroyWindow(window);
  SDL_Quit();
  return 0;
}

第一次启动时,我看到一个绿色背景的窗口,但之后每个启动窗口都是完全透明的,并且没有报告错误。这就是我所看到的:

它实际上并不是透明的,它只是将窗口后面的像素作为背景。如果我稍微移动一下就会发生这样的情况:

我还尝试用其他编程语言(Zig)重写相同的代码,并且行为是相同的:在第一次启动时,我再次看到一个绿色窗口,但在每次下一次启动时,它都会以同样的方式出现错误。

我的系统是Archlinux,桌面是X11上的KDE/Plasma。这种行为的原因可能是什么?

UPD: 添加事件循环对这种情况没有帮助。

c event-handling sdl-2
1个回答
0
投票

正如@HolyBlackCat在评论中提到的,没有事件循环可能会出现图形错误,事件循环不仅必须存在,而且还包括更新窗口表面。

SDL_Event evt;
while (1) {
  if (SDL_PollEvent(&evt) != 0) {
    if (e.type == SDL_QUIT) {
      break;
    } else if (e.type == SDL_WINDOWEVENT) {
      if (e.window.event == SDL_WINDOWEVENT_EXPOSED) {
        SDL_UpdateWindowSurface(window);
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.