供游戏性程序员的使用的性能最优化方法

  • 概述
  • 广泛性能调查
  • 游戏和渲染性能
    • 游戏线程分析
    • 渲染线程分析
  • 常见性能问题

概述

为追踪虚幻3游戏的内容或特定的游戏表现,有一系列有帮助的工具. 一个被用于 Infinity Blade Dungeons 的开发的方法描述于此。

广泛性能调查

首先要跑一遍游戏然后确定哪些是拖慢速度的。 最快的办法是把 STAT UNIT 设置为开启的状态来看看游戏,渲染或GPU是否速度慢。 如有可能应在 测试 版本上运行。 GPU时间可能无法看,但如大于另两项时间可假设等同于总体框架时间。如有质检团队的报告并分配给相关部门则更好。 一需包括在报告内的有用信息包括:

  • Average FPS(平均FPS) - 原始平均fps,有时不包括动画或非互动环节。 这里的原始数字并不特别重要,只要运行数值高于vsync(一般为30),但可用来察看趋势。
  • % over 30(超过30FPS的百分比) - 超过30fps的时间。 应尽可能高,一般要达到95%或更高。
  • Total Hitches(总顿卡数) -花费时间超过100ms的帧数。这个值要尽可能低。
  • % Bound by Game and Render(游戏和渲染绑定百分比) - 哪些慢帧是由游戏或渲染线程造成的。 如果这些值非0,您应该查看一下是如何造成的。 GPU绑定使用的百分比一般看不到,但如果其他两个绑定的百分比数字较低,即使高于30%也属于低的范围,GPU处理用时过长是很可能的原因。

游戏和渲染性能

有两个工具可用来追溯游戏和渲染缓慢的原因: Gameplay Profiler 和 Stats Viewer .The Gameplay Profiler(游戏性分析器) 是用来分析游戏线程的最佳工具,Stats Viewer(统计数据查看器)则是用来分析渲染线程的工具。 为获得最准确结果,两个工具都应在游戏的 发布版本 上运行。 为收集需要分析的运行数据,您可以按照UDN的页面上对每个工具操作的步骤来进行,或者由质检团队来按照上述进行设置来运行分析。 他们一般会注意到以毫秒为单位的用时最长的帧。注意帧时再由这些工具计算时并夸大了大约25%,所以不要担心35ms的帧,它们实际上在测试/发行时是30fps. 他们会为Gameplay Profiler(游戏性分析器)创建一个 .gprof 文件的目录并为Stat Viewer(统计数据查看器)创建 .ustats 文件。 您可以随后使用合适的工具来打开它们(一般双击即可,可能需要关联文件)

游戏线程分析

如果您开着 .gprof 文件,您可以开始使用 Gameplay Profiler 查看相关问题。 一种方法是在上方图表中深入挖掘缓慢的帧。 点击一个慢帧,并察看 Frame Actor / Class Call Graph 标签及 Frame Function * 标签。 红色文本是统计信息,绿色文本是脚本调用和更新时间。

使用这些标签,您应该能确认某个特定函数调用是否缓慢,或某个actor或actor们的类是否更新迟缓。 如果看上去actor更新或脚本函数不慢,那么使用标签 Frame Function Summary 来看一下哪个统计调用占用了所有的时间,并看一下帧函数调用图表来确定哪个统计一直运行在层中。 当您能确认那个造成缓慢的统计后,您可以搜索源看一下所用到的字符串,然后找到该统计及使用该统计的代码。 这可能会给您一个提示,或者您也可以向引擎团队寻求帮助。

另一个优化的办法是尝试整体缓慢的函数和对此函数进行整体最优化。 要达到这个目的,查看 Aggr function summary 和 Aggr function call graph 就很好。

您可以选择单独的统计或函数并且它会在上面的图表中以红色标记该区域的哪些帧是慢速的。 一般来说在此处可使用 Exclusive time 来排序,或者使用 World Tick Time 来看最大值,因为这个值包含了所有其他的更新。 当您看到自己感兴趣的区域时,您可以点击停顿该区域的某一帧并尝试深入查看是哪个统计或函数造成了该特定帧的慢速。

渲染线程分析

Stats Viewer 可以让您看到渲染线程,最小的更新和脚本时间的相似信息。 当您打开 .ustat ,您会在右侧看到图表,左侧看到一系列过滤器。 如果您怀疑某个统计,您可以选择它查看该统计图表,但如果查看单独帧将会容易一些。 右键点击右侧的帧并选择 Open call graph 。 这可以查看单独的帧并让您查看变慢的元素,标记为红色。 当您看到一处后,您可以把它添加到总体图表中来看一下该统计造成游戏变慢的频率有多少。

常见性能问题

这些通用工具可用来追溯问题,能知道过去有哪些东西拖慢将会对您很有帮助。 下面是一份列表,列举了去年里遇到的问题,您的操作可能有所变化:

  • Platform specific issues(平台特定问题) - 这些往往表明游戏或渲染的大量统计时间没有任何更多可用的细节。 这包含了着色器编译,声音问题,内存延迟等。一旦您确认了哪个统计确认了迟缓时间,您可以使用平台特定的本地分析器或与引擎团队讨论来获得额外的帮助。
  • Script call overhead(脚本调用内存消耗) - 这条在游戏分析器中会很快出现,也很容易通过调整游戏逻辑或移动特定慢速函数到本地来解决。
  • GC Time - GC Mark 和 GC Sweep 经常在游戏分析器/统计数据查看器中呈现为大的周期性的延迟. 如果在release(发行)模式下运行而没有 -NoVerifyGC则该延迟会变得大得多,所以先要看那个值。 这些是不可能完全消除的,但是最优化GCable对象数量是主要目标。把更多的东西移入启动包并减少对象计数是很好的目标。
  • Pathfinding and line checks(寻路和线性检测) - 寻路调用和线性检测经常在游戏线程中表现缓慢。 最优化此处的最容易的办法是少做一些。在游戏代码中要注意多余的寻路调用或线性检测。
  • DLE Tick time(动态光照更新时间) - 在一些场景中动态光照效果的更新时间往往很高。确认只给实际需要的对象做动态光照环境,并对不需要动态光照的任何为actor放置的动态光照环境复位 bDynamic 。 在手机平台上,您可能需要进一步的优化,比如对您想要做lightmass效果而不想要动态对象的灯取消动态合成标记。
  • Particle Time(粒子时间) -单独的粒子系统更新的性能消耗往往很大。您可以从游戏分析器中找出粒子系统并让美工对此最优化。或者,您可能需要改变游戏逻辑来减少它们的产生,比如如果一次攻击杀死10个敌人,您只需要在一帧内死亡的前2个敌人上做死亡粒子。 Update Bounds time 表明粒子系统需要固定的边界,而动态光照环境更新时间表明它可能正在做不必要的光照更新。这是和内容及游戏非常有关的。看一下 ParticleTickStats 获得更多细节。另外,太多的粒子可能会显示为渲染线程的 Particle update time ,而这可以通过LOD(层次细节度)或剔除来削减可见粒子的数量。
  • Death and explosions(死亡和爆炸) - 死亡和爆炸的缓慢是由于不同的原因造成,一般是需要做组件更新,粒子生成和一些逻辑或AI更新。您可能需要把一些元素延迟到下一帧,或如果很多东西一起死亡则您需要把它们一起移除。
  • Component Update time(组件更新时间) - 特定组件更新时间可能很长,比如骨骼网格。您需要看一下这种类型的组件,也许能把他们移到更为简单的组件类型(比如,100带顶点动画的静态网格比100 骨骼网格消耗的资源更少)
  • Interp actor update time(Interp actor更新时间) -Interp actor更新起来可能在动态光照环境时间和运动时间上非常消耗资源。一个共同的修复方式是让关卡设计师在非游戏对象上标记"不要侵占" ,因为那会使停止慢速碰撞检测。
  • Transparency Drawing(绘画的透明度) - 透明的物体经常在渲染线程中变得很慢,尤其是粒子。让美工确认没有叠加很多透明对象,并用LOD大量清除透明对象。
  • Too Much Stuff(加入过多物体) -一般来说,美工和关卡设计喜欢在游戏里放很多东西。一般放置很多敌人(>10)或放置大量的网格物将使整体拖慢,并需要内容方面的最优化。

UE3 供游戏性程序员的使用的性能最优化方法相关推荐

  1. 成为游戏开发程序员,要学些什么

    一.游戏程序开发的工作主要包括哪些方面 游戏开发中的程序开发主要由如下几个方面组成:  1.图形引擎  2.声音引擎  3.物理引擎  4.游戏引擎  5.人工智能或游戏逻辑  6.游戏GUI界面(菜 ...

  2. 如何成为一名游戏开发程序员

    一.游戏程序开发的工作主要包括哪些方面 游戏开发中的程序开发主要由如下几个方面组成: 1.图形引擎 2.声音引擎 3.物理引擎 4.游戏引擎 5.人工智能或游戏逻辑 6.游戏GUI界面(菜单) 7.游 ...

  3. 游戏引擎程序员养成计划

    说的很好,和我走的道路有点不谋而合,文章中提到的书本我基本都知道,很多都看过或者浏览过,英雄所见略同?O(∩_∩)O~ 游戏引擎程序员养成计划 三维图形学:  搞三维图形学首先还是要扎扎实实的先看解析 ...

  4. 不会玩游戏的程序员不是好作家,《深入理解Java虚拟机》周志明来了!

    嘉宾:周志明.杨福川 采访.撰文:Satoh_AI 这次采访起源来自于我和豆瓣的一位读者有同样的好奇心,为什么网上搜不到周志明老师的更多信息?为什么"80后玩家"可以把本本书都维持 ...

  5. 这款养蛙游戏火爆了朋友圈,游戏开发程序员已赚翻!

    最近我的朋友圈发生了变化 不晒猫.不晒狗.不晒老公 他们都在晒蛙?! "我家蛙蛙出去浪到现在都还没有回来,明信片也没寄--" "呀,我不小心把我家蛙的明信片删了怎么办怎么 ...

  6. 百万英雄类答题游戏的程序员打开方式

    最近知识答题类的app应用和网站  都很火  所以机器人多了,,百度度秘.搜狗小汪等 Python发挥了很大作用 <百万英雄><冲顶大会><头脑王者><一站到 ...

  7. 面向程序员的数据库访问性能优化法则

    面向程序员的数据库访问性能优化法则 特别说明: 1.   本文只是面对数据库应用开发的程序员,不适合专业 DBA , DBA 在数据库性能优化方面需要了解更多的知识: 2.   本文许多示例及概念是基 ...

  8. Unity游戏开发程序员学习线路图及技能提升指南

    开发上线一款游戏,通常要经历以下几个阶段. 筹备阶段:也就是前期筹建团队,确定项目的基本方向.与此同时,投资人.制作人.核心团队.项目经理需要进行深入会谈. 原型阶段:这个阶段需要实现游戏原型,发布A ...

  9. bat代码小游戏_程序员入职被27岁领导告诫:我被BAT录用过,是算法方面泰斗大哥...

    现如今,如果你想要被对方尊重,想要获得更好的职位,除了有扎实的技能之外,还要学会包装,如果包装的好,还是能够起到很好的效果. 最近在职场论坛上看到这样一个帖子:程序员刚入职就被27岁的领导告诫,我被B ...

最新文章

  1. 单片机异常复位后如何保存变量数据
  2. 高防服务器如何进行防御措施
  3. 【深度学习入门到精通系列】卷积和池化计算详解
  4. 零基础学python 明日科技-明日科技 - 课程
  5. 《Asp.Net 2.0 揭秘》读书笔记(五)
  6. VTK:PolyData之Casting
  7. ASP.NET Core【在线教育系统】功能要求
  8. React.Component(V16.8.6)
  9. jquery 使用方法
  10. Spring Boot配置MinIO(实现文件上传、下载、删除)
  11. 国庆档首日票房破2亿 长津湖票房占比过半
  12. frameset常用属性
  13. spring4.0.0的配置和使用
  14. 【中间件技术】第二部分 CORBA规范与中间件(3) 基于CORBA的开发过程
  15. 怎样了解存在---辩证唯物主义认识论
  16. linux 系统qcow2镜像制作
  17. ECCV22 最新54篇论文分方向整理|包含Transformer、图像处理、人脸等(附下载)...
  18. mysql 分离 实时读_MySQL深入利用Ameoba实现读写分离
  19. oracle数据库 参考文献,数据库参考文献格式
  20. MOOC机器学习(浙大课程)第一章

热门文章

  1. java 线程的销毁_Java如何检查线程组是否已被销毁?
  2. python生成任意n阶的三对角矩阵
  3. python3程序运行中会跳过注释行,Python: 读取文件时如何忽略#条注释行
  4. while(0)循环还执行吗_for循环
  5. java会被rust替代吗_Rust 未来会成为主流的编程语言吗?
  6. 计算机专业毕业后现状,计算机专业怎么样_毕业生道出现状_“千万”别学
  7. 零基础学python数据分析_Python学习指南:使用Python学习数据分析
  8. eclipse查看git地址_在 IntelliJ IDEA 中使用 Git,太方便了
  9. php协程 多线程,【swoole.2.01】多进程,多线程和协程
  10. ROS学习笔记01:安装ROS - 玩小海龟