当前位置:首页 > 其他 > 正文内容

SDL3 入门(4):挑选图形引擎

邻居的猫1个月前 (12-09)其他1234

SDL2 创立烘托器时只能指定运用软件烘托仍是硬件加速,无法挑选运用哪种图形引擎完成硬件加速。SDL3 对此做了优化,能够在创立烘托器时指定 rendering driver 也便是图形引擎,比如在 Windows 平台下能够指定运用 D3D11 也能够指定运用 OpenGL 或许 Vulkan。

指定图形引擎

SDL_CreateRenderer 函数的第二个参数 name 表明指定运用的 rendering driver name,传 NULL 表明运用第一个支撑的 rendering driver,在 Windows 体系下通常是 D3D11。

SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window *window, const char *name)

SDL3 接口文件中没有预界说 rendering driver name,能够经过 SDL_GetNumRenderDriversSDL_GetRenderDriver 两个函数枚举当前所支撑的图形引擎:

int count = SDL_GetNumRenderDrivers();
for (int i = 0; i < count; ++i) {
    const char* name = SDL_GetRenderDriver(i);
    SDL_Log("Render driver[%d]: %s", i, name);
}

在 Windows 体系下履行成果如下:

INFO: Render driver[0]: direct3d11
INFO: Render driver[1]: direct3d12
INFO: Render driver[2]: direct3d
INFO: Render driver[3]: opengl
INFO: Render driver[4]: opengles2
INFO: Render driver[5]: vulkan
INFO: Render driver[6]: software

其间 direct3d 指的是 D3D9,software 指软件烘托,咱们能够经过这些姓名指定烘托器运用的烘托引擎。

烘托功能测验

完成一个简略的类用来测验烘托帧率

// performance.h
...

class Performance final
{
public:
    Performance();
    ~Performance();

    void Reset();
    void IncreaseFrameCount();
    void PrintEverySecond();

private:
    using Clock = std::chrono::high_resolution_clock;
    using TimePoint = std::chrono::time_point<Clock>;

    TimePoint start_time_;
    uint64_t frame_count_ = 0;

    TimePoint last_print_time_;
    uint64_t last_frame_count_ = 0;
};
// performance.cpp
...

Performance::Performance()
{
    Reset();
}

Performance::~Performance() {}

void Performance::Reset()
{
    start_time_ = Clock::now();
    last_print_time_ = start_time_;
    frame_count_ = 0;
}

void Performance::IncreaseFrameCount()
{
    frame_count_++;
}

void Performance::PrintEverySecond()
{
    assert(start_time_.time_since_epoch().count() > 0);
    assert(last_print_time_ >= start_time_);
    auto now = Clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now - last_print_time_);
    if (duration.count() >= 1000) {
        double elapsed_seconds =
            std::chrono::duration_cast<std::chrono::milliseconds>(now - start_time_).count() /
            1000.0;
        double average_fps = frame_count_ / elapsed_seconds;
        double realtime_fps = (frame_count_ - last_frame_count_) / (duration.count() / 1000.0);
        last_print_time_ = now;
        last_frame_count_ = frame_count_;

        fprintf(stderr, "Performance: FPS(AVR|RT): %.2f|%.2f      \r", average_fps, realtime_fps);
    }
}

咱们先测验 D3D11 的烘托帧率:

INFO: Created renderer: direct3d11
INFO: VSync: 0
Performance: FPS(AVR|RT): 32805.16|34470.00   

3 万多帧,还不错。这是全力烘托的成果,没有敞开笔直同步,能够调用 SDL_SetRenderVSync 函数设置笔直同步:

int vsync = disable_vsync ? 0 : 1;
SDL_SetRenderVSync(renderer, vsync);
SDL_Log("VSync: %d", vsync);

再次测验烘托帧率,60fps,和屏幕刷新率共同:

INFO: Created renderer: direct3d11
INFO: VSync: 1
Performance: FPS(AVR|RT): 59.95|60.04   

封闭笔直同步,对各烘托引擎别离进行帧率测验,成果如下:

direct3d11 direct3d12 direct3d opengl opengles2 vulkan software
33113.44 1155.43 1729.66 1673.66 1716.95 1565.44 1668.42

D3D11 一骑绝尘,看来优化的不错。

留意这仅仅一个简略的测验,功能瓶颈首要在从 CPU 提交烘托指令到 GPU 的进程,所以不代表 D3D11 的烘托功能和其他图形引擎真的有这么大的距离。实际上关于杂乱的图形烘托,除软件烘托外一切根据 GPU 的烘托功能上不会有太大的距离。

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=786

分享给朋友:

“SDL3 入门(4):挑选图形引擎” 的相关文章

词云图大师(WordCloudMaster)_ 探究构思无限的词云国际!

词云图大师(WordCloudMaster)_ 探究构思无限的词云国际!

在信息化年代,怎么故一种新颖且赋有构思的方法表达数据、文字或主意?答案是词云图!而词云图大师(WordCloudMaster),正是您的绝佳挑选。 无论是个人构思项目,仍是专业工作中的数据可视化,词云图大师都能以强壮的功用、灵敏的操作和冷艳的作用,满足您的需求。经过下载并运用这款使用,您将发现怎么...

DirectX9(D3D9)游戏开发:高光时间录制和同享纹路的踩坑

DirectX9(D3D9)游戏开发:高光时间录制和同享纹路的踩坑

同享纹路 老游戏运用directx9无法直接与cc高光sdk(d3d11)对接,可是d3d9ex有同享纹路,咱们经过同享纹路把游戏画面同享给cc录制,记载一些踩坑的笔记。 同享纹路示例: // 初始化Direct3D void initD3D9(HWND hWnd) { hr = d3d9e...

华为校招三轮面经:通用软件开发工程师

华为校招三轮面经:通用软件开发工程师

  本文介绍2024届秋招中,华为技能有限公司的通用软件开发工程师岗位的3场面试根本状况、发问问题等。   2023年07月投递了华为技能有限公司的通用软件开发工程师岗位,地址部分为海思半导体与器材业务部。现在完结了一面、二面与三面等悉数流程,在这儿记载一下3场面试的阅历。此外,华为的校招流程的确十...

分布式体系2:分布式体系中的时钟

分布式体系2:分布式体系中的时钟

假如把一个分布式体系类比成现代社会的协作网络,那每一个分布式体系中的节点便是参加咱们社会协作的每一个人,节点之间的通讯便是人与人之间的沟通交流,节点完结自己的核算任务也能够类比成咱们每一个人完结自己的本职作业。从这个含义上来说,现代社会协作网络的构建方针能够说和分布式体系有许多的共同的当地,比方咱们...

开源编程,开源编程的魅力与未来

开源编程,开源编程的魅力与未来

开源编程是指一种编程模式,其中源代码是公开的,允许任何人自由地查看、修改和分发。这种模式通常与自由软件和开放源代码软件相关联,旨在促进协作、透明度和创新。开源编程鼓励开发者之间的合作,共同改进和优化软件项目。开源项目通常由社区驱动,参与者可以贡献代码、报告错误、提供反馈和建议。这种模式有助于加速软件...

区块链100问

区块链100问

如果你想了解区块链,可以参考以下几个资源:1. 网易公开课 区块链100问: 火币打造的区块链100问系列动画,对区块链进行了系统梳理,适合想要了解区块链的你。你可以观看这个系列动画来获取详细的区块链知识。2. 哔哩哔哩 区块链100问: 哔哩哔哩上也有区块链100问的视频,内容涵盖...