在项目里面有时需要从服务器上下载比较大的文件,比如我们在做更新的时候需要下载AssetBundle文件。Unity3D中提供了WWW接口可以用来下载文件,但是使用之后发现这个接口在下载比较大的文件的时候非常占用内存资源。然后我用C#的Webclient接口来下载同样的文件,发现内存占用情况存在和WWW的完全不一样。本文来就来探讨一下使用WWW和Webclient两个接口下载文件造成内存占用的原因。
C# foreach带来的内存问题
简介
在使用Unity工具开发游戏的时候经常会被建议不要使用foreach,究其原因说是会产生额外的heap内存,既然存在这种问题, 那我必须得自己搞清楚下。本文是自己查阅资料和试验的结果总结。
本文参考了Memory allocation when using foreach loops in C#
测试环境: Unity5.4.1f1, MonoV2.0.5
剖析
首先来搞明白使用foreach和for的区别,下面是一个简单的例子:
1 |
|
Unity 苹果IAP和微信支付接入
苹果IAP接入
相比微信支付和支付宝支付要麻烦一些,麻烦的地方主要体现在对测试支付环境的要求以及苹果审核方面的要求上面。本文是自己在接入iOS的IAP模块的经验及总结,发出来分享下。建议需要接入的话还是浏览一遍苹果官方文档
注意事项
- 测试支付的ipa必须使用[App-Store]证书
- 越狱机器无法测试IAP
- 用SandBox账号测试支付的时候,必须把在系统[设置]里面把[Itunes Store 与 App Store]登录的非SandBox账号注销掉,否则向苹果服务器请求不到订单信息
- Sandbox账号不要在正式支付环境登陆支付,登陆过的正式支付环境的SandBox账号会失效
- 所有在itunes上配置的商品都必须可购买,不能有某些商品根据商户自己的服务器的数据在某个时期出现免费的情况
- 商品列表不能按照某些特定条件进行排序(比如说下载量)
- 非消耗型商品必须的有恢复商品功能
- 非消耗类型的商品不要和商户自己的服务器关联
我所理解的Unity AssetBundle
本文是学习Unity官方教程、Unity官方的API和阅读Unity代码的总结
AssetBundle基本知识
1. AssetBundle由两部分组成:头部(header)数据部分(data segment)
- 头部保存了版本号、数据类型、<font color=#FF0000>文件信息</font>、是否压缩等这些描述信息。
- 文件信息记录了数据部分里面的所有单个资源的文件名以及在整个AssetBundle中文件offset和size,通过这个信息可以直接获取到AssetBundle中的某一个文件的数据。从Unity5.3版本开始这部分数据会单独生成一个AssetBundle同名的.manifest文件。
- 数据块保存了在build AssetBundle时候标记的textures、prefabs、materials等这些资源文件
C# 内存管理之对象循环引用问题
C#的内存管理用到了引用计数, 但是和以往我们认识的Java、Objective-c的内存管理有非常大的不同之处。不同之处在于C#的引用计数只有在GC Root对象引用的对象身上才生效,也就是说如果一个对象被GC Root对象引用了,那么在这个GC Root对象没有销毁之前这个对象是不会被销毁的。反之,如果一个对象没有被GC Root对象引用,即便这个对象被再多非GC Root对象引用,也会再下一次内存回收的时候被销毁。
GC Roots:
- 正在运行的局部变量
- 静态变量
- 重写了object的finalizer方法的变量
- 正在调用的函数传递的参数
下图演示了几种对象引用的情况:
根据我们前面的描述,我们很容易判断object A和object B在RootA 被释放之后随之会被释放,object C和object D 虽然循环引用,但是没有被Root引用,所以在下一次内存回收的时候就会被释放,RootB和RootC造成了循环引用所以释放不了。