【问题标题】:SDL_FiillRect(): Unsupported surface format or Segmentation fault [duplicate]SDL_FiillRect():不支持的表面格式或分段错误 [重复]
【发布时间】:2016-07-01 13:45:45
【问题描述】:

我有一个创建白色窗口的小 SDL2 程序。它完美地工作。但是当我尝试使用函数SDL_CreateRenderer() 创建SDL_Renderer 时,函数SDL_FillRect() 突然失败并出现以下错误:SDL_FillRect(): Unsupported surface format。有时,函数不返回错误而是产生分段错误!!

这是我的初始化函数的代码,这是我程序的第一个函数:

SDL_Surface     *screenSurface  = NULL;
SDL_Window      *window         = NULL;
SDL_Renderer    *renderer       = NULL; 

bool initialize() {
  if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_EVENTS) < 0) {
    cout << "SDL could not initialize: " << SDL_GetError() << endl;
    return false;                                                               
  }                                                                             
  window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS);
  if (window == NULL) {                                                         
    cout << "Window error: " << SDL_GetError() << endl;
   return false;                                                               
  }
  if ((screenSurface = SDL_GetWindowSurface(window)) == NULL) {
    cout << "GetWindowSurface() error: << endl;
    return false;
  }

  /*
  ** here, I create my SDL_Renderer. The function returns non NULL
  ** However, if the code is present, SDL_FilRect() fails
  ** if the code is not preset, SDL_FillRect works.
  */ 
  if ((renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED)) == NULL) {
    cout << "Renderer error: " << SDL_GetError() << endl;
    return false;                                                               
  }

  /*
  ** Here, SDL_FillRect sometimes works depending on SDL_CreateRenderer
  ** getUint32Color() is only a custom function that map an enum with Uint32 values
  */
  if (SDL_FillRect(screenSurface, NULL, getUint32Color(WHITE)) < 0) {           
    cout << "SDL_FillRect error: " << SDL_GetError() << endl;
   return false;
  }
  return true;                                                                  
}

有什么想法吗?

【问题讨论】:

  • 你确定 getUint32Color 返回一个有效的颜色吗?如果您使用的是 SDL_Renderer,为什么还要使用 FillRect?如何在屏幕上显示表面?
  • 是的,我确定 getUint32Color(),当我显示它们有效的值时,问题与它无关。我使用 FillRect() 来绘制白色背景,我想使用 SDL_Renderer() 来绘制一条线(我是 SDL 的新手,这可能不是这样做的好方法)。最后,我使用 SDL_UpdateWindowSurface(window) 在屏幕上显示表面,但这并不重要,因为我的代码没有到达这一行。

标签: c++ sdl sdl-2


【解决方案1】:

您应该避免使用 SDL_GetWindowSurface(),因为表面可能会变得无效。

相反,如果您绝对想要缓慢的“软件”渲染:

surface = SDL_CreateRGBSurface(0, W, H, 32, 0x00FF, 0x0000FF, 0x000000FF, 0xFF);

SDL_Texture *texture = SDL_CreateTexture(rendered, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, W, H);

void update_screen() {
    SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch);
    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, texture, NULL, &dest); // src texture, dest
    SDL_RenderPresent(renderer);
}

但正如@Ivan 所说,使用 2D 加速渲染功能要快得多。 您应该使用 SDL_RenderFillRect() 而不是 SDL_FillRect()。

【讨论】:

  • @Jérémy,如果您想要一个带有 SDL_RenderFillRect() 的小而完整的 SDL2 代码示例,请参阅我的 drawpoint 演示。
  • 感谢您的演示,它帮助我更好地了解 SDL。感谢您的回答,我现在只使用渲染器。但我不知道我是否可以接受你的回答,因为这不是我问题的真正解决方案,也不是解释......
【解决方案2】:

您正在使用窗口的表面并尝试在同一窗口上使用渲染器。这是不允许的。来自 SDL_GetWindowSurface 的文档:

您不能将其与 3D 或此窗口上的渲染 API 结合使用。

我猜,创建渲染器会立即使表面上的某些东西失效。

【讨论】:

    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多