15.2 集成easy_profiler

要将easy_profiler作为引擎的性能分析器,需要将easy_profiler编译为库提供给引擎调用。

从github下载代码后,直接用CLion打开文件夹,然后build 再install就行,一般不会出错。

下面开始集成。

1. 初始化监听

代码如下:

///file:source/utils/application.cpp line:68

/// 初始化
void Application::Init() {
    EASY_MAIN_THREAD;
    profiler::startListen();// 启动profiler服务器,等待gui连接。
    ......
}

引擎中存在多个线程,使用EASY_MAIN_THREAD来标记这里是主线程,这个宏展开如下:

# define EASY_MAIN_THREAD EASY_THREAD("Main")

那么其他线程,例如文件加载线程就可以这样标记:EASY_THREAD("Load")

游戏端是作为easy_profiler的Server端,监听profiler_gui.exe的连接,所以启动游戏时就要调用profiler::startListen(),等待连接。

2. 收集每帧的函数耗时

在主循环里,使用EASY_BLOCK标记代码块,就可以收集这段代码(一帧)的性能数据。

///file:source/utils/application.cpp line:148

void Application::Run() {
    while (true)
    {
        EASY_BLOCK("Frame"){
            if(glfwWindowShouldClose(glfw_window_)){
                break;
            }
            Update();
            Render();

            EASY_BLOCK("glfwSwapBuffers"){
                glfwSwapBuffers(glfw_window_);
            }
            EASY_END_BLOCK;

            EASY_BLOCK("glfwPollEvents"){
                glfwPollEvents();
            }
            EASY_END_BLOCK;
        }EASY_END_BLOCK;
    }
    ......
}

然后再使用 EASY_FUNCTION 标记 UpdateRender 这2个函数。

///file:source/utils/application.cpp line:112

void Application::Update(){
    EASY_FUNCTION(profiler::colors::Magenta); // 标记函数
    ......
}

现在我就收集了一帧的性能信息,而且有调用层次:

>Frame
-->Update
-->Render
-->glfwSwapBuffers
-->glfwPollEvents

3. 测试

运行项目,再打开profiler_gui.exe连接,如下图:

可以看到FPS在60帧左右。

从每一帧的堆栈中可以看出,glfwSwapBuffers占用了最长的时间,引擎逻辑消耗很小。

由于显示器得帧率是60,所以几乎所有的时间都被glfwSwapBuffers等待显示器刷新占用了。

Copyright © captainchen all right reserved,powered by GitbookFile Modify: 2021-09-01 21:37:31

results matching ""

    No results matching ""

    results matching ""

      No results matching ""