如果游戏的渲染瓶颈来自于GPU

  首要任务就是找出造成GPU瓶颈的因素所在,通常GPU的性能受到像素分辨率的影响,特别是在移动客户端的游戏,但是内存带宽和顶点计算的影响也需要注意。这些因素的影响都需要实时的测试和定位。

像素分辨率

  像素分辨率是指GPU每秒可以渲染的像素个数,如果游戏受到像素分辨率的影响,则意味着游戏每帧描绘的像素点个数超过了GPU可以处理的极限。

  检测游戏是否收到像素分辨率的影响可以通过以下方式:

    . 分析游戏,注意GPU的运行时间;

    . 在unity的Player Settings中设置降低分辨率

    . 这时候运行分析游戏,如果游戏的性能得到提升,则有可能是像素分辨率造成性能问题。

  下面有一些方法来解决像素分辨率造成的问题:

    . shader中的片元着色器主要用来告诉GPU如何绘制每个片元的像素,所以如果片元着色器的执行效率不高,则会造成游戏性能的降低。复杂的片元着色器代码通常是造成分辨率问题的原因。

    — 如果我们采用内置的shader,在视觉特效上最好采用最简单和最优化的shader。例如,the mobile shaders that ship with unity就是高度优化的shader,我们可以通过使用他们来测试是否对游戏的性能有影响同时并不影响游戏的表现。这些shaders是专为手机平台而设计,但是在其他平台上也可以使用。特别在并不影响游戏的表现效果的情况下,使用这些shader有极大的优势。

    — 如果游戏中的物体使用Standard Shader,那么需要知道在unity中,这些shader的编译依赖于当前的材质设置。只有当前被使用的特性才会被编译。那么可以通过移除地图细节等特征来极大的提高片元着色器的性能。此外,如果在游戏中进行这样的操作测试,需要测试该操作是否会影响游戏的整体表现品质。

    — 如果游戏采用定制的shader,则我们需要尽可能的优化这类shader。shader的优化是极其复杂的,这儿这儿的Shader optimization部分都给出了一些优化建议。

  . Overdraw是指相同的像素被多次渲染,如果某些Objects在其他objects之上,则会将起多次渲染造成像素问题。要理解overdraw,则需要了解unity中的渲染顺序设置。每个物体的渲染顺序是由其上的shader决定的,特别是shader中的render queue。Unity极其依赖渲染顺序的设置,详见此处。此外,在物体渲染之前,不同的render queue中物体会进行不同的排序。例如,在Unity中,如果render queue设置为Geometry,则其排序为从前到后渲染。如果render queue设置为Transparent,则其渲染排序为从后到前,从后到前的渲染顺序会造成渲染的极大化。overdraw是一个复杂的问题,没有一个合适的方法来解决这个问题,但是减少unity不能自动排序的重叠的物体的数量是一种好的途径。解决这类问题最好在unity的scene视图下,此处可以设置Draw Mode模式下的场景视图,从而查找如何减少这类物体。通常造成overdraw的原因是透明材质,极费的特效,和多重叠加的UI,所以对于这些的优化都需要测试优化效果。This article on the unity learn site主要讲解UI的优化,但是对于减少overdraw也有一定的建议。

  .游戏中的图像特效会极大的造成像素问题,特别是有多个图像特效。如果游戏受到像素的影响同时又采用了图像特效,则最好对图像特效进行优化,比如用优化后的爆炸特效来替代优化前的爆炸特效。特别是在同一个相机上有多个图像特效,这会造成多个shader pass,这种情况下最好将多个图像特效合并在一个shader pass中。如果这样设置都不能解决问题,则最好考虑是否不使能图像特效,特别是在低端机上。

存储带宽

  存储带宽是指GPU在其特定的内存上的读写速率,如果游戏受到储存带宽的限制,则意味着游戏在操作GPU快速处理大贴图。可以通过以下方法来确定是否是存储带宽的问题:

  . 运行游戏,分析GPU的时间;

  . 在unity 的Quality Settings中减少当前平台和目标对象的贴图质量;

  . 再次运行游戏,检测游戏性能是否有提升,如果有,则意味着可能是内存带宽造成游戏的性能问题。

  如果是游戏的内存带宽造成游戏的性能问题,则需要减少贴图的内存占用来提高游戏的性能。当然不同的游戏解决方法不同,但是有一些通用的方法可以采用:

  . 贴图压缩 贴图压缩可以极大的减少贴图在磁盘和内存中的占用率。如果游戏的内存是我们的限制因素,则压缩贴图可以提高游戏的性能。在贴图的压缩中有不同的格式,每种格式都有特定的设置。所以需要不断的测试和实验来找到适合游戏的格式,这儿有如何在unity中设置贴图的格式的一些介绍。

  . 多级贴图(Mipmaps)是unity中对于较远的objects的一种技术,如果场景中包含较多的较远的objects,我们可以运用Mipmaps技术来解决存储带宽的问题。这儿介绍了如何在场景中查看多级地图的使用效果,这儿对于贴图的mipmaps有更为详尽的介绍。

顶点计算

  顶点计算是指GPU必须对每个网格上的顶点进行的计算操作,顶点计算主要受到两个因素的影响:需要计算的顶点数量,每个顶点需要进行的操作。

  如果GPU的性能问题不是来自内存带宽或者像素分辨率,则有可能就是顶点计算造成,此时减少需要渲染的顶点数量可以提高游戏性能。

  在减少顶点数量和顶点的操作计算上有一些方法可以提供:

    . 首先需要剔除不必要的复杂网格,对于不在视图中的物体,不需要过多的细节网格。对于复杂的包含较多顶点的网格也可以进行简化来避免GPU的浪费。最好的解决办法就是创建面数较低的模型来替代高模。

    . 我们可以采用法线贴图的方法来使得贴图有一种更复杂的几何度,尽管这会造成一定的GPU复杂度,但是这对于游戏的性能的提升有较大的帮助。这儿有一些对法线贴图的介绍。

    .如果游戏中的模型网格没有使用法线贴图,则可以在导入设置的时候剔除切线顶点来减少顶点数量。

    .LOD(level of detail)技术可以用来减少较远网格的复杂度,通过减少需要渲染的顶点数量同时不影响游戏的表现效果。LOD Group对于LOD技术有详尽的介绍。

    . shader中的顶点着色器主要用来处理顶点计算,如果游戏受到顶点计算的限制,则减少顶点计算的复杂度可以提高游戏的性能。

     — 如果我们采用内置的shader,则最好采用最优化的shader来进行游戏的特效设置。参见上文的分辨率设置。

     — 如果游戏采用特制的shader,则最好对其进行优化,参见上文的分辨率设置。

总结

  通过全文,我们学习了unity中的渲染原理,怎么解决和定位渲染的问题,提供了一些解决的办法和途径。通过运用分析工具,我们可以定位造成游戏性能的问题,通过优化可以让游戏更加顺畅的运行。

  后续我会继续翻译一些Unity中的优化方法,比如内存管理机制的问题。

Unity渲染优化中文翻译(三)——GPU的优化策略的更多相关文章

  1. Unity渲染优化中文翻译(二)——CPU的优化策略

    紧接上一篇文章,继续渲染的优化问题,若有错误,请指出,让我也学习进步,谢谢. 如果游戏渲染问题来自CPU 概括的来说,CPU在一帧的渲染中的工作可以分为三个部分: . 决定谁需要被渲染 . 为GPU准 ...

  2. Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd

    前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...

  3. Unity渲染优化中文翻译(一)——定位渲染问题

    最近有一点个人的时间,尝试一下自己翻译一下英文的 Optimizing graphics rendering in Unity Games, 这儿附上英文链接: 个人英文水平有限,unity图像学知识 ...

  4. Babylon.js官方性能优化文档中文翻译

    在这里列出Babylon.js官方性能优化文档的中英文对照,并在CardSimulate项目里对其中的一些优化方法进行实践. How To 如何 Optimize your scene 优化你的场景 ...

  5. NumPy 初学者指南中文第三版·翻译完成

    原文:NumPy: Beginner's Guide - Third Edition 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅 ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...

  7. Spark官方文档 - 中文翻译

    Spark官方文档 - 中文翻译 Spark版本:1.6.0 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 引入Spark(Linki ...

  8. Spark SQL 官方文档-中文翻译

    Spark SQL 官方文档-中文翻译 Spark版本:Spark 1.5.2 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 Data ...

  9. 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

    http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...

随机推荐

  1. XCode 7上传遇到ERROR ITMS-90535 Unexpected CFBundleExecutable Key. 的解决办法

    去第三方的info.plist文件中,比如TencentOpenApi_IOS_Bundle.bundel 的info.plist ,删除 executable file 这一行

  2. linux学习小记:如何查看linux服务器的cpu数量,内核数,和cpu线程数

    查看物理cpu个数 grep 'physical id' /proc/cpuinfo | sort -u | wc -l 查看每个cpu核心数量 grep 'core id' /proc/cpuinf ...

  3. java系列--HTTP协议

    一.HTTP请求信息 请求行 请求头 空行 消息体 1.防盗链: 枚举类型: 二.中文乱码问题 1.Get提交 String username = request.getParameter(" ...

  4. 温故知新 javascript 正则表达式

    很长时间没看 正则表达式了,碰巧今天用到,温故知新了一把 看书学习吧 50% 的举一反三练习中的原创.   一 javascript正则表达式的基本知识 1     javascript 正则对象创建 ...

  5. 云脉推出表格识别API接口可以自助接入

    针对如今市场上对于海量票据信息的录入需求,近期厦门云脉技术有限公司推出票据识别相关的产品与服务,更是在云脉OCR SDK开发者平台上上线表格识别API接口,供广大开发者和集成商自助接入.为了降低财务系 ...

  6. jquery 中prop()的使用方法

    1:设置input的选中属性:$('.passenger').find('.is-need-tel').prop('checked',true); 2:获取input是否选中: $('.passeng ...

  7. MySQL的"旁门左道"用法总结

    不断更新. 一.显示当前MySQL服务的版本:1是直接在查询窗口select version();2是show variables like 'version';

  8. 5分钟了解MySQL5.7的Online DDL雷区

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://suifu.blog.51cto.com/9167728/1855872 Part ...

  9. 浅谈tomcat的配置及数据库连接池的配置

    1.如何修改tomcat的端口 在某些情况下,可能需要修改tomcat监听的端口8080,比如: a.需要启动两份tomcat服务器 b.某个服务占用了8080端口(1433,1521,3306... ...

  10. Windows API 函数浏览

    AbortDoc                                          终止一项打印作业                        是         是        ...