SDL渲染器在我的窗口上给出了废话(如何正确使用渲染器?)

时间:2016-02-21 00:05:47

标签: sdl sdl-2 renderer

所以我得到了以下代码(片段):

_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;
    }
}

我得到了以下输出(几次之后):

output screen

重点是我认为渲染器只是一个屏幕副本,就像一个缓冲区,你可以在屏幕上编写和刷新。但我猜不是吗?

1 个答案:

答案 0 :(得分:2)

不,SDL_Renderer实现SDL2绘图,通常使用硬件加速后端。您的图像已损坏,因为您未在适当的时间发出重绘。如果你的窗口需要重绘(调整大小,被其他窗口或边框遮盖) - 你必须再次绘制并显示结果(这实际上对于每个窗口库都是相同的;即使在像Qt或GTK这样的GUI工具包中,如果你的回调没有' t快速返回,你可以体验到相同的腐败)。如果图像保持不变并且计算量很大,您可以渲染到纹理然后再次显示它。

执行你所说的将需要累积发送给渲染器的所有数据(可能是高内存使用),并定期调用更新或事件,或从调用端取走主循环(像大多数GUI工具包一样) ),这是针对SDL设计的。此外,由于SDL的主要目标是视频游戏,因此场景很少是静态的。

在SDL2之前,没有渲染器,SDL只提供了您绘制的显示表面,但它基本相同,不会自行更新。

但这并不意味着无法用SDL完成 - 它可以让您获得更多控制权。如果您只想在真正需要时重绘 - 请注意SDL_WindowEvent