SDL3 入门(4):选择图形引擎
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_GetNumRenderDrivers
和 SDL_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 的渲染性能上不会有太大的差距。
SDL3 入门(4):选择图形引擎的更多相关文章
- photoshop学习入门:选择和处理
昨天花了一天时间看了李涛的视频<高手之路>入门的24集,累得连写工作日报的力气都没了,19点就睡.今天4点起来,补一下记录. photoshop是个位图处理工具(别的花里胡哨的功能忽略)— ...
- iOS入门怎样选择Swift和objective-c
版权声明:本文为博主原创文章,未经博主同意不得转载.博主微信:lofocus https://blog.csdn.net/cuibo1123/article/details/28261795 学oc吧 ...
- ps入门教程:选择工具、移动工具、索套工具的使用
本节课程主要内容:1.学习矩形选择工具.椭圆选择工具.移动工具.多边形套索工具.套索工具.磁性套索工具和魔术 棒选择工具.2.用套索和磁性套索,实现对人物照片的抠图.----------------- ...
- 排序算法入门之选择排序-Java实现
本文参考http://blog.csdn.net/m0_37568091/article/details/78023705 选择排序是先从对象数组中选出最小的放在第一个位置,再从剩下的元素中选择次小的 ...
- 入门嵌入式选择2440?树莓派?STM32?4412开发板?
如果了解一下当前IT和物联网发展的形势,就会发现Android工程师越来越受欢迎,相比之下单纯的Linux工程师却逊色不少,当然,Android系统的内核也是Linux的,Linux和Android作 ...
- Python趣味入门4:选择往往是最重要的-条件语句
人生处处有选择,程序也有选择,为了让程序变得更加强壮,程序员必须考虑任何情况,上一篇了解到了如何使用Python来行顺序语句的编写,我们写了一个可以输入姓名的生日祝贺程序,今天我们挑战条件语句! 1. ...
- Redis快速入门:安装、配置和操作
本文是有关Redis的系列技术文章之一.在之前的文章中介绍了<Redis快速入门:初识Redis>,对Redis有了一个初步的了解.今天继续为大家介绍Redis如何安装.配置和操作. 系列 ...
- Python入门一:简单得不能再简单了##
从python的语法上看,简单得不能再简单了. 想学它,请移步廖雪峰python2.7教程以及python3.这实在是最好的入门教程.参考资料太多: 外国的教程 Python 入门指南 Python ...
- Redis快速入门:初识Redis
[IT168 专稿]在之前的文章中介绍了<Redis快速入门:选择Key-Value Store>,今天给大家介绍Redis的入门知识.Redis是一个开源的使用ANSI C语言编写.支持 ...
- 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 你必须安装开发者预览版本,才能使 ...
随机推荐
- 一个随时更新的js库
1.src同级建commFunction=>timer.js 2.main.js引入 import time from '../commonFunction/time' Vue.prototyp ...
- C#应用的欢迎界面窗体方案 - 开源研究系列文章
这次整理以前的代码,然后想到了应用的欢迎界面窗体的问题.这个例子是在应用中启动一个线程来进行显示欢迎窗体的,对于应用的启动无影响,与其他人的源码不相同,欢迎读者进行复用此类库. 以前有编写过欢迎界面窗 ...
- 4G EPS 的网络协议栈
目录 文章目录 目录 前文列表 LTE/EPC 协议栈 E-UTRAN 空中接口协议栈 用户平面协议 PHY 层 MAC 层 RLC 层 PDCP 层 控制平面协议 RRC 层 NAS 层 EPC 核 ...
- PageOffice6 实现 word 全文检索
在文档服务器中存储有成千上万个文档的情况下,用户想要找到并打开包含特定关键字的文档,无疑是一项艰巨的任务.如何高效地管理和检索大量的Word文档呢? 在现有的技术解决方案中,许多方法都依赖于服务器端的 ...
- 分布式任务调度内的 MySQL 分页查询优化
作者:vivo 互联网数据库团队- Qiu Xinbo 本文主要通过图示介绍了用主键进行分片查询的过程,介绍了主键分页查询存在SQL性能问题,如何去创建高效的索引去优化主键分页查询的SQL性能问题.对 ...
- 详解RocketMQ消息存储原理
本文基于RocketMQ 4.6.0进行源码分析 一. 存储概要设计 RocketMQ存储的文件主要包括CommitLog文件.ConsumeQueue文件.Index文件.RocketMQ将所有to ...
- Dubbo SPI扩展机制源码详解(基于2.7.10)
Dubbo SPI 一. 概述 本文主要分享 Dubbo 的拓展机制 SPI. 想要理解 Dubbo ,理解 Dubbo SPI 是非常必须的.在 Dubbo 中,提供了大量的拓展点,基于 Dubbo ...
- 13个优秀的AI工具软件导航网站推荐
人工智能(AI)是现在科技领域的热门话题,它不仅改变了我们的生活方式,也催生了许多创新的工具和应用.AI工具可以帮助我们完成各种任务,如绘画.编程.视频制作.语音合成等,让我们的工作和娱乐更加高效和有 ...
- Google,Baidu,Bing三大搜素引擎图片爬虫
Google,Baidu,Bing三大搜素引擎图片爬虫 参考https://mp.weixin.qq.com/s/75QDjRTDCKzuM68L4fg5Lg 这个爬虫由ID为sczhengyabin ...
- Aspire项目发布到远程k8s集群
前提 你必须会创建aspire项目,不会的请先看微服务新体验之Aspire初体验 Aspirate (Aspir8) Aspirate 是将aspire项目发布到k8s集群的工具 安装aspirate ...