【转】渲染性能优化:如何平衡GPU和CPU
本节主要讲一下虚幻渲染之前,都发生了什么。
渲染流程:
首先,虚幻的渲染由三个线程共同完成。分别是CPU线程,DRAW线程,和GPU线程。
CPU线程:顾名思义,运行在CPU上,用于计算游戏中的所有逻辑,比如每个游戏对象的模型位置,动画计算结果(位置)。简要来说,就是计算出所有模型的位置信息,供渲染线程使用。
DRAW线程:该线程大部分逻辑运行在CPU上,部分逻辑运行在GPU上,这一个线程的主要功能是决定场景中的哪些部分最终会参与渲染。
GPU线程:实际渲染发生的地方。
这三个线程按照CPU->DRAW->GPU的顺序执行,请观察下图:
假如我们有4帧画面要渲染,分别是FrameA、FrameB、FrameC、FrameD。最下方是时间轴(以毫秒为单位)
为了将第一张画面(FrameA)呈现在我们面前,首先就是Cpu在0毫秒的时候处理FrameA,然后紧接着在第33毫秒Draw线程再对经过Cpu线程处理后的FrameA进行再处理(遮挡剔除,后面会讲),这时候Cpu线程在33毫秒处开始处理FrameB。之后在第66毫秒Gpu线程开始实际渲染FrameA。与此同时,Draw线程已经开始处理FrameB了,同时Cpu线程则已经开始处理FrameC。依此类推。。。
一个画面,经过三道工序处理,最终呈现到我们的面前,而这三道工序经过的时间是66ms。这就是cpu和gpu线程之间的线程同步。
遮挡处理:
在让渲染线程实际开始渲染画面的时候,我们需要对要渲染的对象进行一个筛选,一个游戏里的世界那么大,可我们玩家所看到的画面只是整个游戏世界中的某一个角度的画面,没必要将那些我们看不到的东西都渲染一遍。所以就要做遮挡处理,将不需要被渲染器渲染的东西,给移除之后,再进行渲染。
遮挡处理部分主要运行在Draw线程,前面说过,它决定了哪些对象最终会参与渲染。
虚幻主要有4种遮挡处理方案。分别是距离剔除,视锥剔除,预计算可见性和遮挡剔除。它们按照性能消耗从小到大的顺序依次执行。
距离剔除:简单点说,就是在场景里放一个大大的Cull Distance Volume(距离剔除体积)盒子,在这个盒子内的所有对象,如果太远,就直接消失掉,不渲染它。
视锥剔除:简单点说,视锥其实就是摄像机的视角,像个锥子一样任何没在这个画面中的对象,都会被剔除掉,不参与渲染。值得注意的是,比如你当前的摄像机视角,只看到了一个特别特别大的物体的其中一个三角形,那么这个整个物体也会参与渲染!这就是为什么,天空盒以及地形这种东西,像屎一样甩不掉,总是会被渲染到(所以地形可以分小块做)。
预计算可见性剔除:简单点说,还是放一个precomputed visibility volumes盒子到场景中,这个盒子会将自身分割成很多小小的块。小块记住哪些可见,哪些不可见。用得好像不太多。
遮挡剔除:这是最后一种方案,也是最耗费性能的一种方案,它会对每一个对象都执行,比如,A可不可见?然后B可不可见?然后C可不可见?如果场景里有10w个对象,它就得问10w次。
遮挡处理完毕后,就可以把这些最终确认会参与渲染的对象传送给渲染线程进行渲染了。可是,为什么这四种剔除方案要按照性能消耗从小到大的顺序执行呢?
简单点描述就是:用廉价的人干最多的事儿,用最优质的人干最少的事儿。
复杂版本:我说过了,遮挡剔除是很耗费性能的一个过程。所以,假如你的场景中有10w个对象。先用距离剔除把远处的东西给去掉,好,10w个对象变成7w了,然后,利用视锥剔除,再从7w给砍到3w,然后再利用预计算可见性剔除,给看到7k。最后到了遮挡剔除这个步骤的时候,只需要问7k次“你可不可以被看到呀?”,而不是问10w次!
常用命令:
在虚幻4的控制台里,可以输入Freezerendering和Unfreezerendering来冻结和取消冻结当前渲染的画面。用人类的语言来描述就是,当你敲下这个命令的那一瞬间,除了你ue4编辑器当前视口能看到的东西,其他不参与当前这一帧渲染的物体都消失了,就这么简单。
Stat Initviews可以查看当前消耗,如果视图中显示超过10k个对象,就会有性能影响。
关于渲染性能优化这方面,重要的是找到一个平衡。模型大了,对Gpu不好(比如视锥剔除,看到一个非常大的地形边缘上的一根草,也会参与计算),模型多了,则对Cpu不好(要处理的对象变多了)
【转】渲染性能优化:如何平衡GPU和CPU相关推荐
- 渲染性能优化之Culling 剔除
几种剔除: 背面裁剪(Backface Culling) 视锥裁剪(View Frustum Culling) 遮挡剔除(Occlusion Culling) 层次视锥裁剪(Hierarchical ...
- 从Webkit内部渲染机制出发,谈网站渲染性能优化
点击上方"IT平头哥联盟",选择"置顶或者星标" 一起进步- 作者:jerryOnlyZRJ 本文是对前文:网站性能优化实战--从12.67s到1.06s的故事 ...
- 渲染性能优化之几种LOD层次细节总结
CIM(城市信息模型)这种大场景或者说特大场景LOD是非常重要的,城市.BIM.地形都非常系需要,根据公司的项目需求这里做了一下总结各种LOD的技术.算法.策略. 首先,我们公司对于城市这种大场景我们 ...
- 携程RN渲染性能优化实践
一.背景 随着 React Native 在前端业界规模性的应用越来越多,各大厂也对其渲染性能越来越看重. 渲染性能的主要评判指标是FMP与TTI,在 React Native 以跨平台前端框架身份逐 ...
- 干货 | 携程RN渲染性能优化实践
作者简介 佳璐,前端开发专家,关注前端框架.性能.质量.效率和新技术. 一.背景 随着 React Native 在前端业界规模性的应用越来越多,各大厂也对其渲染性能越来越看重. 渲染性能的主要评判指 ...
- 奇舞周刊第 412 期:从硬件、渲染、计算三大视角解析渲染性能优化的本质
记得点击文章末尾的" 阅读原文 "查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞精选 ■ ■ ■ 从硬件.渲染.计算三大视角解析渲染性能优化的本质 渲染性能优化是个经久不衰的话 ...
- 硬件加速下webview切换闪屏_网页渲染性能优化 —— 性能优化下
博客 有更多精品文章哟. Composite 的优化 终于,我们到了像素管道的末尾.对于这一部分的优化策略,我们可以从为什么需要 Composited Layer(Graphics Layer)来入手 ...
- android app性能优化大汇总(UI渲染性能优化)
UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得"我的app加载很快"很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交 ...
- 性能优化系列(一)找出卡顿的元凶 —— 渲染性能优化
文章首发「Android波斯湾」公众号,更新地址:https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode 一个 Android 应 ...
最新文章
- 【实习内推】2020腾讯产品暑期实习招聘
- java 追加写入hdfs_java操作之HDFS-创建-删除目录-读写文件-追加写文件
- Eclipse 实用技巧
- 高并发核心Selector详解
- Mono源码学习笔记:Console类(四)
- AMD桌面处理器Roadmap也已泄露
- python第三周笔记_Python第四周 学习笔记(1)
- BDFZOI 迷宫问题
- 微信支付服务器繁忙,嘀嘀打车微信支付遭遇系统繁忙 订单过多挤爆服务器
- 人的思维谬误与心理学效应
- 什么是网络编程(一)
- 使用Scrapy爬取链家二手房
- python壁纸数据抓取_Python爬虫:爬取必应壁纸(可直接运行)
- 伤害世界不显示服务器,伤害世界肿么开服务器
- og协议-有利于SNS网站分享
- PHP获取客户端的IP
- git安装配置及基本使用
- 如何解决网站限制IP访问的问题
- Quality control of sequencing data
- 麦克斯韦方程组,史上最牛逼公式之一