当前位置:网站首页>Sdl2 source analysis 7: performance (sdl_renderpresent())
Sdl2 source analysis 7: performance (sdl_renderpresent())
2022-07-06 21:20:00 【Full stack programmer webmaster】
Hello everyone , I meet you again , I'm the king of the whole stack .
=====================================================
SDL Source code analysis series articles on the market :
SDL2 Source code analysis 1: initialization (SDL_Init())
SDL2 Source code analysis 2: forms (SDL_Window)
SDL2 Source code analysis 3: Renderers (SDL_Renderer)
SDL2 Source code analysis 4: texture (SDL_Texture)
SDL2 Source code analysis 5: Update texture (SDL_UpdateTexture())
SDL2 Source code analysis 6: Copy to the render (SDL_RenderCopy())
SDL2 Source code analysis 7: Show (SDL_RenderPresent())
SDL2 Source code analysis 8: Video display summary
=====================================================
The last article analyzed SDL Texture assignment function to render target SDL_RenderCopy().
This article analyzes SDL Show the last function of the video :SDL_RenderPresent().
SDL The code flow of playing video, such as the following . initialization :
SDL_Init(): initialization SDL. SDL_CreateWindow(): Create a form (Window). SDL_CreateRenderer(): Create a renderer based on the form (Render). SDL_CreateTexture(): Create texture (Texture).
Loop render data :
SDL_UpdateTexture(): Set texture data . SDL_RenderCopy(): Texture copy to renderer . SDL_RenderPresent(): Show .
The last article analyzed the... In this process 6 A function SDL_RenderCopy(). This article continues to analyze the last function in the process SDL_RenderPresent().
SDL_RenderPresent()
Function introduction
SDL Use SDL_RenderPresent() display frame .
SDL_RenderPresent() The prototype of is as follows .
void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer);Parameters renderer Lets you specify the renderer .
Function call graph
SDL_RenderPresent() The calling relationship of key functions can be represented by the following figure .
The picture above is not very clear , Clearer pictures are uploaded to the album :
http://my.csdn.net/leixiaohua1020/album/detail/1794103
Save the pictures in the album to get clear pictures .
Source code analysis
SDL_RenderPresent() The source code of is located in render\SDL_render.c in .
As you can see below .
void SDL_RenderPresent(SDL_Renderer * renderer)
{
CHECK_RENDERER_MAGIC(renderer, );
/* Don't draw while we're hidden */
if (renderer->hidden) {
return;
}
renderer->RenderPresent(renderer);
}From the source code, we can see ,SDL_RenderPresent() Called SDL_Render Of RenderPresent() Method to display the image .
Let's take a look at several different renderers RenderPresent() Methods .
1. Direct3D
Direct3D Corresponding in the renderer RenderPresent() The function of is D3D_RenderPresent(). Its source code, such as the following ( be located render\direct3d\SDL_render_d3d.c).
static void D3D_RenderPresent(SDL_Renderer * renderer)
{
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
HRESULT result;
if (!data->beginScene) {
IDirect3DDevice9_EndScene(data->device);
data->beginScene = SDL_TRUE;
}
result = IDirect3DDevice9_TestCooperativeLevel(data->device);
if (result == D3DERR_DEVICELOST) {
/* We'll reset later */
return;
}
if (result == D3DERR_DEVICENOTRESET) {
D3D_Reset(renderer);
}
result = IDirect3DDevice9_Present(data->device, NULL, NULL, NULL, NULL);
if (FAILED(result)) {
D3D_SetError("Present()", result);
}
}As you can see from the code , This function calls 2 The key Direct3D Of API: IDirect3DDevice9_EndScene(): End a scene . IDirect3DDevice9_Present(): Show .
2. OpenGL
OpenGL Corresponding in the renderer RenderPresent() The function of is GL_RenderPresent(), Its source code, such as the following ( be located render\opengl\SDL_render_gl.c).
static void GL_RenderPresent(SDL_Renderer * renderer)
{
GL_ActivateRenderer(renderer);
SDL_GL_SwapWindow(renderer->window);
}The code is relatively simple , There are only two lines . The key display functions are located in SDL_GL_SwapWindow() Function . Let's take a look at SDL_GL_SwapWindow() Code for ( be located video\SDL_video.c. I feel that the calling relationship here is a little messy …).
void SDL_GL_SwapWindow(SDL_Window * window)
{
CHECK_WINDOW_MAGIC(window, );
if (!(window->flags & SDL_WINDOW_OPENGL)) {
SDL_SetError("The specified window isn't an OpenGL window");
return;
}
if (SDL_GL_GetCurrentWindow() != window) {
SDL_SetError("The specified window has not been made current");
return;
}
_this->GL_SwapWindow(_this, window);
}From the above code, we can see .SDL_GL_SwapWindow() Called SDL_VideoDevice Of GL_SwapWindow() function .
Let's see “Windows Video drive ” Under the circumstances , The code for this function . stay “Windows Video drive ” Under the circumstances , call GL_SwapWindow() It's actually called WIN_GL_SwapWindow() function . to glance at WIN_GL_SwapWindow() Function code ( be located video\windows\SDL_windowsopengl.c).
void WIN_GL_SwapWindow(_THIS, SDL_Window * window)
{
HDC hdc = ((SDL_WindowData *) window->driverdata)->hdc;
SwapBuffers(hdc);
}A simple function is called in the code SwapBuffers(), Finished the display function .
3. Software
Software Corresponding in the renderer RenderPresent() The function of is SW_RenderPresent(), Its source code, such as the following ( be located render\software\SDL_render_sw.c).
static void SW_RenderPresent(SDL_Renderer * renderer)
{
SDL_Window *window = renderer->window;
if (window) {
SDL_UpdateWindowSurface(window);
}
}As you can see from the code .SW_RenderPresent() A function was called SDL_UpdateWindowSurface(). Let's see SDL_UpdateWindowSurface() Code for ( be located video\SDL_video.c).
int SDL_UpdateWindowSurface(SDL_Window * window)
{
SDL_Rect full_rect;
CHECK_WINDOW_MAGIC(window, -1);
full_rect.x = 0;
full_rect.y = 0;
full_rect.w = window->w;
full_rect.h = window->h;
return SDL_UpdateWindowSurfaceRects(window, &full_rect, 1);
}SDL_UpdateWindowSurface() Another function is called SDL_UpdateWindowSurfaceRects(). Continue to look at SDL_UpdateWindowSurfaceRects() Code for .
int SDL_UpdateWindowSurfaceRects(SDL_Window * window, const SDL_Rect * rects,
int numrects)
{
CHECK_WINDOW_MAGIC(window, -1);
if (!window->surface_valid) {
return SDL_SetError("Window surface is invalid, please call SDL_GetWindowSurface() to get a new surface");
}
return _this->UpdateWindowFramebuffer(_this, window, rects, numrects);
}SDL_UpdateWindowSurfaceRects() Called SDL_VideoDevice Of UpdateWindowFramebuffer() function . stay “Windows Video drive ” Under the circumstances . Equivalent to calling WIN_UpdateWindowFramebuffer().
Let's take a look at the code of this function ( be located video\windows\SDL_windowsframebuffer.c)
int WIN_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects)
{
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
BitBlt(data->hdc, 0, 0, window->w, window->h, data->mdc, 0, 0, SRCCOPY);
return 0;
}After a series of searching , Finally found Software Render the video show “ resources ”:BitBlt() performance .
Copyright notice : This article is the original article of the blogger . Blog , Do not reprint without permission .
Publisher : Full stack programmer stack length , Reprint please indicate the source :https://javaforall.cn/117099.html Link to the original text :https://javaforall.cn
边栏推荐
- Tips for web development: skillfully use ThreadLocal to avoid layer by layer value transmission
- Thinking about agile development
- JS get array subscript through array content
- ICML 2022 | flowformer: task generic linear complexity transformer
- No Yum source to install SPuG monitoring
- First batch selected! Tencent security tianyufeng control has obtained the business security capability certification of the ICT Institute
- Divide candy
- The biggest pain point of traffic management - the resource utilization rate cannot go up
- Swagger UI教程 API 文档神器
- js通过数组内容来获取数组下标
猜你喜欢

Reinforcement learning - learning notes 5 | alphago

After working for 5 years, this experience is left when you reach P7. You have helped your friends get 10 offers
![[MySQL] basic use of cursor](/img/cc/39b1e17b48d0de641d3cbffbf2335a.png)
[MySQL] basic use of cursor

Aiko ai Frontier promotion (7.6)

Absolute primes (C language)

爱可可AI前沿推介(7.6)

Four common ways and performance comparison of ArrayList de duplication (jmh performance analysis)

Common English vocabulary that every programmer must master (recommended Collection)

Is it profitable to host an Olympic Games?

【深度学习】PyTorch 1.12发布,正式支持苹果M1芯片GPU加速,修复众多Bug
随机推荐
Reinforcement learning - learning notes 5 | alphago
OSPF多区域配置
In JS, string and array are converted to each other (I) -- the method of converting string into array
for循环中break与continue的区别——break-完全结束循环 & continue-终止本次循环
跨分片方案 总结
js之遍历数组、字符串
'class file has wrong version 52.0, should be 50.0' - class file has wrong version 52.0, should be 50.0
El table table - sortable sorting & disordered sorting when decimal and% appear
VIM basic configuration and frequently used commands
js 根据汉字首字母排序(省份排序) 或 根据英文首字母排序——za排序 & az排序
Swagger UI tutorial API document artifact
C # use Oracle stored procedure to obtain result set instance
Nodejs教程之Expressjs一篇文章快速入门
[interpretation of the paper] machine learning technology for Cataract Classification / classification
No Yum source to install SPuG monitoring
Quick news: the flybook players' conference is held online; Wechat payment launched "education and training service toolbox"
3D人脸重建:从基础知识到识别/重建方法!
This year, Jianzhi Tencent
首批入选!腾讯安全天御风控获信通院业务安全能力认证
字符串的使用方法之startwith()-以XX开头、endsWith()-以XX结尾、trim()-删除两端空格