一种基于Lua获取手机应用内存的方法及装置制造方法及图纸

技术编号:21343199 阅读:32 留言:0更新日期:2019-06-13 22:21
一种基于Lua获取手机应用内存的方法,适用于Unity引擎开发的应用程序,包括:初始化Lua虚拟机以传入自定义的内存分配器到内存分配函数;在Lua调用内存分配函数以分配内存块时,由所述内存分频器遍历当前C#调用栈和Lua调用栈以抓取内存信息;按照调用路径记录内存信息到调用路径表中,并在释放内存块时移除保存有对应调用路径的指针;导出调用路径表,并按照未释放内存块的总大小排序各个调用路径。本申请还相应公开了一种基于Lua获取手机应用内存的装置。本申请的有意效果是:通过混合输出C#调用栈和Lua调用栈,从而能够获取到占用内存较多的C#与Lua代码调用路径,方便开发人员对其进行优化。

A Method and Device for Acquiring Memory of Mobile Application Based on Lua

A method of acquiring the memory of mobile phone application based on Lua is suitable for the application developed by Unity engine. It includes: initializing Lua virtual machine to pass in a custom memory allocator to the memory allocation function; when Lua calls the memory allocation function to allocate memory blocks, the memory divider traverses the current C call stack and the Lua call stack to capture memory information according to the call path; Memory information is put into the call path table, and the pointer that holds the corresponding call path is removed when the memory block is released; the call path table is exported and the call paths are sorted according to the total size of the unreleased memory block. The application also discloses a device based on Lua for acquiring memory of mobile application. The intentional effect of this application is that by mixing the output C# call stack and Lua call stack, it can obtain the C# and Lua code call paths which occupy more memory and facilitate developers to optimize them.

【技术实现步骤摘要】
一种基于Lua获取手机应用内存的方法及装置
本专利技术涉及移动设备领域,尤其涉及一种基于Lua获取手机应用内存的方法及装置。
技术介绍
在智能手机行业,手机游戏作为手机应用中的一个重要的大类,其市场占有率越来越高。大部分的知名游戏开发公司都在手机游戏开发投入了较多的技术研发。在手机游戏的开发过程中,降低手机游戏的内存占用率一直都是手机应用开发人员较为关心的点之一。若游戏运行过程中占用内存过多,可能会被操作系统认定为异常进程而直接关闭,也可能会因占用过多导致系统内存,使得系统性能降低,从而令游戏体验下降。Unity作为一种广泛应用的手机游戏开发引擎,采用Mono平台作为其C#虚拟机,并且支持Lua语言开发。具体地,目前基于Unity引擎开发的游戏一般通过slua以支持Lua语言进行游戏逻辑开发。对于游戏中Lua部分代码的内存分配和回收,主流的实现方案采用替换内存分配器,以方便统计以分配给Lua的内存和及时地释放相关内存。同时,上述实施方案也可以通过导出Lua调用栈来获得内存热点,为开发人员对手机游戏的进一步优化提供参考(例如确定手机游戏的性能瓶颈,改善卡顿或内存不足而引起的闪退问题)。然而,由于在Unity引擎所开发的手机游戏中,Lua代码部分与C#代码部分一般都会根据具体的应用场合而相互调用,因此如果仅输出Lua调用栈,那么开发人员很多时候无法获取到全面的内存调用信息。
技术实现思路
本申请的目的是解决现有技术的不足,提供一种基于Lua获取手机应用内存的方法及装置,通过混合输出C#调用栈和Lua调用栈,从而能够获得更为详细的Lua内存热点信息的效果。为了实现上述目的,本申请采用以下的技术方案。首先,本申请提出一种基于Lua获取手机应用内存的方法,适用于Unity引擎开发的应用程序。该方法包括以下步骤:S100)初始化Lua虚拟机以传入自定义的内存分配器到内存分配函数;S200)在Lua调用内存分配函数以分配内存块时,由所述内存分频器遍历当前C#调用栈和Lua调用栈以抓取内存信息;S300)按照调用路径记录内存信息到调用路径表中,并在释放内存块时移除保存有对应调用路径的指针;S400)导出调用路径表,并按照未释放内存块的总大小排序各个调用路径。进一步地,在本申请的上述方法中,所述内存信息至少包括内存分配大小、对象类型和内存块地址。可替代地,在本申请的上述方法中,所述内存分配函数采用钩子函数的形式实现。进一步地,在本申请的上述方法中,所述步骤S200还包括以下的子步骤:S201)通过钩子函数形式的内存分配器捕获Lua分配内存的消息;S202)遍历当前C#调用栈和Lua调用栈以抓取内存信息;S203)散列所抓取的内存信息,并形成散列后内存信息的索引号。进一步地,在本申请的上述方法中,所述步骤S300还包括以下的子步骤:S301)保存所述索引号及调用路径到调用路径表中;S302)保存所分配内存的内存指针、索引号和内存信息到内存分配信息索引表中;S303)在释放内存时,根据内存分配信息索引表中的记录,删除相应的内存指针、索引号和内存信息。进一步地,在本申请的上述方法中,所述步骤S400还包括以下的子步骤:S401)导出调用路径表和内存分配信息索引表为可读文件;S402)按照所述索引号,分别配对调用路径表和内存分配信息索引表上未释放内存的调用路径和内存信息;S403)按照未释放内存块的总大小排序各个调用路径。再进一步地,在本申请的上述方法中,应用程序在运行预设的时间后,自动导出所述调用路径表和所述内存分配信息索引表。其次,本申请提出一种基于Lua获取手机应用内存的装置,适用于Unity引擎开发的应用程序。该装置包括以下模块:初始化模块,用于初始化Lua虚拟机以传入自定义的内存分配器到内存分配函数;遍历模块,用于在Lua调用内存分配函数以分配内存块时,由所述内存分频器遍历当前C#调用栈和Lua调用栈以抓取内存信息;记录模块,用于按照调用路径记录内存信息到调用路径表中,并在释放内存块时移除保存有对应调用路径的指针;导出模块,用于导出调用路径表,并按照未释放内存块的总大小排序各个调用路径。可替代地,在本申请的上述装置中,所述内存信息至少包括内存分配大小、对象类型和内存块地址。进一步地,在本申请的上述装置中,所述内存分配函数采用钩子函数的形式实现。进一步地,在本申请的上述装置中,所述遍历模块还包括以下子模块:捕获模块,用于通过钩子函数形式的内存分配器捕获Lua分配内存的消息;第一执行模块,用于遍历当前C#调用栈和Lua调用栈以抓取内存信息;散列模块,用于散列所抓取的内存信息,并形成散列后内存信息的索引号。进一步地,在本申请的上述装置中,所述记录模块还包括以下的子模块:第一保存模块,用于保存所述索引号及调用路径到调用路径表中;第二保存模块,用于保存所分配内存的内存指针、索引号和内存信息到内存分配信息索引表中;删除模块,用于在释放内存时,根据内存分配信息索引表中的记录,删除相应的内存指针、索引号和内存信息。进一步地,在本申请的上述装置中,所述导出模块还包括以下子模块:第二执行模块,用于导出调用路径表和内存分配信息索引表为可读文件;配对模块,用于按照所述索引号,分别配对调用路径表和内存分配信息索引表上未释放内存的调用路径和内存信息;排序模块,用于按照未释放内存块的总大小排序各个调用路径。再进一步地,在本申请的上述装置中,应用程序在运行预设的时间后,自动导出所述调用路径表和所述内存分配信息索引表。最后,本申请还提出一种计算机可读存储介质,其上存储有计算机指令。上述指令被处理器执行时,执行如下步骤:S100)初始化Lua虚拟机以传入自定义的内存分配器到内存分配函数;S200)在Lua调用内存分配函数以分配内存块时,由所述内存分频器遍历当前C#调用栈和Lua调用栈以抓取内存信息;S300)按照调用路径记录内存信息到调用路径表中,并在释放内存块时移除保存有对应调用路径的指针;S400)导出调用路径表,并按照未释放内存块的总大小排序各个调用路径。进一步地,在本申请的上述指令被处理器执行的过程中,所述内存信息至少包括内存分配大小、对象类型和内存块地址。可替代地,在本申请的上述指令被处理器执行的过程中,所述内存分配函数采用钩子函数的形式实现。进一步地,在本申请的上述指令被处理器执行的过程中,所述步骤S200还包括以下的子步骤:S201)通过钩子函数形式的内存分配器捕获Lua分配内存的消息;S202)遍历当前C#调用栈和Lua调用栈以抓取内存信息;S203)散列所抓取的内存信息,并形成散列后内存信息的索引号。进一步地,在本申请的上述指令被处理器执行的过程中,所述步骤S300还包括以下的子步骤:S301)保存所述索引号及调用路径到调用路径表中;S302)保存所分配内存的内存指针、索引号和内存信息到内存分配信息索引表中;S303)在释放内存时,根据内存分配信息索引表中的记录,删除相应的内存指针、索引号和内存信息。进一步地,在本申请的上述指令被处理器执行的过程中,所述步骤S400还包括以下的子步骤:S401)导出调用路径表和内存分配信息索引表为可读文件;S402)按照所述索引号,分别配对调用路径表和内存分配信息索引表上未释放内存的调用路径和内本文档来自技高网...

【技术保护点】
1.一种基于Lua获取手机应用内存的方法,适用于Unity引擎开发的应用程序,其特征在于,包括以下步骤:S100)初始化Lua虚拟机以传入自定义的内存分配器到内存分配函数;S200)在Lua调用内存分配函数以分配内存块时,由所述内存分频器遍历当前C#调用栈和Lua调用栈以抓取内存信息;S300)按照调用路径记录内存信息到调用路径表中,并在释放内存块时移除保存有对应调用路径的指针;S400)导出调用路径表,并按照未释放内存块的总大小排序各个调用路径。

【技术特征摘要】
1.一种基于Lua获取手机应用内存的方法,适用于Unity引擎开发的应用程序,其特征在于,包括以下步骤:S100)初始化Lua虚拟机以传入自定义的内存分配器到内存分配函数;S200)在Lua调用内存分配函数以分配内存块时,由所述内存分频器遍历当前C#调用栈和Lua调用栈以抓取内存信息;S300)按照调用路径记录内存信息到调用路径表中,并在释放内存块时移除保存有对应调用路径的指针;S400)导出调用路径表,并按照未释放内存块的总大小排序各个调用路径。2.根据权利要求1所述的方法,其特征在于,所述内存信息至少包括内存分配大小、对象类型和内存块地址。3.根据权利要求1或2所述的方法,其特征在于,所述内存分配函数采用钩子函数的形式实现。4.根据权利要求3所述的方法,其特征在于,所述步骤S200还包括以下子步骤:S201)通过钩子函数形式的内存分配器捕获Lua分配内存的消息;S202)遍历当前C#调用栈和Lua调用栈以抓取内存信息;S203)散列所抓取的内存信息,并形成散列后内存信息的索引号。5.根据权利要求4所述的方法,其特征在于,所述步骤S300还包括以下的子步骤:S301)保存所述索引号及调用路径到调用路径表中;S302)保存所分配内存的内存指针、索引号和内存信息到内存分配信息索引...

【专利技术属性】
技术研发人员:刘马良马力刘鼎三黎健钧
申请(专利权)人:珠海金山网络游戏科技有限公司珠海西山居移动游戏科技有限公司
类型:发明
国别省市:广东,44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1