首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL_RenderPresent对SDL_UpdateWindowSurface

SDL_RenderPresent对SDL_UpdateWindowSurface
EN

Stack Overflow用户
提问于 2015-10-28 22:48:16
回答 2查看 4.4K关注 0票数 5

我已经成功地创建和绘制了一个位图图像,并使用渲染器绘制了一条绿线到我的SDL窗口。问题是,我不知道如何同时在同一个窗口做这两件事。

代码语言:javascript
复制
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上画绿线呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-29 04:28:51

不能同时使用这两种方法,必须选择一种或另一种。我建议你和SDL_Renderer一起去。从您的SDL_Texture中创建一个SDL_Surface并使用SDL_RenderCopy呈现它。

票数 6
EN

Stack Overflow用户

发布于 2015-10-29 10:37:49

如果您将映像存储在RAM中,并使用CPU进行渲染(这称为软件呈现),则使用SDL_UpdateWindowSurface

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

您可以使用SDL_Surface将纹理存储在内存中,但是软件呈现是无效的。您可以使用SDL_BlitSurface进行抽签调用。

SDL_UpdateWindowSurface相当于SDL1.2API SDL_Flip()。

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

这个函数告诉GPU向屏幕呈现。

使用SDL_Texture将纹理存储在GPU上。使用此命令时,可以通过使用SDL_RenderCopy或如果需要转换SDL_RenderCopyEx进行绘制调用。

因此,在使用SDL的呈现API时,可以执行针对框架的所有绘图,然后每帧调用该函数一次,以便将最终的绘图呈现给用户。

你应该使用硬件渲染--它比软件渲染要高效得多!即使运行该程序的用户没有GPU (这是罕见的,因为大多数CPU有一个集成的GPU) SDL将切换到软件渲染由它自己!

顺便说一下,您可以将图像加载为SDL_Texture,而无需将图像作为SDL_Surface加载并使用图像库将其转换为SDL_Texture,这是因为它支持几种图像格式,而不仅仅是BMP,比如纯图像。(SDL_image由SDL的创建者制作)

只需使用IMG_LoadTexture从SDL_image!

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33402909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档