Как я могу использовать SDL_LockTexture () для обновления грязных прямоугольников? - PullRequest
0 голосов
/ 02 марта 2019

Я переношу приложение из SDL 1.2 в 2.0, и оно хранит массив грязных прямоугольников, чтобы определить, какие части его SDL_Surface отображать на экране.Я пытаюсь найти лучший способ интегрировать это с SDL_Texture SDL 2.

Вот как работает драйвер SDL 1.2: https://gist.github.com/nikolas/1bb8c675209d2296a23cc1a395a32a0d

И вот как я получаю изменения отповерхность к текстуре в SDL 2:

void *pixels;
int pitch;

SDL_LockTexture(_sdl_texture, NULL, &pixels, &pitch);
memcpy(
    pixels, _sdl_surface->pixels,
    pitch * _sdl_surface->h);
SDL_UnlockTexture(_sdl_texture);

for (int i = 0; i < num_dirty_rects; i++) {
    SDL_RenderCopy(
        _sdl_renderer, _sdl_texture, &_dirty_rects[i], &_dirty_rects[i]);
}

SDL_RenderPresent(_sdl_renderer);

Я просто обновляю всю поверхность, но затем использую грязные прямоугольники в RenderCopy ().Есть ли лучший способ сделать что-то здесь, только обновить грязные прямоугольники?Буду ли я сталкиваться с проблемами вызова SDL_LockTexture и UnlockTexture до ста раз за каждый кадр, или это то, как они должны использоваться?

SDL_LockTexture принимает параметр SDL_Rect, который я мог бы использовать здесь, но тогда неясномне, как получить соответствующий прямоугольник из _sdl_surface->pixels.Как бы я скопировал только маленький прямоугольник из данных пикселей всего экрана?

...