当前位置:网站首页>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
边栏推荐
- Proxy and reverse proxy
- 快过年了,心也懒了
- JS操作dom元素(一)——获取DOM节点的六种方式
- for循环中break与continue的区别——break-完全结束循环 & continue-终止本次循环
- ACdreamoj1110(多重背包)
- Aiko ai Frontier promotion (7.6)
- Opencv learning example code 3.2.3 image binarization
- 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
- 技术分享 | 抓包分析 TCP 协议
- 【论文解读】用于白内障分级/分类的机器学习技术
猜你喜欢

ICML 2022 | Flowformer: 任务通用的线性复杂度Transformer

Interviewer: what is the internal implementation of ordered collection in redis?

跨分片方案 总结

Data Lake (VIII): Iceberg data storage format

The biggest pain point of traffic management - the resource utilization rate cannot go up

2017 8th Blue Bridge Cup group a provincial tournament

【mysql】触发器

每个程序员必须掌握的常用英语词汇(建议收藏)
![[interpretation of the paper] machine learning technology for Cataract Classification / classification](/img/0c/b76e59f092c1b534736132faa76de5.png)
[interpretation of the paper] machine learning technology for Cataract Classification / classification

2022菲尔兹奖揭晓!首位韩裔许埈珥上榜,四位80后得奖,乌克兰女数学家成史上唯二获奖女性
随机推荐
监控界的最强王者,没有之一!
Reference frame generation based on deep learning
Common English vocabulary that every programmer must master (recommended Collection)
el-table表格——sortable排序 & 出现小数、%时排序错乱
js中,字符串和数组互转(二)——数组转为字符串的方法
【滑动窗口】第九届蓝桥杯省赛B组:日志统计
Nodejs教程之让我们用 typescript 创建你的第一个 expressjs 应用程序
OneNote 深度评测:使用资源、插件、模版
Reinforcement learning - learning notes 5 | alphago
968 edit distance
Nodejs教程之Expressjs一篇文章快速入门
Pat 1078 hashing (25 points) ⼆ times ⽅ exploration method
Word bag model and TF-IDF
快过年了,心也懒了
首批入选!腾讯安全天御风控获信通院业务安全能力认证
ICML 2022 | flowformer: task generic linear complexity transformer
How to implement common frameworks
No Yum source to install SPuG monitoring
Opencv learning example code 3.2.3 image binarization
[sliding window] group B of the 9th Landbridge cup provincial tournament: log statistics