• Unity 性能优化:界面优化

    | /

    拆分画布

    画布组件的主要任务是管理在层级窗口中绘制 UI 元素的网格,并发出渲染这些元素所需的 Draw Call。另一个重要的作用是将网格合并进行批处理以降低 Draw Call 数。

    当画布或其子对象发生变动时,画布需要为所有的 UI 对象重新生成网格,然后重新发送 Draw Call,这被称为画布污染(更改 UI 元素的颜色不会污染画布)。

    UI 元素的改变导致 CPU 使用率大幅上升,通常是由于在单个画布中构建了过多的 UI 元素,这将导致 UI 元素更改时画布需要重新生成的网格过多。

    这种情况一般都可以使用更多的画布来解决,将 UI 拆分为多个画布,将工作的负载分开,简化单个画布所需的任务。

    动静结合

    在拆分 UI 时,可以按照静态、偶尔动态、连续动态三个标准分离 UI 元素。

    • 静态:永远也不会改变的 UI 元素,例如背景图片。
    • 偶尔动态:只在做出响应时更改,例如 UI 按钮。
    • 连续动态:元素会定期更新,例如滚动的轮播图。

    移除 Raycast Target

    UI 元素具有 Raycast Target 选项,允许元素通过单击、触摸和其他用户的行为进行交互。当用户行为事件发生时,GraphicsRaycast 组件将执行像素到边界框检查以确定与之交互的是哪个元素。禁用不需要交互的元素的 Raycast Target 选项,就可以减少 GraphicsRaycast 所需要检查的数量,从而提高性能。

  • Unity 性能优化:脚本优化

    | /

    使用最快的GetComponent方法

    在Unity目前的版本中有三种获取组件的方法,分别是 GetComponent<T>GetComponent(typeof(T))GetComponent(string)。第一个方法比第二个方法快一点,第三个方法显著慢于其他两个方法。

    移除空的回调定义

    Monobehaviour 组件在场景中第一次实例化时,引擎会将任何定义好的回调添加到一个函数指针列表中,并在需要的时刻调用这个列表。但这里需要注意的是,即使回调是空的,Unity也会将该回调添加到列表中,这将会在代码被调用时产生一定的额外开销,将浪费少量的CPU资源。

    可以使用以下正则表达式来搜索出代码中空的回调。

    # 这里使用 Update 方法举例
    void\s*Update\s*?\(\s*?\)\s*?\n*?\(\n*?\s*?\)

    优化组件引用

    如果可以,尽量避免反复去获取相同的组件引用。

    例如以下方法,每次执行时都要重新获得五个组件的引用,这对于CPU而言不是很友好。如果这个方法是在 Update 里调用的,对于性能的影响还要更加严重。

    更好的方法是在Awake中获取这些组件的引用并保存在类中,TakeDamage方法直接调用这些引用。

    void TakeDamage()
    {
    var rb = GetComponent<RigidBody>();
    var collider = GetComponent<Collider>();
    var ai = GetComponent<AIController>();
    var anim = GetComponent<Animator>();

    if (GetComponent<Health>().health < 0)
    {
    rb.enabled = false;
    collider.enabled = false;
    ai.enabled = false;
    anim.SetTrigger("death");
    }
    }

    共享,而不是每个组件都单独获取数据

    让多个对象共享某些计算的结果可以节省性能开销。例如读入的 Json 数据,或者是为一组 AI 计算行动路径。

  • Nova 源码解析

    | /
    path files code comment blank total
    . 312 49,225 2,859 8,490 60,574
    CGInc 2 367 5 69 441
    Editor 21 6,536 572 1,114 8,222
    Lua 25 2,209 121 291 2,621
    Settings 2 246 0 0 246
    Sources 257 39,584 2,155 6,967 48,706
    Sources\Core 82 8,917 887 1,706 11,510
    Sources\Core\Animation 21 1,248 65 229 1,542
    Sources\Core\Collections 3 268 10 55 333
    Sources\Core\Input 7 731 24 119 874
    Sources\Core\Restoration 18 1,755 144 330 2,229
    Sources\Core\ScriptParsing 12 2,050 327 387 2,764
    Sources\Core\VFX 5 415 27 85 527
    Sources\Exceptions 3 30 3 6 39
    Sources\Generate 1 769 1 6 776
    Sources\Scripts 111 9,200 253 1,814 11,267
    Sources\Scripts\Controllers 10 1,476 54 306 1,836
    Sources\Scripts\Graphics 3 236 16 48 300
    Sources\Scripts\SpriteCropping 3 35 1 8 44
    Sources\Scripts\UI 68 6,039 159 1,173 7,371
    Sources\ThirdParty 60 20,668 1,011 3,435 25,114

    剧本解析器

    Sources\CoreScriptParsing:2000 line

    Parser

    Parser首先会创建一个Tokenizer对象负责解析剧本文件的标识符,再根据标识符将剧本文件分为若干块,如提前代码块(EagerCodeBlock)、代码块(CodeBlock)、文本块(TextBlock)、分隔块(SeparatorBlock)。

    解析好的块被称为ParsedScript,在游戏运行时被交给 ScriptLoader 进行执行。

  • 如何在vscode中为c#编写单元测试

    | /

    如何从零开始创建一个单元测试工程

    创建测试单元工程

    创建测试文件的方法和新建项目类似,都是使用dotnet new命令。

    dotnet new xunit

    为测试单元工程添加需要测试的工程的项目引用

    dotnet add reference ..\program\program.csproj

    为sln文件添加测试单元工程的项目引用

    dotnet sln add ..\program.test\program.test.csproj

    文件的目录结构应大致如下树状图所示。

    project/
    ├─program/
    │ ├─src/
    │ └─program.csproj
    ├─program.test/
    │ ├─src/
    │ └─program.test.csproj
    └─program.sln

    运行测试单元

    dotnet test

    单元测试中如何输出日志

    Q:xUnit为什么没有办法直接打印输出?

    A:xUnit的测试会新开一个进程进行测试,因此运行dotnet test命令的进程没有办法捕获xUnit进程的输出。

    解决方案:在测试代码中添加ITestOutputHelper接口,并在构造函数中将其初始化,之后使用该接口的WriteLine方法输出文本。

  • 如何编译Godot(Godot & Godot with C#)

    | /

    要在Windows下编译Godot, 需要以下环境:

    • Visual Studio Community:使用最新版本。

    • MinGW-w64:可以替代 Visual Studio。请务必将其安装/配置为使用 posix 线程模型。使用 MinGW 编译主分支时,需要 GCC 9 或更高版本。

    • Python 3.6+:确保在安装程序中启用将 Python 添加到环境变量中。

    • SCons 3.0+:构建系统。建议使用最新版本,特别是为了正确支持最近发布的 Visual Studio。

  • Book & Video & Game Record List

    | /
    Name Type Date
    Evangelion: Air/真心为你 Video 2024/04/13
    Evangelion: 破 Video 2024/04/13
    Evangelion: Q Video 2024/04/15
    Evangelion: 终 Video 2024/04/19
    流浪地球制作手记 Book 2024/05/01
    全部成为F Video 2024/06/01
    贝果爱情故事 Game 2024/08/04
    搞定I:无压力工作的艺术 Book 2024/07/06
    旧制度与大革命 Book 2024/07/10
    世界秩序 Book 2024/07/12
    1973年的弹子球 Book 2024/07/13
    Book 2024/07/15
    Unity人工智能游戏开发 Book 2024/08/08
    Unity3D人工智能编程精粹 Book 2024/08/08
    怎样做成大事 Book 2024/08/12
    检查力:打破信息茧房 Book 2024/08/14
    Unity API 解析 Book 2024/08/16
    魔法使之夜 Game 2024/08/18
    游戏架构: 核心技术与面试精粹 Book 2024/08/18
    Effective CSharp Book 2024/08/19
    CSharp 7.0 核心技术指南 Book 2024/08/23
    烧掉数学书: 重新发明数学 Book 2024/08/24
    微积分的力量 Book 2024/08/24
    纯爱独白: 小小 Game 2024/08/26
    计算机:一部历史 Book 2024/08/27
    葬花:暗黑桃花源 Game 2024/08/31
    Unity 游戏优化 Book 2024/09/01