当前位置:网站首页>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
边栏推荐
- 在最长的距离二叉树结点
- 【mysql】游标的基本使用
- Tips for web development: skillfully use ThreadLocal to avoid layer by layer value transmission
- El table table - get the row and column you click & the sort of El table and sort change, El table column and sort method & clear sort clearsort
- Notes - detailed steps of training, testing and verification of yolo-v4-tiny source code
- MySQL - 事务(Transaction)详解
- WEB功能测试说明
- 愛可可AI前沿推介(7.6)
- How do I remove duplicates from the list- How to remove duplicates from a list?
- [sliding window] group B of the 9th Landbridge cup provincial tournament: log statistics
猜你喜欢

KDD 2022 | realize unified conversational recommendation through knowledge enhanced prompt learning

缓存更新策略概览(Caching Strategies Overview)

Is this the feeling of being spoiled by bytes?

Reinforcement learning - learning notes 5 | alphago

3D face reconstruction: from basic knowledge to recognition / reconstruction methods!

Internet News: Geely officially acquired Meizu; Intensive insulin purchase was fully implemented in 31 provinces

【力扣刷题】一维动态规划记录(53零钱兑换、300最长递增子序列、53最大子数组和)
![[MySQL] trigger](/img/b5/6df17eb254bbdb0aba422d08f13046.png)
[MySQL] trigger

Fastjson parses JSON strings (deserialized to list, map)

防火墙基础之外网服务器区部署和双机热备
随机推荐
20220211 failure - maximum amount of data supported by mongodb
Torch Cookbook
VIM basic configuration and frequently used commands
The use method of string is startwith () - start with XX, endswith () - end with XX, trim () - delete spaces at both ends
Quick news: the flybook players' conference is held online; Wechat payment launched "education and training service toolbox"
Deployment of external server area and dual machine hot standby of firewall Foundation
Why do job hopping take more than promotion?
Why does MySQL index fail? When do I use indexes?
Nodejs教程之让我们用 typescript 创建你的第一个 expressjs 应用程序
[MySQL] basic use of cursor
审稿人dis整个研究方向已经不仅仅是在审我的稿子了怎么办?
In JS, string and array are converted to each other (I) -- the method of converting string into array
对话阿里巴巴副总裁贾扬清:追求大模型,并不是一件坏事
[redis design and implementation] part I: summary of redis data structure and objects
What is the problem with the SQL group by statement
袁小林:安全不只是标准,更是沃尔沃不变的信仰和追求
'class file has wrong version 52.0, should be 50.0' - class file has wrong version 52.0, should be 50.0
Three schemes of SVM to realize multi classification
It's almost the new year, and my heart is lazy
@GetMapping、@PostMapping 和 @RequestMapping详细区别附实战代码(全)