SDL_RenderPresent vs SDL_UpdateWindowSurface

时间:2015-10-28 22:48:17

标签: c++ sdl

我已成功创建并绘制了一个位图图像,并使用渲染器将一条绿线绘制到我的SDL窗口。问题是我不确定如何在同一窗口上同时进行这两项工作。

void draw::image(){
    SDL_Surface *bmp = SDL_LoadBMP("C:\\Users\\Joe\\Documents\\Visual Studio 2013\\Projects\\SDL_APP1\\map1.bmp");
    SDL_BlitSurface(bmp, 0, SDL_GetWindowSurface(_window), 0);

    SDL_Renderer * renderer = SDL_CreateRenderer(_window, -1, 0);
    // draw green line across screen
    SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
    SDL_RenderDrawLine(renderer, 0, 0, 640, 320);
    SDL_RenderPresent(renderer);
    SDL_UpdateWindowSurface(_window);
    SDL_Delay(20000);

    // free resources
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(_window);
}

我的代码版本将bmp文件绘制到窗口,因为SDL_UpdateWindowSurface();在SDL_RenderPresent()之后;然而,当我翻转这些时,它会在屏幕上绘制一条绿线。我如何在我的BMP上绘制绿线?

2 个答案:

答案 0 :(得分:5)

如果将图像存储在RAM中并使用CPU进行渲染(这称为软件渲染),则使用<li class="{{isActiveRoute regex='dashboard'}}"> <a href="{{pathFor route='dashboard'}}"><i class="fa fa-th-large"></i> <span class="nav-label">Dashboard</span> </a> </li>

通过调用此函数,您可以告诉CPU更新屏幕并使用软件渲染进行绘制。

您可以使用SDL_UpdateWindowSurface将纹理存储在RAM中,但软件渲染效果不佳。您可以使用SDL_Surface

进行绘制调用
  

SDL_UpdateWindowSurface等同于SDL 1.2 API SDL_Flip()。

另一方面,当您使用GPU渲染纹理并将纹理存储在GPU上时(这称为硬件加速渲染),您应该使用SDL_BlitSurface

此功能告诉GPU渲染到屏幕。

使用SDL_RenderPresent在GPU上存储纹理。 使用此功能时,您可以使用SDL_Texture进行绘制调用,或者如果需要转换SDL_RenderCopy

  

因此,当使用SDL的渲染API时,会完成所有用于帧的绘制,然后每帧调用此函数一次,以向用户显示最终绘图。

你应该使用硬件渲染它比软件渲染更有效!即使运行该程序的用户没有GPU(这种情况很少见,因为大多数CPU都集成了GPU),SDL也会自行切换到软件渲染!

顺便说一句,您可以将图片加载为SDL_RenderCopyEx,而无需将图片作为SDL_Texture加载,并使用SDL_image库将其转换为SDL_Surface,你应该这样做,因为它支持多种图像格式,而不仅仅是BMP,就像纯SDL一样。 (SDL_image由SDL的创建者制作)

只需使用SDL_image中的SDL_Texture

答案 1 :(得分:4)

您不能同时使用这两种方法,必须选择其中一种方法。我建议你去SDL_Renderer。从SDL_Texture创建SDL_Surface,然后使用SDL_RenderCopy进行呈现。