簡體   English   中英

SDL渲染為新紋理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM