[英]SDL render to a new texture
我正在使用SDL庫制作2D游戲。
我試圖一遍又一遍地繪制每個幀的地圖,因為我正在根據玩家的移動來移動地圖,以實現相機跟隨玩家的錯覺。
因此,基本上,如果玩家移動了,我將移動所有塊(這兩個,玩家移動和更新塊的位置,在單獨的線程中處理),然后在主線程中再次渲染地圖紋理。
雖然,實際上每幀繪制所有塊的效率並不高,並且滯后於窗口渲染,所以我要做的是制作另一個線程,這將創建一個空白紋理,可以在此處渲染塊。
問題是:在沒有渲染器的情況下是否可以這樣做? 將所有塊繪制為新紋理而沒有實際卡住繪制窗口的主渲染器,並防止每幀遍歷所有塊?
這是遍歷地圖塊並將其繪制到新紋理的代碼:
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);
}
如果我了解您的要求,那么您每次只想更新地圖上的一些街區/瓷磚嗎? 除非將地圖紋理分成幾部分,否則這是不可能的,這可能會產生比您節省的更多開銷。 您不能僅對部分紋理進行SDL_RenderClear清除,而沒有一些潛在的不良副作用。
我要做的是將地圖紋理分解為幾層(map_floors,map_walls等)並緩存每層。 因此,與其在每一幀都調用GraphicsDrawer :: drawMap(),不如在層發生變化的幀上調用它。 因此,如果NPC移動,則僅重繪具有NPC的圖層。 您仍然會在每幀調用SDL_RenderCopy(),但不必在每一幀都重新生成每一層的紋理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.