Remotery, 单个C 文件,实时 cpu/gpu分析器,带有远程网络查看器

分享于 

9分钟阅读

GitHub

  繁體 雙語
Single C File Profiler with Web Viewer
  • 源代码名称:Remotery
  • 源代码网址:http://www.github.com/Celtoys/Remotery
  • Remotery源代码文档
  • Remotery源代码下载
  • Git URL:
    git://www.github.com/Celtoys/Remotery.git
    Git Clone代码到本地:
    git clone http://www.github.com/Celtoys/Remotery
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/Celtoys/Remotery
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    Remotery

    Build StatusBuild status

    内置在单个C 文件中的实时 cpu/gpu分析器,带有在web浏览器中运行的查看器。

    screenshot

    支持的平台:

    • Windows
    • Linux
    • OSX
    • iOS
    • Android
    • XBox一
    • FreeBSD

    支持的GPU分析 api:

    • D3D 11
    • OpenGL
    • CUDA
    • 金属

    功能:

    • 在CPU上运行多个线程的轻量级检测。
    • 在 Chrome,Firefox 和Safari中运行的网页查看器。 自定义 web socket服务器将示例数据传送到潜在线程上的浏览器。
    • 配置文件本身并显示它在查看器中的执行方式。
    • 记录文本的控制台输出。
    • 用于向游戏发送命令的控制台输入。

    编译

    • Windows ( MSVC ) - 将 lib/remotery。c 和 lib/remotery。h 添加到你的程序中。 设置包含目录以添加 remotery/lib路径。 必须通过使用 Remotery.c. 中的#pragma 注释( 库克"ws2_32.lib") 指令来获取所需的库 ws2_32.lib

    • Mac OS X ( XCode ) - 简单地添加库/remotery。c。lib/remotery。h 和 lib/remotery。

    • Linux ( GCC ) - 在lib文件夹中添加源。 编译代码需要库链接的-pthreads。 例如编译相同的运行: cc lib/remotery。c 示例/示例。c -I -pthread -lm

    你可以定义一些额外的MACROS 来修改哪些功能被编译到Remotery中:

    
    Macro Default Description
    
    
    
    RMT_ENABLED 1 Disable this to not include any bits of Remotery in your build
    
    
    RMT_USE_TINYCRT 0 Used by the Celtoys TinyCRT library (not released yet)
    
    
    RMT_USE_CUDA 0 Assuming CUDA headers/libs are setup, allow CUDA profiling
    
    
    RMT_USE_D3D11 0 Assuming Direct3D 11 headers/libs are setup, allow D3D11 GPU profiling
    
    
    RMT_USE_OPENGL 0 Allow OpenGL GPU profiling (dynamically links OpenGL libraries on available platforms)
    
    
    RMT_USE_METAL 0 Allow Metal profiling of command buffers
    
    
    
    

    基本用法

    有关进一步示例,请参见示例目录。 一个简单的例子:

    
    int main()
    
    
    {
    
    
    //Create the main instance of Remotery.
    
    
    //You need only do this once per program.
    
    
     Remotery* rmt;
    
    
     rmt_CreateGlobalInstance(&rmt);
    
    
    
    //Explicit begin/end for C
    
    
     {
    
    
     rmt_BeginCPUSample(LogText, 0);
    
    
     rmt_LogText("Time me, please!");
    
    
     rmt_EndCPUSample();
    
    
     }
    
    
    
    //Scoped begin/end for C++
    
    
     {
    
    
     rmt_ScopedCPUSample(LogText, 0);
    
    
     rmt_LogText("Time me, too!");
    
    
     }
    
    
    
    //Destroy the main instance of Remotery.
    
    
     rmt_DestroyGlobalInstance(rmt);
    
    
    }
    
    
    
    

    运行查看器

    在浏览器中双击或者启动 vis/index.html

    采样 CUDA GPU活动

    Remotery允许使用不同的异步流对多个CUDA执行线程进行分析,这些线程必须共享相同的。 在initialising和CUDA之后,你需要使用调用将两者绑定在一起:

    
    rmtCUDABind bind;
    
    
    bind.context = m_Context;
    
    
    bind.CtxSetCurrent = &cuCtxSetCurrent;
    
    
    bind.CtxGetCurrent = &cuCtxGetCurrent;
    
    
    bind.EventCreate = &cuEventCreate;
    
    
    bind.EventDestroy = &cuEventDestroy;
    
    
    bind.EventRecord = &cuEventRecord;
    
    
    bind.EventQuery = &cuEventQuery;
    
    
    bind.EventElapsedTime = &cuEventElapsedTime;
    
    
    rmt_BindCUDA(&bind);
    
    
    
    

    显式指向rtc接口允许Remotery在项目中包含,而不需要你链接到所需的ipqos库。 绑定完成后,你可以安全地取样任何CUDA活动:

    
    CUstream stream;
    
    
    
    //Explicit begin/end for C
    
    
    {
    
    
     rmt_BeginCUDASample(UnscopedSample, stream);
    
    
    //... CUDA code.. .
    
    
     rmt_EndCUDASample(stream);
    
    
    }
    
    
    
    //Scoped begin/end for C++
    
    
    {
    
    
     rmt_ScopedCUDASample(ScopedSample, stream);
    
    
    //... CUDA code.. .
    
    
    }
    
    
    
    

    对于所有线程,Remotery只支持一个上下文,并使用cuCtxGetCurrent和cuCtxSetCurrent确保当前线程具有你在 rmtCUDABind.context 中指定的上下文。

    3d direct 3d GPU活动示例

    Remotery允许在你的主D3D11上下文中采样 GPU Activity。 在 initialising Remotery之后,你需要将它与拥有设备上下文的线程一次调用绑定到 D3D11:

    
    //Parameters are ID3D11Device* and ID3D11DeviceContext*
    
    
    rmt_BindD3D11(d3d11_device, d3d11_context);
    
    
    
    

    抽样是一个简单的例子:

    
    //Explicit begin/end for C
    
    
    {
    
    
     rmt_BeginD3D11Sample(UnscopedSample);
    
    
    //... D3D code.. .
    
    
     rmt_EndD3D11Sample();
    
    
    }
    
    
    
    //Scoped begin/end for C++
    
    
    {
    
    
     rmt_ScopedD3D11Sample(ScopedSample);
    
    
    //... D3D code.. .
    
    
    }
    
    
    
    

    如果对特性有需求,可以很容易地添加多个上下文的支持。 关闭D3D11设备和上下文时,请确保在关闭Remotery本身之前通知 Remotery:

    
    rmt_UnbindD3D11();
    
    
    
    

    示例 OpenGL GPU活动

    Remotery允许在你的主OpenGL上下文中采样 GPU Activity。 在 initialising Remotery之后,你需要使用单个调用将它绑定到 OpenGL:

    
    rmt_BindOpenGL();
    
    
    
    

    抽样是一个简单的例子:

    
    //Explicit begin/end for C
    
    
    {
    
    
     rmt_BeginOpenGLSample(UnscopedSample);
    
    
    //... OpenGL code.. .
    
    
     rmt_EndOpenGLSample();
    
    
    }
    
    
    
    //Scoped begin/end for C++
    
    
    {
    
    
     rmt_ScopedOpenGLSample(ScopedSample);
    
    
    //... OpenGL code.. .
    
    
    }
    
    
    
    

    如果对特性有需求,可以很容易地添加多个上下文的支持。 关闭OpenGL设备和上下文时,请确保在关闭Remotery本身之前通知 Remotery:

    
    rmt_UnbindOpenGL();
    
    
    
    

    示例金属GPU活动

    Remotery可以从多个线程中采样发送到GPU的Metal命令缓冲区。 由于金属API不支持细粒度的分析,所以示例只返回绑定命令缓冲区的计时。 因此,确保对每个调用站点绑定并取样命令缓冲区:

    
    rmt_BindMetal(mtl_command_buffer);
    
    
    rmt_ScopedMetalSample(command_buffer_name);
    
    
    
    

    C API支持开始/结束:

    
    rmt_BindMetal(mtl_command_buffer);
    
    
    rmt_BeginMetalSample(command_buffer_name);
    
    
    ...
    
    
    rmt_EndMetalSample();
    
    
    
    

    应用配置设置

    你可以在创建Remotery实例之前,通过检索它的设置对象来配置它的行为:

    
    rmtSettings* settings = rmt_Settings();
    
    
    
    

    一些重要的设置是:

    
    //Redirect any Remotery allocations to your own malloc/free, with an additional context pointer
    
    
    //that gets passed to your callbacks.
    
    
    settings->malloc;
    
    
    settings->free;
    
    
    settings->mm_context;
    
    
    
    //Specify an input handler that receives text input from the Remotery console, with an additional
    
    
    //context pointer that gets passed to your callback.
    
    
    settings->input_handler;
    
    
    settings->input_handler_context;
    
    
    
    

    WEB  文件  VIEW  SIN  Viewer  Profile  
    相关文章