游戏蛮牛学习群(纯技术交流,不闲聊):959392658
福建体彩31选7开奖 手机端
问答求助

关注:567

当前位置:福建体彩31选7开奖 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档?!咀詈妹挥懈郊?,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 505|回复: 8
发新帖

31选7: [脚本] 内存泄漏的问题

[复制链接]  [移动端链接]
7日久生情
2790/5000
排名
846
昨日变化
3

福建体彩31选7开奖 www.jlh8.com.cn 49

主题

727

帖子

2790

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
7929
威望
0
注册时间
2015-1-20
在线时间
854 小时
最后登录
2018-12-11
跳转到指定楼层
楼主
发表于 2018-6-13 01:12:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
20蛮牛币
本帖最后由 煮粥侠 于 2018-6-13 01:15 编辑

游戏运行后打开活动监视器,发现即使暂停放置在那里,所占用的内存也会缓慢增长(每20秒左右增加0.1M).通常有哪些错误习惯会引起内存泄漏呢?

比如下面这个脚本:
1.函数中的prefab变量,在方法执行完毕,是否会被自动回收?还是需要手动置null、然后Resources.UnloadUnusedAssets(); ?
2.如果prefab变量是类成员的话,下面的脚本是否会引起内存泄漏?
[C#] 纯文本查看 复制代码
public class Test0 : MonoBehaviour {

        void Start () {
                Create();        
        }
        
        void Create(){
                GameObject prefab=Resources.Load("Prefabs/Hat");
                GameObject newHat=Instantiate(prefab);
        }
}




3偶尔光临
231/300
排名
11360
昨日变化
4

0

主题

75

帖子

231

积分

Rank: 3Rank: 3Rank: 3

UID
163693
好友
0
蛮牛币
533
威望
0
注册时间
2016-8-23
在线时间
68 小时
最后登录
2018-11-29
沙发
发表于 2018-6-13 01:12:49 | 只看该作者
煮粥侠 发表于 2018-6-13 20:34
换一个问法,在函数里声明的变量,是不是程序离开这个函数,它们的内存就会被释放? ...

回答是,不一定
内存被释放的定义是 当这个内存没有被其他任何变量引用的时候,就会被回收
所以,如果你定义的是值类型,那你的说法就是对的,比如 int  double 这些值在离开函数过后会在某个时间自动被回收
但是如果你定义的是一个引用类型的变量,比如,你在一个函数里 fun(){  Class1 c1 = new Class1();  Class2.c = c1;   }  这样,c1 在离开函数的时候虽然不能再使用了,但是他创建出来的 Class1 这个类,是不会被释放的,因为他被 Class2.c 引用了
同理,你用Resource.Load出来的东西,你虽然已经使用完了,但是在系统中Resource还是在引用着你Load出来的对象,所以需要调用对应的Unload方法才能释放
关于变量回收问题,建议百度C#  gc 机制 或者  Unity垃圾回收 可以看到更多内容

3偶尔光临
231/300
排名
11360
昨日变化
4

0

主题

75

帖子

231

积分

Rank: 3Rank: 3Rank: 3

UID
163693
好友
0
蛮牛币
533
威望
0
注册时间
2016-8-23
在线时间
68 小时
最后登录
2018-11-29
板凳
发表于 2018-6-13 20:11:20 | 只看该作者
Resource 和 assetbundle 加载后都不会释放的,需要调用对应的 unload  你可以定期调用 unloadAll 来释放所有没有引用的对象
内存增长大部分情况是New了一堆对象然后没有释放,和Resource是一个道理。
然后你说你暂停也会增长,暂停的时候代码是不会运行的。你这种情况我之前遇到过一次是因为Unity的BUG,Unity的有一项内存在自增,本来用低版本的时候不会,升级后出现的,我当时的版本是2017的某个版本,忘了

7日久生情
2790/5000
排名
846
昨日变化
3

49

主题

727

帖子

2790

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
7929
威望
0
注册时间
2015-1-20
在线时间
854 小时
最后登录
2018-12-11
地板
 楼主| 发表于 2018-6-13 20:29:03 | 只看该作者
十一_11 发表于 2018-6-13 20:11
Resource 和 assetbundle 加载后都不会释放的,需要调用对应的 unload  你可以定期调用 unloadAll 来释放所 ...

我没说清楚,内存增长不是在Unity里面,是发布出来的,在自己电脑上运行时,用系统自带的活动监视器查看的~然后暂停指的是在游戏进行时呼出暂停界面,或退出到游戏菜单界面放置在那,不执行其他操作~

你说的Resource加载出来不会自己释放这些理论我也看了好多但是无法完全理解,能不能就上面我写得这种情况具体说一下?在一个函数里创建的变量=Resource.Load之后,这个函数执行完,变量占用的内存会释放吗?

7日久生情
2790/5000
排名
846
昨日变化
3

49

主题

727

帖子

2790

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
7929
威望
0
注册时间
2015-1-20
在线时间
854 小时
最后登录
2018-12-11
5#
 楼主| 发表于 2018-6-13 20:34:09 | 只看该作者
十一_11 发表于 2018-6-13 20:11
Resource 和 assetbundle 加载后都不会释放的,需要调用对应的 unload  你可以定期调用 unloadAll 来释放所 ...

换一个问法,在函数里声明的变量,是不是程序离开这个函数,它们的内存就会被释放?

7日久生情
2790/5000
排名
846
昨日变化
3

49

主题

727

帖子

2790

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
7929
威望
0
注册时间
2015-1-20
在线时间
854 小时
最后登录
2018-12-11
6#
 楼主| 发表于 2018-6-14 14:53:12 | 只看该作者
十一_11 发表于 2018-6-14 11:34
回答是,不一定
内存被释放的定义是 当这个内存没有被其他任何变量引用的时候,就会被回收
所以,如果你 ...

谢谢,大概明白了!我也看了好多Unity内存管理相关的博文,大概是说比如我写的这个例子中,只有当newHat被Destory后,再prefab=null,Resource.UnLoadUnusedAssets(),然后内存才能被释放掉?假如newHat会在场景里一直存在,或者是要放在对象池里、经常重复使用的,也就不必释放prefab这一块资源了,对吗?

[C#] 纯文本查看 复制代码
 void Create(){
                GameObject prefab=Resources.Load("Prefabs/Hat");
                GameObject newHat=Instantiate(prefab);
        }

5熟悉之中
948/1000
排名
2846
昨日变化
13

1

主题

142

帖子

948

积分

Rank: 5Rank: 5

UID
236305
好友
1
蛮牛币
1335
威望
0
注册时间
2017-8-7
在线时间
307 小时
最后登录
2018-12-12
7#
发表于 2018-6-15 13:48:43 | 只看该作者
这个我之前也遇到过类似的 学习了

3偶尔光临
231/300
排名
11360
昨日变化
4

0

主题

75

帖子

231

积分

Rank: 3Rank: 3Rank: 3

UID
163693
好友
0
蛮牛币
533
威望
0
注册时间
2016-8-23
在线时间
68 小时
最后登录
2018-11-29
8#
发表于 2018-6-21 10:54:56 | 只看该作者
煮粥侠 发表于 2018-6-14 14:53
谢谢,大概明白了!我也看了好多Unity内存管理相关的博文,大概是说比如我写的这个例子中,只有当newHat ...

有一点不对,当你prefab=null,Resource.UnLoadUnusedAssets() 之后, Resource加载出来的 Hat资源内存就已经释放,这个时候newHat 可以继续存在,他们是2个独立互不干扰的内存。只有当你Destrory(newHat)的时候,他的内存才被释放
[发帖际遇]: 十一_11 捡了钱没交公 蛮牛币 降了 1 . 幸运榜 / 衰神榜

7日久生情
2790/5000
排名
846
昨日变化
3

49

主题

727

帖子

2790

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
69941
好友
1
蛮牛币
7929
威望
0
注册时间
2015-1-20
在线时间
854 小时
最后登录
2018-12-11
9#
 楼主| 发表于 2018-6-21 19:07:40 | 只看该作者
十一_11 发表于 2018-6-21 10:54
有一点不对,当你prefab=null,Resource.UnLoadUnusedAssets() 之后, Resource加载出来的 Hat资源内存 ...

谢谢,学习了。
[发帖际遇]: 煮粥侠 捡了钱没交公 蛮牛币 降了 1 . 幸运榜 / 衰神榜

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 福建体彩31选7开奖 返回列表
275| 949| 297| 673| 40| 765| 697| 365| 809| 296|