所以我得到了以下代码(片段):
_Bool create_new_window(rectanglestruct *rectangle, colorstruct *colorfill, char *winname)
{
....
log_printf("creating main renderer for window ( window : %s )\n", ptr->winname);
// Setup renderer
SDL_Renderer *renderer = SDL_CreateRenderer( ptr->window, -1, SDL_RENDERER_ACCELERATED);
ptr->renderer = renderer;
if (colorfill != NULL)
{
log_printf("\n - background color set r=%d g=%d b=%d with opacity of %d\n", colorfill->r,colorfill->g,colorfill->b, colorfill->opacity);
// Set render color to red ( background will be rendered in this color )
SDL_SetRenderDrawColor( ptr->renderer, colorfill->r,colorfill->g,colorfill->b, colorfill->opacity );
log_printf("background rendered\n");
}
// Clear window
SDL_RenderClear( ptr->renderer );
SDL_ShowWindow(ptr->window);
SDL_RenderPresent( ptr->renderer );
getchar();
与
typedef struct SDL_Window SDL_Window;
typedef struct windowstruct {
char *winname;
SDL_Window *window;
SDL_Renderer *renderer;
struct windowstruct *next;
struct windowstruct *previous;
} windowstruct;
static windowstruct *root = NULL;
和
typedef struct colorstruct {
uint8_t r;
uint8_t g;
uint8_t b;
uint8_t opacity;
} colorstruct;
主要是:
_Bool start_SDL(void)
// scope this
{
//draw background
colorstruct *colorfill = malloc(sizeof(rectanglestruct));
colorfill->r = 0xFF;
colorfill->g = 0xFF;
colorfill->b = 0xFF;
colorfill->opacity = 0xFF;
rectanglestruct *winplace = malloc(sizeof(rectanglestruct));
winplace->x = 0;
winplace->y = 0;
winplace->w = 300;
winplace->h = 300;
create_new_window(winplace, colorfill, "appscreen");
free(colorfill);
free(winplace);
}
和
_Bool start_SDL(void)
{
//Initialization flag
_Bool success = true;
//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
log_printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
success = false;
}
}
我得到了以下输出(几次之后):
重点是我认为渲染器只是一个屏幕副本,就像一个缓冲区,你可以在屏幕上编写和刷新。但我猜不是吗?
答案 0 :(得分:2)
不,SDL_Renderer实现SDL2绘图,通常使用硬件加速后端。您的图像已损坏,因为您未在适当的时间发出重绘。如果你的窗口需要重绘(调整大小,被其他窗口或边框遮盖) - 你必须再次绘制并显示结果(这实际上对于每个窗口库都是相同的;即使在像Qt或GTK这样的GUI工具包中,如果你的回调没有' t快速返回,你可以体验到相同的腐败)。如果图像保持不变并且计算量很大,您可以渲染到纹理然后再次显示它。
执行你所说的将需要累积发送给渲染器的所有数据(可能是高内存使用),并定期调用更新或事件,或从调用端取走主循环(像大多数GUI工具包一样) ),这是针对SDL设计的。此外,由于SDL的主要目标是视频游戏,因此场景很少是静态的。
在SDL2之前,没有渲染器,SDL只提供了您绘制的显示表面,但它基本相同,不会自行更新。
但这并不意味着无法用SDL完成 - 它可以让您获得更多控制权。如果您只想在真正需要时重绘 - 请注意SDL_WindowEvent。