Unity脚本静态分析
在今年上海的Unite大会上,Unity大中华区技术总监张黎明为大家介绍了一个通过静态分析Unity脚本来优化游戏性能的工具Unity Engine Analyzer,本文将为大家分享大会上的演讲内容。
概述
为了让大家对静态代码分析有个清晰的认识,下面先为大家介绍一下静态代码分析现状及意义。
什么是静态代码分析
静态代码分析是指使用一个工具,不需运行目标代码就可以对它进行分析(通过执行目标代码进行分析的方式被称为动态代码分析)。
比如在C语言时代已经存在一个静态代码分析工具Lint。与大多数C语言编译器相比,Lint可以对程序进行更加广泛的错误分析,是一种更加严密的编译工具。最初,Lint这个工具用来扫描C源文件并对源程序中不可移植的代码提出警告。但是现在大多数Lint实用程序已经变得更加严密,它不但可以检查出可移植性问题,而且可以检查出那些虽然可移植并且完全合乎语法但却很可能是错误的特性。
为什么需要静态代码分析
静态代码分析不仅可以节省大量编译代码的时间,同样也节省了编译、构建、运行、测试这些复杂的操作。由于它全自动运行,可以避免人工检查导致的遗漏。另外,大家还可以考虑把它集成到CI系统(持续集成系统)内,在自动化的工作流中完成这个工作。
已有的代码分析器
微软的Visual Studio中已经集成了一个静态代码分析器Squiggles. 它可以在编译代码前检查一些潜在的语法错误。
另外有一个面向C#语言的辅助工具Reshaper,它也提供了静态代码分析的功能。
Roslyn
Roslyn 是微软公司开源的.NET编译器,它支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API。它提供了一些工具,包括语义分析、查找特定代码样式等等。Roslyn提供了一个可扩展的静态代码分析框架,本文介绍的Unity脚本静态分析器就是基于Roslyn的功能来开发的。
Unity Engine Analyzer
Unity Engine Analyzer是由两个Unity开发者基于Roslyn开发的面向Unity脚本的静态分析工具,而且它是一个开源工程。这个工具可以内建为Visual Studio的插件,在编写代码的过程中自动检测潜在的代码问题,比如可能降低游戏性能的代码。它可以支持通过命令行执行,以及通过网页的形式输出分析报告,这样可以很方便的集成到CI系统内。大家可以点击【阅读原文】下载Unity Engine Analyzer的开源工程。
下面将详细为大家介绍优化游戏性能的工具Unity Engine Analyzer。
优化工具Unity Engine Analyzer
Unity Engine Analyzer是一个通过静态分析Unity脚本来优化游戏性能的工具。下面将从现有分析项,使用方法和扩展功能等方面给大家详细讲解。
现有的分析项
目前Unity Engine Analyzer提供的分析内容还不多,基本上都是用来分析可能导致性能问题的代码,比如下面的这个例子:
Type.GetType(“string”)是不推荐大家使用的方法,因为这个方法可能导致GC.alloc,进而导致GC.collect而产生卡顿。大家可以点击【阅读原文】参考这篇文章。
相对而言我们会推荐使用获取类型的另外两种方式,typeof(MyClass)和GetType()。另外,因为SendMessage会导致代码不好维护,Coroutine和OnGUI会导致GC.alloc,这里也建议尽量少使用。
使用方法
目前在Visual Studio的NuGet管理器中已经可以直接找到Unity Engine Analyzer的安装包。通过菜单Tools -> NuGet Package Manager -> Manage NuGet Packages for solution打开NuGet窗口,搜索unityengineanalyzer找到这个工具。
在右边的窗口内选择当前的项目名称,然后点击Install进行安装,如下图所示:
这样就安装完成了。大家应该可以在Visual Studio中看到已经可以自动检测到存在潜在问题的代码,如下图:
另外在Visual Studio的日志窗口内也会输出检测到的问题项:
全部输出内容还会生成一个网页文件,方便从外部查看。
扩展Analyzer
正如前面所述,目前的分析项仍然非常有限,我们可能会遇到希望扩展静态分析器的情况,其实这个工作也并不复杂。
首先确保安装以下工具:
Visual Studio 2015
Visual Studio 2015 SDK
File | New | Project -> C# -> Extensibility
->"Install the Visual Studio Extensibility
Tools"
.NET Compiler Platform ("Roslyn") SDK
aka.ms/roslynsdktemplates
然后打开Github下载的Unity Engine Analyzer的VS工程,并创建一个类继承自DiagnosticAnalyzer。这个类中有三个方法需要大家去重载实现。首先是Initialize,用来注册和分析语法的回调函数,也就是AnalyzeClassSyntax函数。第二个函数AnalyzeClassSyntax,用来在所有代码中查找符合条件的语句,如果找到的话会展示一个Diagnostic信息框。如下图所示:
最后一个函数是用来编写提示信息全部内容的。
到这里新的分析项就应该可以正常开始工作了。非常感谢Unity的开发者社区为大家带来了这么强大的一个工具,也希望未来有更多的开发者可以参与到这些工具的开发工作中来。
结语
今天就为大家分享到这里。在今后的游戏开发中,需要通过静态分析Unity脚本来优化游戏性能时,推荐大家使用工具Unity Engine Analyzer,可以助大家一臂之力。后面我们还会为大家分享更多游戏开发中实用的工具在Unity官方中文社区(unitychina.cn),请保持关注。
推荐阅读
近期Unity官方活动
9月19日,Unity与Qualcomm联合举办技术开放日将在上海正式开启!
9月,Unity面向莘莘学子特别推出Unity Plus加强版开学季专属特惠,及Asset Store资源商店5折促销。
点击“阅读原文”进入Unity官方中文社区!