游戏渲染性能优化

忘记了以前是不是写过类似的文章了,不管了,结合近几年经验总结一下。

先从最核心的部分开始。如果熟悉图形API的朋友都应该可以理解,要想渲染一个模型,我们至少需要做两个操作,设置各种状态,调用绘图函数。这两个操作都会引起性能损失。我们分头来说

先说设置各种状态。都什么状态呢,比如使用什么纹理,是用什么着色器,是否开启Alpha测试,是否双面显示,是否使用混合以及怎么混合,等等。我们可以管这些状态统称为材质。这些信息通过调用图形API,再通过驱动进而设置给显卡。这需要时间,而且有些状态改变很耗时。

那么如何优化呢,问题出在哪就在那里解决,简单来说就是尽可能减少状态的改变!

对游戏而言引起状态改变比较多的首先是纹理的不同,这也是为什么要讲求纹理打包。举个例子,有三个模型,分别对应三张贴图,那么渲染这三个模型时势必会分别为他们设置三次纹理,这就造成了纹理状态的改变。如果把这三个模型的纹理放到一张纹理上之后,只需要设置一次纹理,然后分别渲染他们即可,这样就省掉了两次切换纹理。同样的道理也适用于Shader。

如果是自研引擎的话,可做的事情可以更多

1.抽象出一层图形API层,在其中做好状态缓存,当同样API被调用多次且内容一致时,只有第一次会真正去调用图形API.

2.做好材质排序,并给予材质进行渲染。简单来说场景里面有很多模型,他们有相当一部分材质相同,那么把使用相同材质的模型收集起来,设置一次材质,然后逐个进行渲染。

3.要搞清楚不是所有状态改变代价都相同,而且完全相同的材质也会比较有限,所谓材质排序只是排序那些切换代价比较大的状态即可,比如纹理,比如Shader等。

接下来再说调用绘图函数本身,一次调用就是一次DrawCall.

这个函数不用多说,它内部进行各种设置后就开始渲染了。要想优化他就需要搞清楚现代GPU的一些特性。

现代GPU一般都可以一次渲染大量多边形,但是对drawcall数量较为敏感。PC上3000个以上就会显著影响性能了,手机上不要超过200个为好。与此同时虽说一次可以渲染大量多边形,但其也是有限度的,不是越大越好。如何平和drawcall数量以及单次渲染多边形的数量成为了关键。基本的方法就是根据具体场景情况,适当合并模型。

如果是自研引擎的话,可以做的事情可以更多

1.更有效的场景管理以及筛选方法,使送入渲染引擎的多边形数量最少

2.使用实例(移动平台上只有GLES3以上才支持)

总结以上两点就是,尽可能少的状态改变,尽可能少的DrawCall!

其他

目前手机上送入图形API进行渲染的多边形尽可能控制在10w三角面以下,如果考虑适配几年前的机型,那么这个数量还要再低!

能用LightMap表现的就不要用实时光,而且目前也很难大面积高性能的使用!

Shader要尽可能算法简单,能在VS阶段算的就不要放在FS上算。也不要是用什么pow这样的函数。

终极优化

有时候技术人员想破脑袋也搞不定的优化,也许美术人员三两下就在max里面搞定了。

有时候技术人员和美术人员想破脑袋也搞不定的优化,也许在策划那边稍微改变一下要求就搞定了。

说到底是还是游戏开发各个环节上的人员要多沟通!

时间: 2024-11-04 00:50:33

游戏渲染性能优化的相关文章

react+redux渲染性能优化原理

大家都知道,react的一个痛点就是非父子关系的组件之间的通信,其官方文档对此也并不避讳: For communication between two components that don't have a parent-child relationship, you can set up your own global event system. Subscribe to events in componentDidMount(), unsubscribe in componentWillU

公司H5游戏客户端性能优化整理

近期在一家公司负责H5游戏加载速度优化,这里把近期做的项目优化项做一个整理分享: html渲染流程 HTML解析过程:构建DOM树.构建CSSOM树.根据DOM树和CSSOM树构建render树.有了render树就开始布局Layout.最后绘制paint. 1.构建DOM树:  将HTML构建成一个DOM树,也就是构建节点,把所有的节点都构建出来. 2.构建CSSOM: 解析css去构建CSSOM树. 3.构建render树: DOM已经构建好了,css也有了,浏览器就会根据这两个来构造ren

游戏开发性能优化经验总结

优化概论 说起游戏的优化,在游戏开发中经常分为这几步: 首先要确定游戏中经常会出现哪些问题 – Profile 然后确定在哪些方向进行性能优化 – Analyze 最后再尽可能将问题逐个解决 – Solve 游戏开发中一定是先做工具,进行Profile,再进行优化,所以,说优化就不得不再扯一下Profile 常见的工具有一些是引擎和IDE自带的,比如Unity自带的Profiler,就包含了CPU,GPU,Memory等等各式各样的性能分析工具,其他的比如GPA,Xcode Instrument

android app性能优化大汇总(UI渲染性能优化)

UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑这个问题.研究表明,0-100毫秒以内的延迟对人来说是瞬时的,100-300毫秒则会感觉明显卡顿,300-1000毫秒会让用户觉得“手机卡死了”,超过1000ms就会让用户想去干别等事情了. 这是人类心理学最基础的理论,我们可以从这个角度去优化页面/view/app的加载时间. Ilya Grigo

浏览器渲染性能优化

染性能 页面不仅要快速加载,而且要顺畅地运行:滚动应与手指的滑动一样快,并且动画和交互应如丝绸般顺滑. 60fps 与设备刷新率 目前大多数设备的屏幕刷新率为 60 次/秒.因此,如果在页面中有一个动画或渐变效果,或者用户正在滚动页面,那么浏览器渲染动画或页面的每一帧的速率也需要跟设备屏幕的刷新率保持一致. 其中每个帧的预算时间仅比 16 毫秒多一点 (1 秒/ 60 = 16.66 毫秒).但实际上,浏览器有整理工作要做,因此所有工作需要在 10 毫秒内完成.如果无法符合此预算,帧率将下降,并

前端小游戏页面性能优化

公司是做教育类游戏开发,以前是用flash制作,现在开始使用CreateJS框架开发Canvas游戏.今天突然收到一个任务:游戏在iPad2下面游戏会打不开,然后自动刷新,再加载不出来,然后再刷新,陷入了死循环…… 发现问题: 屏幕左上角提示 “因出现错误 重新加载了网页” 解决问题: 通过度娘得知此问题是由越狱或内存引起的.排除越狱可能(因为没有越狱),剩下就是内存问题.打开Chrome更多工具里面的任务管理器(快捷键Shift+Esc)看到单页内存占用量一路飙升到800,000K左右,当时自

Cocos2d-x游戏性能优化分享大赛 奖最新出版《我所理解的Cocos2d-x》

由于移动平台的硬件性能及移动网络限制,以及便携设备耗电的特征,对移动平台游戏进行性能优化至关重要,从应用程序包的大小,到应用程序运行时期的内存占用,应用程序计算导致的耗电大小等,都能对移动游戏的优化带来很大的改善. 征文主题: 1,提供一些自己工作中实践的一些对游戏进行性能优化的方案,例如减少纹理占用内存,减少算法复杂度,减少耗电量等均可. 2,从OpenGL ES渲染管线等角度思考我们可以怎样更好地优化我们的应用程序,例如减少DrawCall等.

【杂谈】BI系统的前端性能优化

近一年,由于笔者团队的一些变化,笔者开始承担一个BI系统的前端应用的维护和迭代,一年中,围绕着这个BI系统,发生了不少令人啼笑皆非和醍醐灌顶的故事.最近,终于有时间把它们一点点的沉淀写来,以文字的形式呈现出来. 首先,简单介绍下笔者维护的这个BI系统,和常规的BI(Business Intelligence)系统一样,笔者的BI系统同样可以分为三层: 数据层:这一层其实主要是ETL的过程,即将业务数据库的数据通过抽取(Extract).转换(transform).加载(Load)到新的数据库中,

总结使用Unity 3D优化游戏运行性能的经验

流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow Blade>已经将在标准iPhone和iPad设备上实现每秒60帧视为一个重要目标. 以下是我们在紧凑的优化过程中提升游戏运行性能,并实现目标帧率时需要考虑的事项. 当基本游戏功能到位时,就要确保游戏运行表现能够达标.我们衡量游戏运行表现的一个基本工具是Unity内置分析器以及Xcode分析工具.使用Unity分析器来分析设备上的运行代码真是一项宝贵的功能. 我们总结了这种为将目标设备的帧率控制在60fps而进行衡量.调