Я делаю 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);
}