欢迎光临车床网站,为您提供精密加工全套工艺生产线

【永康市二手机床回收】【Unity】垃圾回收优化

作者:以沫      发布时间:2021-04-12      浏览量:0
介绍我们的游戏运行时,使用内存存储数据。

介绍

我们的游戏运行时,使用内存存储数据。当数据不再需要时,存储数据的内存将被释放以重用。垃圾(Garbage,是存储不再使用的数据存储器的术语。垃圾回收(Garbage,collection,是使内存再次使用的过程的名称。

Unity????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????如果垃圾回收频繁或者垃圾回收需要做很多工作,那么我们的游戏性能就会变差。垃圾回收是性能问题的常见原因。但是,其他问题也会引起类似的症状。如果我们的游戏有类似的问题,首先我们应该使用,Untty,关于这个问题是否是由于垃圾回收引起的,如果我们的游戏有类似的问题。

学习如何使用。学习如何使用。学习如何使用。

我们必须明白Unity存储管理简介

为了理解垃圾回收是如何发生的。首先我们要明白发动机代码和自己编写的代码内存管理是不一样的。

核心引擎代码运行时的存储管理方式被称为手动存储管理。这意味着核心引擎代码必须明确说明如何使用内存。自动内部管理不会使用垃圾回收,本文不会进一步解释。

我们代码运行时的存储管理方法被称为:自动存储管理。这意味着我们的代码不需要明确告诉Unity如何管理内存。Unity已经为我们考虑了。

栈分配和释放内存时会发生什么?

堆栈分配和释放内存非常快捷简单。这是因为堆栈只用于储存短时间的小数据。

堆积分配内存会发生什么?

堆积分配内存比堆积分配内存复杂得多。这是因为堆积可以用来存储长期数据和短期数据和不同类型和大小的数据。分配和释放不是总是按预期的顺序,而是需要大小非常不同的存储块。

制作堆积变量时,

堆积分配可能会变慢,特别是需要运行垃圾回收器或扩大堆积内存时。

垃圾回收时会发生什么?

在堆积变量离开作用域时,存储该变量的存储器不会立即释放。不使用的堆积存储器只能在垃圾回收器运转时释放。

每次垃圾回收器运转,

垃圾回收什么时候发生?

三件事可能会引起垃圾回收:

垃圾回收可能是频繁的操作。请求内存分配,内存不足会引起垃圾回收器,频繁的内存申请和释放可能会引起频繁的垃圾回收。

最明显的问题是垃圾回收器运行时间长。如果垃圾回收中有大量的堆积物或者大量的引用需要检查的话,检查所有物体的进度可能会很慢。这可能会导致我们的游戏卡尔顿或运行缓慢。

另一个问题是垃圾回收器可能在不恰当的时间运行。如果是,CPU的话,努力运行我们游戏性能的重要部分,垃圾回收也有可能增加小消费,导致我们游戏的框架和性能的变化。

另一个没有那么明显的问题,就是堆积碎片(heapfration)。从堆积的空闲内存块申请的内存大小取决于必须存储的数据大小。当这些内存块被堆积回收时,堆积可能是被申请的内存块分割成的许多小空闲内存块。这意味着,尽管闲置存储器的总量很高,但如果不使用垃圾回收器或扩展存储器,就不能申请大存储器。因为现存存储器没有那么大的存储器。

堆积碎片会产生两种结果。第一,我们游戏使用的存储器比必要的存储器高。二是垃圾回收器经常使用。关于堆积碎片的详细情况和讨论,请看本文。

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????堆积变量离开作用域时会产生垃圾,首先要知道堆积分配变量的原因。

栈和堆放分配是什么?

在Unity中,值型的本地变量是在栈上分配的,除此之外是在上。如果不知道是哪个数据类型的话,请看这个教程。

下面是栈分配内存的例子代码,如果是,则是局部变量和值。该变量申请的存储器在函数执行后立即回收。

voidexampleFunction){{intlocalint=5;}

以下是内存分配的示例代码,locallistrallist,局部变量是引用类型。该变量申请的存储器在垃圾回收器运行时回收。

选择

CPU

分析器,可以选择任何框架查看

CPU

该框架的数据。其中一列数据叫做

GCalloc

。这个数据显示了这个框架的分配信息。如果沃恩选择了排头,我们可以统计的数据进行排序,这样我们就可以更容易地看到我们游戏中哪个函数造成的堆积分配最多。如果知道哪个函数是对的分配的话,可以检查这个函数。

如果知道函数中产生垃圾的代码,就可以决定如何解决这个问题,最小化垃圾的发生。

减少垃圾回收的影响

通常可以用以下三种方法减少垃圾回收的影响:

考虑到这一点,这里有三种方法可以帮助我们减少垃圾产生的数量

代码测试

缓存(Caching)

如果我们频繁调用内存,用完后丢弃的函数,就会产生不必要的垃圾。我们应该保存这些对象的引用来重用它们。这种方法叫做缓存。

下面的例子是,代码每次调用都会分配存储器。这是因为新的数组诞生了。

voidrenter(colliderother){render[]allrendert=FindObjectsOftype();在下面的代码中,只有一次内存申请,因为几组创建后缓存。这个缓存的数组可以重用,不会产生更多的垃圾。

();}voidontrentrer=FindObjectsOfindObjectsOftsOffer(alllrentrer);}

不要在频繁调用的函数中申请内存

如果我们必须存在Malavamplertreftindererertinionion(ander){ar);}

中存在最坏的情况下存在调用的情况。}

例如,Update(),每一帧都会使用。如果我们生产垃圾的代码被调用到这些地方,垃圾很快就会累积。我们应该尽可能地考虑到,在此期间,我们应该考虑到,在需要的时候,我们只申请一次内存。