【发布时间】:2019-06-09 22:45:48
【问题描述】:
我正在使用 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);
}
【问题讨论】: