当前位置:网站首页>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
边栏推荐
- JS操作dom元素(一)——获取DOM节点的六种方式
- OSPF多区域配置
- 'class file has wrong version 52.0, should be 50.0' - class file has wrong version 52.0, should be 50.0
- FZU 1686 龙之谜 重复覆盖
- Reference frame generation based on deep learning
- Pat 1085 perfect sequence (25 points) perfect sequence
- 039. (2.8) thoughts in the ward
- MySQL - 事务(Transaction)详解
- 审稿人dis整个研究方向已经不仅仅是在审我的稿子了怎么办?
- b站视频链接快速获取
猜你喜欢
After working for 5 years, this experience is left when you reach P7. You have helped your friends get 10 offers
Absolute primes (C language)
【mysql】触发器
Fastjson parses JSON strings (deserialized to list, map)
[in depth learning] pytorch 1.12 was released, officially supporting Apple M1 chip GPU acceleration and repairing many bugs
The most comprehensive new database in the whole network, multidimensional table platform inventory note, flowus, airtable, seatable, Vig table Vika, flying Book Multidimensional table, heipayun, Zhix
[MySQL] basic use of cursor
Data Lake (VIII): Iceberg data storage format
【论文解读】用于白内障分级/分类的机器学习技术
3D人脸重建:从基础知识到识别/重建方法!
随机推荐
Is it profitable to host an Olympic Games?
ACdreamoj1110(多重背包)
Torch Cookbook
Internet News: Geely officially acquired Meizu; Intensive insulin purchase was fully implemented in 31 provinces
15million employees are easy to manage, and the cloud native database gaussdb makes HR office more efficient
OneNote 深度评测:使用资源、插件、模版
None of the strongest kings in the monitoring industry!
OSPF多区域配置
Absolute primes (C language)
MLP (multilayer perceptron neural network) is a multilayer fully connected neural network model.
Forward maximum matching method
Reflection operation exercise
启动嵌入式间:资源有限的系统启动
SAP Fiori应用索引大全工具和 SAP Fiori Tools 的使用介绍
快讯:飞书玩家大会线上举行;微信支付推出“教培服务工具箱”
The biggest pain point of traffic management - the resource utilization rate cannot go up
el-table表格——sortable排序 & 出现小数、%时排序错乱
for循环中break与continue的区别——break-完全结束循环 & continue-终止本次循环
互联网快讯:吉利正式收购魅族;胰岛素集采在31省全面落地
Seven original sins of embedded development