SDL_FiillRect():不支持的表面格式或分段错误
SDL_FiillRect(): Unsupported surface format or Segmentation fault
我有一个小的 SDL2 程序可以创建一个白色 window。它工作得很好。但是当我尝试使用函数 SDL_CreateRenderer()
创建 SDL_Renderer
时,函数 SDL_FillRect()
突然失败并出现以下错误: SDL_FillRect(): Unsupported surface格式。有时,该函数不会 return 出错,但会产生分段错误!!
这是我的初始化函数的代码,这是我程序的第一个函数:
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;
}
有什么想法吗?
您应该避免使用 SDL_GetWindowSurface(),因为表面可能会变得无效。
相反,如果您绝对想要 'software' 缓慢的渲染:
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_FillRect() 你应该使用 SDL_RenderFillRect().
您正在使用 windows' 表面并尝试在同一个 window 上使用渲染器。这是不允许的。来自 SDL_GetWindowSurface 的文档:
You may not combine this with 3D or the rendering API on this window.
我想,创建渲染器会立即使表面中的某些内容无效。
我有一个小的 SDL2 程序可以创建一个白色 window。它工作得很好。但是当我尝试使用函数 SDL_CreateRenderer()
创建 SDL_Renderer
时,函数 SDL_FillRect()
突然失败并出现以下错误: SDL_FillRect(): Unsupported surface格式。有时,该函数不会 return 出错,但会产生分段错误!!
这是我的初始化函数的代码,这是我程序的第一个函数:
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;
}
有什么想法吗?
您应该避免使用 SDL_GetWindowSurface(),因为表面可能会变得无效。
相反,如果您绝对想要 'software' 缓慢的渲染:
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_FillRect() 你应该使用 SDL_RenderFillRect().
您正在使用 windows' 表面并尝试在同一个 window 上使用渲染器。这是不允许的。来自 SDL_GetWindowSurface 的文档:
You may not combine this with 3D or the rendering API on this window.
我想,创建渲染器会立即使表面中的某些内容无效。