您的位置:首頁 > 軟件教程 > 教程 > SDL3圖形引擎選擇和渲染性能測試

SDL3圖形引擎選擇和渲染性能測試

來源:好特整理 | 時間:2024-06-29 15:46:47 | 閱讀:161 |  標簽: 測試 引擎 S   | 分享到:

SDL2 創(chuàng)建渲染器時只能指定使用軟件渲染還是硬件加速,無法選擇使用哪種圖形引擎實現(xiàn)硬件加速。SDL3 對此做了優(yōu)化,可以在創(chuàng)建渲染器時指定 rendering driver 也就是圖形引擎,比如在 Windows 平臺下可以指定使用 D3D11 也可以指定使用 OpenGL 或者 Vulkan。

SDL2 創(chuàng)建渲染器時只能指定使用軟件渲染還是硬件加速,無法選擇使用哪種圖形引擎實現(xiàn)硬件加速。SDL3 對此做了優(yōu)化,可以在創(chuàng)建渲染器時指定 rendering driver 也就是圖形引擎,比如在 Windows 平臺下可以指定使用 D3D11 也可以指定使用 OpenGL 或者 Vulkan。

指定圖形引擎

SDL_CreateRenderer 函數(shù)的第二個參數(shù) name 表示指定使用的 rendering driver name ,傳 NULL 表示使用第一個支持的 rendering driver ,在 Windows 系統(tǒng)下通常是 D3D11。

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

SDL3 接口文件中沒有預(yù)定義 rendering driver name ,可以通過 SDL_GetNumRenderDrivers SDL_GetRenderDriver 兩個函數(shù)枚舉當前所支持的圖形引擎:

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 系統(tǒng)下執(zhí)行結(jié)果如下:

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 指軟件渲染,我們可以通過這些名字指定渲染器使用的渲染引擎。

渲染性能測試

實現(xiàn)一個簡單的類用來測試渲染幀率

// 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;

    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(now - last_print_time_);
    if (duration.count() >= 1000) {
        double elapsed_seconds =
            std::chrono::duration_cast(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 萬多幀,還不錯。這是全力渲染的結(jié)果,沒有開啟垂直同步,可以調(diào)用 SDL_SetRenderVSync 函數(shù)設(shè)置垂直同步:

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   

關(guān)閉垂直同步,對各渲染引擎分別進行幀率測試,結(jié)果如下:

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

D3D11 一騎絕塵,看來優(yōu)化的不錯。

注意這只是一個簡單的測試,性能瓶頸主要在從 CPU 提交渲染指令到 GPU 的過程,所以不代表 D3D11 的渲染性能和其他圖形引擎真的有這么大的差距。實際上對于復(fù)雜的圖形渲染,除軟件渲染外所有基于 GPU 的渲染性能上不會有太大的差距。

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認同期限觀點或證實其描述。

相關(guān)視頻攻略

更多

掃二維碼進入好特網(wǎng)手機版本!

掃二維碼進入好特網(wǎng)微信公眾號!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]

湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)