《unity游戏优化》第8章内存优化

简介: 《unity游戏优化》第8章内存优化

内存管理性能增强

遇到性能问题可以将低效代码转移到更快的本地代码中

垃圾回收策略

触发回收的好时机是加载场景时,当游戏暂停时,再打开菜单界面后的瞬间

unity垃圾回收是使用标记清除来做的

拆箱和装箱

装箱:将值类型转换为引用类型称为装箱

拆箱:将引用类型转换为值类型称为拆箱

class Program
{
    static void Main(string[] args)
    {
        int i = 128;
        object obj = i;
        obj = 512f;
        i = (int)obj;
    }
    //尝试将obj拆箱到一个不是最新赋值的类型时,将引发
    //Unhandled exception. System.InvalidCastException: Unable to cast object of type 'System.Single' to type 'System.Int32'.
}

1.struct是指类型,class是引用类型

public class DamageResult {
 public Character attacker;
 public Character defender;
 public int totalDamageDealt;
 public DamageType damageType;
 public int damageBlocked;
 // etc.
}
public void DealDamage(Character _target) {
 DamageResult result = CombatSystem.Instance.CalculateDamage(this,
_target);
 CreateFloatingDamageText(result);
}
public struct DamageResult {
 // ...
}
//当使用目的是在向程序某处发送数据库,且数据的持续时间不需要超过
//当前作用域,那么可以使用struct来替代

2.数组的区别

TestStruct[] dataObj = new TestStruct[1000];
for(int i = 0; i < 1000; ++i) {
 dataObj[i].data = i;
 DoSomething(dataObj[i]);
}
However, the following, functionally equivalent, code would not result in any heap
allocations since the struct objects being used are value types, and hence, it would be
created on the stack:
for(int i = 0; i < 1000; ++i) {
 TestStruct dataObj = new TestStruct();
 dataObj.data = i;
 DoSomething(dataObj);
}
void TestFunction() {
    string testString = "Hello";
    DoSomething(testString);
    Console.WriteLine(testString);
    //Debug.Log(testString);
}
void DoSomething(string localString) {
    localString = "World!";
}
TestFunction();
这个代码还是打印hello

1.通过值传递值类型,只能修改其数据的副本值

2.通过引用传递值类型,可以修改传入的原始数据

3.通过值传递引用类型,就可以修改原始引用的对象

4.通过引用传递引用类型,可以修改原始的引用的对象数据集

3.数据布局的重要

public struct MyStruct {
 int myInt;
 float myFloat;
 bool myBool;
 string myString;
}
MyStruct[] arrayOfStructs = new MyStruct[1000];
对比
int[] myInts = new int[1000];
float[] myFloats = new float[1000];
bool[] myBools = new bool[1000];
string[] myStrings = new string[1000];

4.对字典键使用obj.GetInstanceID();


5.unity api中的数组开销


int[] myInts = new int[1000];


float[] myFloats = new float[1000];


bool[] myBools = new bool[1000];


string[] myStrings = new string[1000];


6 foreach巡回会在堆上分配一个Enummerator的类,而不是堆上分



7.协程会消耗少量内存,直到调用yield,避免产生太多短信时间的协成


8.闭包很危险,匿名方法和lambda表达式可以是闭包,但不能总是闭包,取决于方法是否使用了它的作用于和参数列表之外的数据


9..net库要少用,比如lINQ和Rehhex类,因为 通用必定减低性能


10.对象池,预制池

相关文章
|
6天前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
17 2
|
6天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
16 2
|
6天前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
7 0
|
6天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
14 0
|
6天前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
13 0
|
6天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
12 0
|
6天前
|
存储 图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
10 0
|
6天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
17 2
|
6天前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
21 0
|
6天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
11 1