游戏开发50课 性能优化8

news2024/9/24 7:25:46

 

4.2 渲染状态优化

4.2.1 状态缓存

在引擎侧,可以使用状态缓存减少渲染管线的切换。伪代码:

class RenderStateCache
{
public:
    void InitRenderStates();
    {
        for (RenderStateType t=RenderStateType.begin; t<RenderStateType.end; ++i)
        {
            _renderStateCache[t] = GetRenderStateFromDevice(t);
        }
    }

    void SetRenderState(RenderStateType state, RenderStateValue value)
    {
        // 如果要设置的状态和当前缓存的一样,则忽略。
        if (_renderStateCache.count(state) > 0 && _renderStateCache[state] == value)
        {
            return;
        }
        _renderStateCache[state] = value;
        SetRenderStateToDevice(state, value);
    }

private:
    std::map<RenderStateType, RenderStateValue> _renderStateCache;
};

4.2.2 渲染状态建议

  • 少用Alpha Blend。开启Alpha Blend了一般会关闭深度测试,无法利用深度测试剔除多余片元,导致片元数量增加,造成过绘制。所以要尽量少用。
  • 禁用Alpha Test。现代部分移动端GPU采用了特殊的渲染优化方式,如PowerVR采用Tile Based Deferred Rendering方式(下图右),而Alpha Test会破坏Early-Z优化技术,可用Alpha Blend代替。更多看这里。

  • 开启背面裁剪。背面裁剪可以将背向摄像机的面片剔除,减少顶点和片元的数据量。
  • 开启MipMaps。开启后,渲染时会自动根据画面尺寸选择合适大小的纹理,从而降低带宽,也可以降低锯齿,提高画质效果。但UI界面不能开启,原因见2.2.3。
  • 关闭雾。只在固定管线适用。
  • 少用抗锯齿。图形API内置的抗锯齿通常会增加纹理采样次数数倍之多(下图),所以要慎用。

4.3 控制绘制顺序

控制模型绘制顺序的目的是充分利用深度测试,减少片元后续操作。特别是Early-Z技术的引入,此法效果更明显。绘制顺序是:先绘制已做好排序的不透明物体,再绘制Alpha Tested物体,最后渲染透明物体。伪代码:

void Render()
{
    // 1. 绘制不透明物体
    SortOpaqueObjectsInViewSpace(); // 对不透明物体进行排序,须在相机空间,离相机近的排在前面。
    DrawOpaqueObjects();            // 绘制不透明物体,离相机近的先绘制。

    // 2. 绘制Alpha测试物体
    SortAlphaTestedObjectsInViewSpace(); // 对Alpha测试物体进行排序,须在相机空间,离相机近的排在前面。
    DrawAlphaTestedObjects();          // 绘制Alpha测试物体,离相机近的先绘制。

    // 3. 绘制透明物体(注意:绘制顺序跟不透明物体刚好相反)
    SortTransparentObjectsInViewSpace(); // 对不透明物体进行排序,须在相机空间,离相机远的排在前面。
    DrawTransparentObjects();            // 绘制不透明物体,离相机远的先绘制。
}

4.4 多线程渲染

在单线程渲染架构中,CPU性能消耗过高会影响GPU的渲染帧率,反之,GPU渲染过慢也会让CPU一直处于等待状态。多线程渲染就是为了解决CPU和GPU相互等待的问题。以Metal/Vulkan等架构出现为界限,将它们分成两个阶段。

4.4.1 软件级多线程渲染

早期的图形API和硬件架构都不支持多线程渲染,此阶段多线程渲染能做的优化比较受限,只能将渲染提交独立成一个线程,使之不会卡逻辑线程。开源图形渲染引擎OGRE的多线程渲染实现方式有两种:

  • Middle-level Multithread

    每个渲染物体都有两份实例,主线程改变其中一份数据,在下一帧给渲染线程使用。(下图)

​ 

​ 这种方式实现很复杂,要维护物体的两份实例,也不容易在多核CPU做扩展,不能充分发挥多核CPU的优势。

  • Low-level Multithread

这种实现方式是将渲染物体的顶点等数据拷贝一份,逻辑线程修改其中一份数据,下一帧给渲染线程使用。除了以上两种方案外,可以给逻辑线程的若干逻辑(如Update/粒子/动画)开辟多个线程(下图),并行计算,缩短整体处理时间。

4.4.2 硬件级多线程渲染

近几年,Metal/Vulkan图形架构横空出世,基于硬件级别的多线程渲染的时代终于到来。它们的特点:

  • 轻量化的驱动层。

OpenGL的API和驱动做了很多逻辑封装,用状态机的方式实现渲染(下图左)。而Metal/Vulkan与之不同的是,在驱动层只做少量的工作,为应用程序提供直接访问GPU硬件的接口,属于轻量级封装(下图右)。

 

从API架构上看,Metal/Vulkan的性能已胜出一大筹。

  • 支持硬件级的多线程渲染。

Metal/Vulkan支持并行渲染指令,方便CPU各个线程各自提交渲染指令和数据。下图展示的是其中一种渲染方式,由多个线程创建不同的绘制命令,再由单独的线程管理渲染命令队列,统一提交给GPU绘制。

由于图形API已经支持多线程渲染指令提交,再结合上一节讲到的若干方案,将如虎添翼,渲染性能也会发生质的提升。目前主流商业引擎已经支持Metal/Vulkan,Unity2018.3已经支持Metal/Vulkan:

Unity在Rendering设置面板可以开启多线程渲染:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计基于微信小程序的网络办公系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.3 流控模式【链路】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.3 流控模式【链路】31.3.1 流控模式 - 链路31.3.2 举个栗子31.3.3 总结31 限流规则…

Vite + Vue3 + Electron 创建打包桌面程序、实现进程通信

目录 1. Electron 介绍 2. 使用 Vite 构建 Electron 项目 2.1 创建 Vite 应用&#xff0c;安装 Electron 依赖 2.2 在 vite.config.ts 中&#xff0c;配置 Electron 入口文件 2.3 编写 electron / index.ts 2.3.1 app、BrowserWindow 2.3.2 使用 win.loadURL 加载窗口 /…

Autosar MCAL-GTM之TOM

文章目录前言定时器输出模块&#xff08;TOM&#xff09;TOM产生PWM的原理TOM中断中断使能中断模式中断映射CFG中TOM通道配置TOM Channel EnableTomChDisableOnTgcTriggerTOM Channel EnableTOM Channel OutputTomChOutputDisableOnTgcTrigTomChannelOutputControlTomChannelOu…

【项目_05】tabcontrol的搭建及回显、使用keep-alive缓存页面、移动端适配 | 基于Vue3全家桶

&#x1f4ad;&#x1f4ad; ✨&#xff1a;tabcontrol的搭建及回显、使用keep-alive缓存页面   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 总不能还没努力就向生活妥协吧&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&#xff0c;希…

【双向ConvLSTM Network:遥感融合】

D2TNet: A ConvLSTM Network With Dual-Direction Transfer for Pan-Sharpening &#xff08;D2TNet: 双向传输的卷积长短期记忆递归神经网络用于泛锐化&#xff09; 本文提出了一种高效的具有双向传输的卷积长短期记忆递归神经网络&#xff08;convolutional long short-ter…

Java Agent 探针技术

Java 中的 Agent 技术可以让我们无侵入性的去进行代理&#xff0c;最常用于程序调试、热部署、性能诊断分析等场景&#xff0c;现如今比较火热的分布式链路追踪项目Skywalking&#xff0c;就是通过探针技术去捕获日志&#xff0c;将数据上报OAP观察分析平台。 Java Agent 技术简…

Socket编程实现TCP、UDP样例

文章目录一.Socket简介二.Socket实现TCPTCP通信简介使用对象及方法简介代码实现服务端代码客户端代码三.Socket实现UDPUDP通信简介UDP程序的使用步骤代码实现服务端代码客户端代码一.Socket简介 socket套接字是通信的基石&#xff0c;是支持TCP/IP协议的路通信的基本操作单元.…

私企招聘:思特威社会招聘

关于我们 思特威&#xff08;上海&#xff09;电子科技股份有限公司 SmartSens Technology &#xff08;股票简称&#xff1a;思特威&#xff0c;股票代码&#xff1a;688213&#xff09;是一家从事CMOS图像传感器芯片产品研发、设计和销售的高新技术企业&#xff0c;总部设立…

pads logic 生成参考编号带分隔符以及不统计不贴元器件的BOM

1.查看BOM报告 &#xff0c;这里可以通过下面的方法 Step1:点击文件 Step2: 勾选材料清单&#xff0c;然后点击设置 Step3:在弹出的如下窗口&#xff0c;选择剪切板视图 &#xff0c;然后选择全选,然后复制&#xff0c;将数据粘贴到excel表格中即可。 2. 参考编号分隔符 …

以前不知道字节面试难在哪,现在体验到了,被虐的很惨

…(这里省略一些不清楚、不知道、忘记了之类的词藻&#xff0c;保留一丝尊严。) 接下来是关于redis哲学三连“是什么?为什么?怎么用?” 我把肚子里仅有的关于Redis的一滴墨水挤成了三滴&#xff0c;仍然没有给出他想要的。继续追问Redis的数据存储方式&#xff0c;操作方法…

微服务框架 SpringCloud微服务架构 微服务保护 30 初识Sentinel 30.1 雪崩问题及解决方案

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护30 初识Sentinel30.1 雪崩问题及解决方案30.1.1 雪崩问题30.1.2 总结30 初识Sentinel 30.1 雪崩问…

类别不平衡Class-imbalance解决方法

类别不平衡是指分类任务中不同类别的训练样例数目差别很大的情况。 1、扩大数据集 2、欠采样 欠采样&#xff08;under-sampling&#xff09;&#xff1a;对大类的数据样本进行采样来减少该类数据样本的个数&#xff0c;使其与其他类数目接近&#xff0c;然后再进行学习。 随…

第十四届蓝桥杯集训——JavaC组第九篇——位运算符

第十四届蓝桥杯集训——JavaC组第九篇——位运算符 目录 第十四届蓝桥杯集训——JavaC组第九篇——位运算符 值交换 异或值交换 其它位移符号&#xff1a; 这个稍微难度大一些&#xff0c;基础的有【&与、|或、^异或、<<左位移、>>右位移】。 我们一个一个…

游戏开发43课 移动游戏性能优化2

2. 资源优化 病从口入&#xff0c;资源好比是入口&#xff0c;它们若出现问题&#xff0c;会引发一连串性能问题。相反&#xff0c;资源若是优化得好&#xff0c;后面所有章节的性能都可受益。这也是把资源优化的章节提到最前的原因。 2.1 纹理优化 纹理优化的目的是让它们占…

多锦鑫能:低碳化、智能化、无人化矿山运营时代来临

全球气候变暖已经成为人类社会必须面对的重大课题&#xff0c;国际社会在推动节能减排、实现碳中和大目标上也已经达成一致意见。中国作为全球第二大经济体和负责任的大国&#xff0c;也明确向国际社会承诺&#xff0c;将在2030年实现碳达峰、2060年前实现碳中和目标。 围绕这…

[附源码]计算机毕业设计基于Vuejs的中国名茶销售平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

作者推荐 | 【分布式技术专题】「架构设计方案」图解学习法总结集群模式下的各种软负载均衡策略实现及原理分析

背景介绍 在分布式系统中&#xff0c;负载均衡是非常重要的环节&#xff0c;通过负载均衡将请求派发到网络中的一个或多个节点上进行处理。 通常来说&#xff0c;负载均衡分为硬件负载均衡及软件负载均衡。硬件负载均衡&#xff0c;顾名思义&#xff0c;在服务器节点之间安装专…

功能安全软件架构

已剪辑自: https://mp.weixin.qq.com/s/pCenGTqg2Xi_t7b8ebNHMA 1. E-GAS 安全架构思想 汽车功能安全旨在把电子电气系统失效而导致的人身危害风险控制在合理范围内。下图是常见的电子电气系统硬件构成图&#xff0c;一个电子电气系统的构成要素&#xff0c;除了图中可见的硬…

均值坐标参数化(MVC Parameterization)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 均值坐标定义 均值坐标定义 v0是多边形v1v2v3...vn内的一点v_0是多边形v_1v_2v_3...v_n内的一点v0​是多边形v1​v2​v3​...vn​内的一点 就会存在均值坐标ϕi(v0)ω…