哪里来的需求?


众所周知,由于不同的设备配置不同。导致其CPU和GPU处理能力有高有低。同样的游戏想要在所有设备上运行流畅且画面精美,是不可能的。这就需要我们针对不同的设备能力进行画质调节,以保证游戏的流畅运行。
 

我们需要控制什么?


想要得到我们需要控制什么,只需要找出影响游戏运行效率的点即可。 当然在此不能一一列举出所有游戏类型的点。但笔者就个人经验,列出一些能用点。
*贴图精度
*渲染面数
*材质复杂度
*粒子数目
*阴影质量
*水面效果
*增强性场景交互
*引擎后期效果
下面,我们就一个点一个点来说明原因,并给出常见的优化方法。
 

贴图精度:SKIP MIPMAP


贴图精度影响的是tex2D、texCUBE等采样指令的速度。对于显卡较次的机器来说,可能会是一大瓶颈。一般的引擎都提供了SKIP MIPMAP的能力。
SKIP MIPMAP即在上传贴图数据的时候,跳过指定级数的MIPMAP。 这样在SHADER中进行访问时,使用的就是低级别的贴图精度。 比如,一张1024x1024的贴图。 SKIP MIPMAP设置为1。表示要跳一级MIPMAP。 那SHADER中采样的时候。最大分辨率将会是512x512。
 

渲染面数:裁剪&LOD&DETAIL


渲染面数与DRAW CALL数目,会受GPU位宽、GPU频率限制。 当超出负载时,帧率会骤然下降。 这就要求我们需要对渲染面数有一个很好的控制。常见的控制手法有3种
1、减小裁剪距离
     剪裁距离的减小,会将远处的景物裁剪掉。 从而减少DRAW CALL和提交的面数。
     注:这里说的减小裁剪距离,一定是和视锥体裁剪时一起使用,当靠摄像机的FAR CLIP PLANE,作用很小。
2、模型LOD
     随着距离的增加,景物的细节会看不清。此时我们可以减少细节。
     注:LOD的切换,可以是两个策略分管。 一是距离,二是根据机型配置。 取距离计算结果和机型配置结果中最大的LOD等级。
3、隐藏细节
     场景中的景物,根据主次关系进行标记。不同的主次关系的景物,受不到同的裁剪距离的影响。 比如,地表可视距离为1000,树木可视距离为800,花草可视距离为500。
     注:主次细节的显示与否,可以是两个策略分管。一是距离,二是根据机型配置。距离计算结果和机型配置结果都需要显示时,才显示。
 

材质复杂度:切换SHADER


材质复杂度是整个画质和效率控制系统中的大头,毕竟大部分的开销都因材质而起。归根结底,材质复杂度的控制,就是切换不同的SHADER。 使得GPU运算复杂度降低。笔者参与的引擎和游戏开发项目中,遇到过两种。
1、宏控制的SHADER编译
     宏控制的SHADER编译,是指在SHADER中使用一些宏定义。在对SHADER进行编译时,将设备定义的宏开关附加到SHADER代码顶部,编译器根据宏内容进行编译。 这个方案的优点是,一套代码适配多个设备配置。但这个方案也有一个缺点,就是如果要进行实时切换,则会触发SHADER的重新编译。如果是手机项目,一般都是启动的时候进行硬件检测,选择最适合当前机型的编译配置进行材质的初始化。 而对于端游等项目,则需要考虑动态切换问题。
     注:这个方案,汇编级的SHADER不支持。 比如DX ASM、STAGE3D AGAL。 
     PS:笔者曾经工作的公司的一个自研手游3D引擎是用的这个方案,十分好用。 前提是中间不要让玩家切换画质。
     PPS:UNITY3D也支持这种方案。
2、切换Technique
     这是基于一个材质拥有多个Technique,且Technique不是用来区分材质。 也就是说,在这种情况下,Material作为区分一个模型材质的单元。 其内包含的Technique用于做设备的性能适配。这样的方案下,不同的情况下,需要切换高中低配置时,只需要切换Technique即可。
     注:这个方案,常见引擎都支持,如OGRE,UNITY3D。
 

粒子数目:禁用发射器


一个粒子特效可能有一个或者多个发射器构成。这样的话,我们可以为每一个发射器指定一个LOD等级(如果不支持额外添加数据的,可以通过发射器名字加前缀,比如 LOD0_FIRE0,LOD1_FIRE1等)。 我们再根据玩家的选择或者配置禁用发射器。以达到减少粒子计算和渲染的开销。
 

阴影质量:SHADOW MAP精度&选择性开关


阴影无疑是增强画质的一个有利武器。 但是当玩家机器配置无法为阴影质量买单时,就只有选择性关闭了。 比如,可以给NPC,怪物,BOSS,其他玩家,玩家自己都配置一个阴影标记。 一般有 实时阴影、脚底黑圈、关闭 三种。再根据机型配置或者玩家选择进行动态的开关各单位的阴影。
 
阴影的效率开销还受另外一些参数的影响。比如SHADOW MAP的分辨率,是否要使用软阴影等。
 

水面效果:折射&反射&普通水面


水面效果一般有以下4种
1、实时折射  + 实时反射 ( 现在的主流配置)
2、实时反射(早期一些MMORPG使用)
3、普通水面+CUBEMAP反射(丝路传说那种)
4、普通半透明水面(WOW早期那种)
 
如果都实现了,那根据玩家选择即可。 和LOD一样,取玩家选择和配置的最大值。
 

增强性场景交互


比如,地上的小鸟在来回走动,玩家跑过时,会惊飞。 又比如,玩家进入草丛时,草丛会因为受玩家力的影响左右晃动。
这样的一些细节,着实令整个世界显得更加真实。 但CPU和GPU的额外开销,也是一笔不小的账。 因此,提供一个配置,供玩家和机型开关。
 

引擎后期效果


引擎后期效果,如BLOOM,HDR,热力扭曲等,都会带来不小的开销。 提供开关让玩家或者机型配置即可。
 

总结


我们不指望自己的游戏在每一个玩家的机器上,都美仑美奂。 但我们希望自己的游戏,能够流畅的运行在每一个玩家的机器上。 这样至少给了玩家一次体验这个游戏的机会。 如果玩家愿意为这个游戏升级自己的配置,那又何尝不是一件值得让人骄傲的事!
 
 
 

3D游戏中的画质与效率适配的更多相关文章

  1. 3D游戏中各种空间变换到底是怎么回事

    每一个游戏可以呈现炫丽效果的背后,需要进行一系列的复杂计算,同时也伴随着各种各样的顶点空间变换.渲染游戏的过程可以理解成是把一个个顶点经过层层处理最终转化到屏幕上的过程,本文就旨在说明,顶点是经过了哪 ...

  2. 3D游戏中人物换装解决方案

    换装基本上是每个网游都必须有的一个功能,每种网游的做法都各有不同,有些是换掉整个模型,有些则是通过可以换掉模型的一个部分完成.前者属于整体换,相对简单些:后者则是通过部分替换实现,目前用的比较多,本文 ...

  3. [转]显卡帝揭秘3D游戏画质特效

    显卡帝揭秘3D游戏画质特效 近几年来,大量采用最新技术制作的大型3D游戏让大部分玩家都享受到了前所未有的游戏画质体验,同时在显卡硬件方面的技术革新也日新月异.对于经常玩游戏的玩家来说,可能对游戏画质提 ...

  4. 转载:[转]如何学好3D游戏引擎编程

      [转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...

  5. 3D游戏引擎中常见的三维场景管理方法

    对于一个有很多物体的3D场景来说,渲染这个场景最简单的方式就是用一个List将这些物体进行存储,并送入GPU进行渲染.当然,这种做法在效率上来说是相当低下的,因为真正需要渲染的物体应该是视椎体内的物体 ...

  6. [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 在<仙剑奇侠传>.<古剑奇谭>等游戏中,常常须要玩家在一个3D场景中 ...

  7. 3D游戏开发之在UE4中创建非玩家角色(NPC)

    接着上节我们继续学习,现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 一 创建C++类 1) 在UE编 ...

  8. 图形与游戏中3D数学基础的说明

    1.左手坐标系与右手坐标系没有好坏之分,不同的研究领域和不同的背景下,选择不同的坐标系:传统计算机图形学采用“左手坐标系”,线性代数则倾向于使用右手坐标系 坐标系由坐标轴与坐标原点组成.原点定义坐标系 ...

  9. 3D游戏与计算机图形学中的数学方法-变换

    1变换 在3D游戏的整个开发过程中,通常需要以某种方式对一系列的向量进行变换.通常用到的变换包括平移,缩放和旋转. 1.1通用变换 通常可将n x n可逆矩阵M看成是一个从坐标系到另一个坐标系的变换矩 ...

随机推荐

  1. wordpress多站点配置

    wordpress作为全球第一的个人博客搭建平台一直在国内外有着较高的人气,从3.0版本开始就已经支持多站点的搭建.该功能可以让子站点运行主站点的程序,不需要再每个站点分别存放网站程序.最近更新的4. ...

  2. Word/Excel 在线预览

    前言 近日项目中做到一个功能,需要上传附件后能够在线预览.之前也没做过这类似的,于是乎就查找了相关资料,.net实现Office文件预览大概有这几种方式: ① 使用Microsoft的Office组件 ...

  3. Vue-Router 页面正在加载特效

    Vue-Router 页面正在加载特效 如果你在使用 Vue.js 和 Vue-Router 开发单页面应用.因为每个页面都是一个 Vue 组件,你需要从服务器端请求数据,然后再让 Vue 引擎来渲染 ...

  4. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  5. ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器

    原文: Dependency Injection and Controllers 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core MVC 控制器应通过 ...

  6. myeclipse 内存不够用报错PermGen space 和 An internal error has occurred.

    最近项目中又增加了新的模块,项目的代码又多了不少.运行的时候总是报如下错误 Exception in thread "http-apr-80-exec-6" java.lang.O ...

  7. 子类继承父类时JVM报出Error:Implicit super constructor People() is undefined for default constructor. Must define an explicit constructor

    当子类继承父类的时候,若父类没有定义带参的构造方法,则子类可以继承父类的默认构造方法 当父类中定义了带参的构造方法,子类必须显式的调用父类的构造方法 若此时,子类还想调用父类的默认构造方法,必须在父类 ...

  8. Atitit 管理原理与实践attilax总结

    Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...

  9. T-SQL 拆分使用指定分隔符的字符串(split string)

    比如有一个表,我们需要些一个语句像SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......' , 然后就能返回分割成单独的行. 原表: | So ...

  10. Linux基础介绍【第五篇】

    linux权限位 Linux文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件属主权限.属组权限.其他用户权限. r:read可读权限,对应数字4: w:write可写权限,对应数字 ...