首页 > 科技 >

ToLua的释放时机

2019-08-22 15:18:12 暂无 阅读:956 评论:0

本期目录:ToLua的释放时机Physics.Proccesing和Physics.Simulate的区别打包出来包含图片UnitySplash-cube采用LZ4把资源打成大包与打成小包在内存占用的区别若何解决Bundle文件内对另外Bundle的依靠顺序

Lua

Q:使用UWA GOT测试游戏挂机的Mono内存增进情形。发现LuaInterface.LuaFileUtils:ReadZipFile这里常驻的内存一向在增加。

这里每隔一段时间就会挪用LuaInterface.LuaFileUtils:ReadZipFile的原因是:在Lua代码中会准时清理游戏设置,package.loaded也设为NIL。下一次需要用到设置的时候从新require。

ToLua的释放时机

乞助的问题:ToLua虚拟机在require载入代码后,什么时候会去搜检释放内存?多次require同个代码文件会造成内存泄露吗?

A:凭据你供应的信息建议你的查找偏向:

(1)是不是重写了require;

(2)是不是读文件函数自己的问题。

static int ll_require (lua_State *L) {

const char *name = luaL_checkstring(L, 1);

lua_settop(L, 1); /* _LOADED table will be at index 2 */

lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");

lua_getfield(L, 2, name); /* _LOADED[name] */

if (lua_toboolean(L, -1)) /* is it there? */

return 1; /* package is already loaded */

/* else must load package */

lua_pop(L, 1); /* remove 'getfield' result */

findloader(L, name);

lua_pushstring(L, name); /* pass name as argument to module loader */

lua_insert(L, -2); /* name is 1st argument (before search data) */

lua_call(L, 2, 1); /* run loader to load module */

if (!lua_isnil(L, -1)) /* non-nil return? */

lua_setfield(L, 2, name); /* _LOADED[name] = returned value */

if (lua_getfield(L, 2, name) == LUA_TNIL) { /* module set no value? */

lua_pushboolean(L, 1); /* use true as result */

lua_pushvalue(L, -1); /* extra copy to be returned */

lua_setfield(L, 2, name); /* _LOADED[name] = true */

}

return 1;

}

这个xLua中require的函数实现,若是你没有重写require函数,那么这个函数就相当于:

local _loaded = {}

function require(name)

local tab = _loaded[name]

if tab then

return tab

end

--下面是伪代码

local bytes = LuaInterface.LuaFileUtils:Loaded(name)

tab = lua.LoadModule(bytes)

_loaded[name] = tab

return tab

end

感激shunfy@UWA问答社区供应了回覆,迎接人人转至社区交流:

https://answer.uwa4d.com/question/5d51505e80d96a06d776dc52

Physics

Q:我在UWA申报中的主要参数解析那边看到Physics.Proccesing和Physics.Simulate,看到它们的挪用情形一致,然则耗时纷歧致?请问这两者的区别是什么?离别代表什么意义?优化的时候偏重点是什么呢?

ToLua的释放时机
ToLua的释放时机

A:这两者都是Unity引擎中PhysX物理引擎的耗时开销。两者挪用次数一致是正常的,因为它们的确每帧中都同时挪用。对于它们具体离别负责哪些处所,我并没有看过PhysX的源码,所以无法回覆,但能够解说的是,在Unity 2017之前,Physics.Simulate是物理模块最首要的耗时函数,而在Unity 2017之后,Physics.Processing是物理模块最首要的耗时函数。

关于优化,能够查察这两个问题帖子:

《Physics.Processing占用过大》

《在游戏里没有使用物理(Physics)相关功能时,怎么把物理相关的机能消费降到最低(大部门是Physics.Processing)》

该回覆由UWA供应,迎接人人转至社区交流:

https://answer.uwa4d.com/question/5d4ee389c494b506d267394c

Resource

Q:用AssetStudio解包本身游戏打出来的包,发现包里有UnitySplash-cube这张图片,Unity版本是2017.4.10,也找不到哪里用了,求问怎么能去掉它?

看了一下它是在Unity default resources这个文件里,这里面除了这个还有好几个没用的图片和Unity自带的Mesh,有法子去掉那些没用的吗?

ToLua的释放时机
ToLua的释放时机
ToLua的释放时机

A:这个问题以前还真研究过,当然后来不了了之了。小我感觉理论上可行的步伐如下:

(1)在Unity安装目录Editor/Data/Resources下找到unity default resources文件,拷贝一份出来。

(2)将拷贝出来的文件添加后缀.asset,然后将其放到项目工程里面,没错,这个unity default resources其实就是一个Binary模式序列化的YAML文件。如下图:

ToLua的释放时机

(3)行使AssetDataBase供应的API删除不需要的资源,确保序列化为Binary模式,留存点窜后的文件。

(4)将点窜后的文件去掉后缀,替代安装目录下面的自带文件,重启Unity。

个中步伐(3)、(4)没有着手实践,或者有些问题,好比:资源的GUID发生转变导致无法关系等等。题主能够先实践一下看看。

其实除了unity default resources,还有两个文件也是如斯,不外文件很大导入Unity会导致假死:

ToLua的释放时机

感激张迪@UWA问答社区供应了回覆,迎接人人转至社区交流:

https://answer.uwa4d.com/question/5d525d9d80d96a06d776dc53

Bundle

Q:若是不考虑热更巨细,把资源打成几个大的AssetBundle包采用LZ4,是否与打成小包在内存使用上没有区别?

https://answer.uwa4d.com/question/5ae13b610956834900752617

文档上说chunk存储,在Load Asset时,才会读取响应资源到内存。如许把资源压到一个大包和分包在内存占用上没有区别吗?此外,读多个包效率会比读单个效率低吗?

A1:(1)内存占用有区别,然则不同不大。

使用LZ4压缩花样,包含的资源数量越多头文件内存占用越大,理论上能够经由优化资源路径长度来削减占用(作为参考,我们项目把所有材质打成了一个Bundle,资源数量7000+,占用内存为2.5MB);

(2)因为有IO消费,多个包的加载效率会比单个包低。

感激于翔@UWA问答社区供应了回覆

A2:(1)这个问题其实和你使用LZ4或许LZMA关系不大,资源应该照样需要按功能模块或许另外更高效的体式划分。假若A模块和B模块毫不相关,就没需要把它们放在一个Bundle里面了,究竟Bundle越大序列化需要的时间就越长,占用的内存也就越大;反之,则加载时间变短,且削减内存占用。

(2)若是是for轮回一个一个的LoadAsset那一定不如LoadAllAsset来得快;但若是是Bundle的条理而非Bundle中的Asset,那只能一个一个Bundle的来,谈不上什么效率。

感激李星@UWA问答社区供应了回覆,迎接人人转至社区交流:

https://answer.uwa4d.com/question/5d529f5180d96a06d776dc54

Bundle

Q:若何解决Bundle文件内对另外Bundle的依靠顺序,导致分歧build之间MD5转变。分歧时间或机械打出来的Bundle二进制有细微不同,解出来对好比下,即对另外Bundle的依靠顺序纷歧样了,有什么法子能包管顺序?

ToLua的释放时机
ToLua的释放时机

A1:(1)有Unity源码,重写依靠排序算法。

(2)测验使用AssetStudio重排依靠顺序。

(3)自界说MD5较量划定,例如:资源+meta的MD5。

感激张迪@UWA问答社区供应了回覆

A2:(1)本身算MD5;

(2)发如今有之前AssetBundle包的情形下,和删除从新打,有时候打出来的AssetBundle包会纷歧样,于是改成每次删除所有AssetBundle包从新打;

(3)后来又发现,改了某些资源后,“导入资源后马上打包”与“导入资源后关掉Unity重开再打包”出来的AssetBundle包也会纷歧样。此次改成SVN更新好之后,先打开一次让Unity导入资源,然后关掉Unity重开再打包。

感激deviljz@UWA问答社区供应了回覆

A3:能够连系本身项目的热更新和资源治理系统自行实现一套雷同的设置,留存游戏中资源和Bundle的相关信息。

相关文章