使用英特尔GPA优化《剑网三》游戏的性能
郭胜(英特尔开发者关系部) 杨林(金山软件西山居游戏工作室)
介绍
游戏在集成显卡上的性能日益成为游戏开发者关注的一个重要问题。这主要是由于两方面的原因:一是集成显卡的功能日益增强,具有越来越强的3D图形处理能力,支持的3D游戏也越来越多【3】。其次随着个人移动平台(如笔记本电脑,上网本等)日益普及,低功耗、高性价比的集成显卡作为这些平台上的主要图形解决方案,将持续占据更重要的市场地位。Mercury Research 的报告显示,在 2008 年,集成显卡芯片组的销量有史以来首次超过独立显卡;到 2013 年,集成显卡和独立显卡的销量有望达到 3:1。因此,针对集成显卡优化游戏的性能,有利于提升游戏的用户普及度,吸引更多潜在玩家。
英特尔的图形性能分析器(GPA)可帮助游戏开发人员分析、评估和改进运行于英特尔集成显卡上的游戏性能【1】。GPA是一套基于 DirectX 的功能强大的工具套件,由系统分析器和帧分析器两项主要工具组成。它能收集系统平台和图形帧的性能数据,让您了解系统和单个帧的负载分布,并支持执行“假设性”实验,评估优化所能带来的潜在性能提升。
本文介绍了一个使用GPA在英特尔4系列集成显卡上分析和优化《剑侠情缘三》【2】网络游戏性能的案例。《剑侠情缘三》(简称《剑网3》)是金山公司历时5年自主研发的大型全3D网络游戏,也是国内知名游戏品牌“剑侠情缘”系列最新一部作品。依托获得国家863计划支持的、自主研发的游戏引擎,《剑网3》的即时演算效果已达到近似电影画面水准;人物细腻的细节展示、花海林间的光影表现等,都已达到国内网游顶级水准。
作为英特尔软件伙伴项目(Intel® Software Partner Program)的成员,金山公司在该游戏开发过程中获得了英特尔大量的技术支持,为了使更多玩家能体验这款游戏,金山与英特尔在集成显卡的优化上进行合作。GPA在发现此游戏的性能瓶颈上发挥了重要的作用。优化的结果使原有的性能在英特尔4系列集成显卡上提升了近一倍,达到可玩的帧速率,使更多玩家能体验这款精彩的大型3D网络游戏。
性能分析准备
使用GPA测试游戏的性能前,需要设置两台PC。一台作为分析机,安装和运行GPA图形界面的分析工具;另一台PC作为目标机,配置英特尔4系列集成显卡,安装和运行游戏以及GPA服务端程序。两台机器通过TCP/IP网络互联。
为了便于测试,金山公司专门开发了游戏的显卡测试版本。此版本包含该游戏中大量典型的图形渲染特性。虽然《剑侠情缘三》是一款网络游戏,但此测试版本能自动运行在单机上,大大方便了性能分析。
环境部署好之后,要选择合适的游戏配置和一个性能上典型的游戏场景作为测试基准。在集成显卡上,我们使用缺省的最基本的游戏配置,分辨率定为800x600。运行游戏测试版本,我们找到一个在性能和场景复杂度上有代表性的场景,如图1所示。注意,Fraps工具在画面右上角显示此游戏的初始帧速率为11.
图1:《剑侠情缘三》显卡性能测试版场景(此图经金山软件授权使用)
测试环境和典型场景准备好以后,接下来将使用GPA的系统分析器和帧分析器对该游戏进行性能分析。
系统性能分析
GPA的系统分析器提供了一组状态覆盖模式,以及关于CPU、GPU和DX运行时的多组性能计数器。使用系统分析器能够从平台系统的角度分析图形渲染管线的瓶颈是否在上述一个或多个域中,并且帮我们判断是否必要使用帧分析器进行进一步分析(如果GPU中存在瓶颈的话)。
首先分析游戏的负载分布。GPA提供了几个状态覆盖模式可以用于评估游戏在图形渲染管线上主要阶段的负载。这几个状态覆盖模式是:
1. “Null Hardware”。此状态覆盖模式能把显卡上的负载去掉,也相当于把显卡的性能提升到无穷大。可以用于评估显卡负载对帧速率的影响程度。
2. “Null Driver”。此模式把显卡驱动以及其后显卡硬件上的负载都去掉,可以用于评估游戏应用层代码的负载对帧速率的影响程度。此模式的帧速率同时反映了不修改代码的情况下,游戏在任何显卡上(保持CPU和内存相同)的性能上限。
3. “1X1 Scissor Rect”。在IIG实现中,此模式几乎可以去除显卡Rasterization阶段后的所有负载。使用此模式可以评估象素相关的负载(包括纹理访问)对帧速率的影响程度。
下表是上述覆盖模式和正常模式下系统分析器显示的游戏帧速率和相应的帧时间:
覆盖模式 |
帧速率(fps) |
帧时间(ms) |
正常模式 |
11 |
91 |
1X1 Scissor Rect |
19 |
53 |
Null Hardware |
21 |
48 |
Null Driver |
52 |
19 |
- 熔断器 Hystrix 源码解析 —— 命令执行(一)之正常执行逻辑
- 智能主题检测与无监督机器学习:识别颜色教程
- 如何下载安装Weka机器学习工作平台
- Dubbo 源码解析 —— LoadBalance
- 如何处理机器学习中类的不平衡问题
- 【死磕Java并发】—– Java内存模型之重排序
- Mask R-CNN源代码终于来了,还有它背后的物体检测平台
- 37个TOP实例命令,超过一半你肯定都没见过
- 利用TensorFlow生成图像标题
- 保存并加载您的Keras深度学习模型
- 简单、通用的JQuery Tab实现
- Dubbo源码解析 - 远程暴露
- 使用FastText(Facebook的NLP库)进行文本分类和word representatio...
- 声音分类的迁移学习
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法