2016-02-21 4 views
-1

таким образом я получил следующий код (шт):SDL рендерер дает дерьмо на моем окне (? Как использовать визуализатор правильно)

_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

Дело в том, я думал, что рендер просто копия экрана, как буфер, в котором вы можете писать и обновлять на экране. Но я не думаю?

+0

Почему нижний предел? пожалуйста, предоставьте конструктивную обратную связь. – MVT

ответ

2

Нет, SDL_Renderer реализует чертеж SDL2, обычно с аппаратным ускорением. Ваше изображение повреждено, потому что вы не выдавали перерисовку в соответствующее время. Если вашему окну требуется перерисовать (изменить размер, затмить другими окнами или границами sceen) - вам нужно снова рисовать и представить результат (это фактически одно и то же для каждой библиотеки окон, даже в инструментах GUI, таких как Qt или GTK, если ваш обратный вызов не был " t верните быстро, вы можете испытать ту же самую коррупцию). Вы можете визуализировать текстуру, а затем отображать ее снова, если ваше изображение остается неизменным и вычисления тяжелы.

Чтобы сделать то, что вы сказали, потребовалось бы аккумулировать все данные, отправленные в средство визуализации (может быть использование большой памяти), и либо вызывать обновление через регулярные промежутки времени или на события, либо отбирать основной цикл со стороны вызова (например, большинство инструментов GUI do), что противоречит дизайну SDL. Кроме того, поскольку основной целью SDL являются видеоигры, сцены там редко бывают статическими.

Перед SDL2 не было средства визуализации, а SDL предоставила только отображаемую поверхность, на которую вы рисуете, но это совершенно та же базовая концепция, что она не будет обновлять сама по себе.

Это не значит, что это не может быть сделано с SDL, однако - это дает вам гораздо больше контроля. Если вы хотите перерисовать только тогда, когда это действительно необходимо - смотрите SDL_WindowEvent.