SDL2 創(chuàng)建渲染器時只能指定使用軟件渲染還是硬件加速,無法選擇使用哪種圖形引擎實(shí)現(xiàn)硬件加速。SDL3 對此做了優(yōu)化,可以在創(chuàng)建渲染器時指定 rendering driver 也就是圖形引擎,比如在 Windows 平臺下可以指定使用 D3D11 也可以指定使用 OpenGL 或者 Vulkan。
SDL2 創(chuàng)建渲染器時只能指定使用軟件渲染還是硬件加速,無法選擇使用哪種圖形引擎實(shí)現(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ù)枚舉當(dāng)前所支持的圖形引擎:
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 指軟件渲染,我們可以通過這些名字指定渲染器使用的渲染引擎。
實(shí)現(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)閉垂直同步,對各渲染引擎分別進(jì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 的渲染性能和其他圖形引擎真的有這么大的差距。實(shí)際上對于復(fù)雜的圖形渲染,除軟件渲染外所有基于 GPU 的渲染性能上不會有太大的差距。
小編推薦閱讀機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動態(tài)代理的對比分析
閱讀Win11筆記本“自動管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)