SDL рендер на новую текстуру - PullRequest
0 голосов
/ 16 января 2019

Я делаю 2D игру с библиотекой SDL.

Я пытаюсь рисовать карту для каждого кадра снова и снова, потому что я перемещаю карту в соответствии с движением игрока, чтобы создать иллюзию, что камера следует за игроком.

Таким образом, в основном, если игрок перемещается, я перемещаю все блоки (эти два, позиции игрока и позиции обновления, обрабатываются в отдельном потоке) и снова визуализирую текстуру карты в основном потоке.

Хотя на самом деле неэффективно рисовать все блоки в каждом кадре, и это задерживает рендеринг окна, так что я хочу сделать еще один поток, который создаст пустую текстуру, чтобы блоки могли отображаться там. ,

Вопрос: Возможно ли это сделать без рендера? нарисовать все блоки для новой текстуры, не вставляя основной рендерер, который рисует окно и не позволяет ему проходить через все блоки в каждом кадре?

Это код, который проходит по блокам карты и рисует их в новую текстуру:

SDL_Texture* GraphicsDrawer::drawMap() {
    map = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, WINDOW_WIDTH, WINDOW_HEIGHT);
    SDL_SetTextureBlendMode(map, SDL_BLENDMODE_BLEND); // set texture to be transparent
    SDL_SetRenderTarget(renderer, map);
    for (Block block : blocks) {
        std::cout << block.getTexture() << std::endl;
        SDL_RenderCopy(renderer, block.getTexture(), NULL, &block.getPosition());
        SDL_RenderPresent(renderer);
    }
    SDL_SetRenderTarget(renderer, NULL);
    return map;
}

Это код, который рисует текстуры в окне:

void Game::render() {
    SDL_RenderClear(renderer);
    //map
    SDL_RenderCopy(renderer, map, NULL, NULL);
    //player
    SDL_RenderCopy(renderer, player->getAnimation(player->getFlipImageFlag()), NULL, &player->getPosition());

    SDL_SetRenderDrawColor(renderer, BG_R, BG_G, BG_B, BG_A);
    SDL_RenderPresent(renderer);
}


1 Ответ

0 голосов
/ 16 января 2019

Если я понимаю, что вы спрашиваете, вы хотите обновлять только НЕКОТОРЫЕ блоки / плитки на карте каждый раз? Это невозможно, если вы не разделите текстуру карты на части, что может создать больше накладных расходов, чем вы сохраняете. Вы не можете SDL_RenderClear только часть текстуры без некоторых потенциально нежелательных побочных эффектов.

Я бы разбил текстуру карты на слои (map_floors, map_walls и т. Д.) И кэшировал каждый слой. Таким образом, вместо вызова GraphicsDrawer :: drawMap () для каждого кадра, вызывайте его только для кадров, в которых изменяется слой. Поэтому, если NPC перемещается, перерисовывайте только слой, на котором есть NPC. Вы бы все равно вызывали SDL_RenderCopy () каждый кадр, но текстуру для каждого слоя не нужно восстанавливать каждый кадр.

...