zoukankan      html  css  js  c++  java
  • 【Unity优化】提高代码性能

    CPU每帧需要处理数百万条指令,如果没有按时处理完,就会导致游戏卡顿。

    打包过程

    Untiy将代码编译为 CIL(Common Intermediate Language)

    ① AOT:CIL在打包时编译为机器码

    ② JIT:CIL在运行前编译为机器码

    源码与机器码的关系

    没有被编译的代码称为源码,决定了编译后机器码的结构和内容。

    ① 一些CPU指令要比其他的消耗更多时间;

    ② 一些在源码中看起来简单的处理,在编译后会变得非常复杂;

    运行时引擎代码、用户代码的沟通

    1)大多数引擎代码用C++编写,并且已经被编译为机器码。

    2)用户代码被称为托管代码,被编译为机器码后,在托管运行时(managed runtime)上运行。MR负责自动内存管理、安全检查等。

    3)当CPU在引擎代码和托管代码之间沟通时,就需要进行安全检查。当需要从托管代码传递数据到引擎代码时,需要进行格式转换,这一过程叫编组(marshalling)。

    低性能代码

    1)代码架构浪费性能

    2)不必要的昂贵调用

    3)不必要的方法调用

    4)代码自身耗时长

    提高代码性能

    1)尽可能减少Update中的操作

    2)仅当有变化时调用方法

    3)Update中每隔几帧再做处理

    4)缓冲对象,而不是每次创建

    5)使用合适的数据结构

    6)降低GC的影响

    7)使用对象池

    8)代码LOD,不重要的时候使用简单处理

    避免调用昂贵的 Unity API

    原则:每个API都有适用场合,只是有些不适合频繁调用。

    1)SendMessage()、BroadcastMessage():用到了反射

    2)Find():遍历所有对象和组件

    3)更改 Transform 的 position 或 rotation 会向所有子对象发送 OnTransformChanged 事件。因此尽量少调用

    4)使用 Transform.localPosition 替代 Transform.position:后者由前者计算转换得到

    5)使用 Vector.sqrMagnitude 替代 Vector.magnitude;使用 int 和 float 计算替代 Vector

    6)避免频繁使用 Camera.main

  • 相关阅读:
    使用 Spring data redis 结合 Spring cache 缓存数据配置
    Spring Web Flow 笔记
    Linux 定时实行一次任务命令
    css js 优化工具
    arch Failed to load module "intel"
    go 冒泡排序
    go (break goto continue)
    VirtualBox,Kernel driver not installed (rc=-1908)
    go运算符
    go iota
  • 原文地址:https://www.cnblogs.com/hearthstone/p/13357918.html
Copyright © 2011-2022 走看看