经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
SDL3 入门(4):选择图形引擎
来源:cnblogs  作者:小时了了  时间:2024/7/1 12:40:25  对本文有异议

SDL2 创建渲染器时只能指定使用软件渲染还是硬件加速,无法选择使用哪种图形引擎实现硬件加速。SDL3 对此做了优化,可以在创建渲染器时指定 rendering driver 也就是图形引擎,比如在 Windows 平台下可以指定使用 D3D11 也可以指定使用 OpenGL 或者 Vulkan。

指定图形引擎

SDL_CreateRenderer 函数的第二个参数 name 表示指定使用的 rendering driver name,传 NULL 表示使用第一个支持的 rendering driver,在 Windows 系统下通常是 D3D11。

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

SDL3 接口文件中没有预定义 rendering driver name,可以通过 SDL_GetNumRenderDriversSDL_GetRenderDriver 两个函数枚举当前所支持的图形引擎:

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

在 Windows 系统下执行结果如下:

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

其中 direct3d 指的是 D3D9,software 指软件渲染,我们可以通过这些名字指定渲染器使用的渲染引擎。

渲染性能测试

实现一个简单的类用来测试渲染帧率

  1. // performance.h
  2. ...
  3. class Performance final
  4. {
  5. public:
  6. Performance();
  7. ~Performance();
  8. void Reset();
  9. void IncreaseFrameCount();
  10. void PrintEverySecond();
  11. private:
  12. using Clock = std::chrono::high_resolution_clock;
  13. using TimePoint = std::chrono::time_point<Clock>;
  14. TimePoint start_time_;
  15. uint64_t frame_count_ = 0;
  16. TimePoint last_print_time_;
  17. uint64_t last_frame_count_ = 0;
  18. };
  1. // performance.cpp
  2. ...
  3. Performance::Performance()
  4. {
  5. Reset();
  6. }
  7. Performance::~Performance() {}
  8. void Performance::Reset()
  9. {
  10. start_time_ = Clock::now();
  11. last_print_time_ = start_time_;
  12. frame_count_ = 0;
  13. }
  14. void Performance::IncreaseFrameCount()
  15. {
  16. frame_count_++;
  17. }
  18. void Performance::PrintEverySecond()
  19. {
  20. assert(start_time_.time_since_epoch().count() > 0);
  21. assert(last_print_time_ >= start_time_);
  22. auto now = Clock::now();
  23. auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now - last_print_time_);
  24. if (duration.count() >= 1000) {
  25. double elapsed_seconds =
  26. std::chrono::duration_cast<std::chrono::milliseconds>(now - start_time_).count() /
  27. 1000.0;
  28. double average_fps = frame_count_ / elapsed_seconds;
  29. double realtime_fps = (frame_count_ - last_frame_count_) / (duration.count() / 1000.0);
  30. last_print_time_ = now;
  31. last_frame_count_ = frame_count_;
  32. fprintf(stderr, "Performance: FPS(AVR|RT): %.2f|%.2f \r", average_fps, realtime_fps);
  33. }
  34. }

我们先测试 D3D11 的渲染帧率:

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

3 万多帧,还不错。这是全力渲染的结果,没有开启垂直同步,可以调用 SDL_SetRenderVSync 函数设置垂直同步:

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

再次测试渲染帧率,60fps,和屏幕刷新率一致:

  1. INFO: Created renderer: direct3d11
  2. INFO: VSync: 1
  3. 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 的渲染性能上不会有太大的差距。

原文链接:https://www.cnblogs.com/xrunning/p/18275050

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号