【lua】lua内存优化记录

这边有一个Unity项目用的tolua, 游戏运行后手机上lua内存占用 基本要到 189M, 之前峰值有200多。

优化点1  加快gc频度:

用uwa抓取的lua内存, 和unity的mono很像,内存会先涨 然后突然gc一下,降下来。 这样内存峰值就会比较高,再加上游戏里其他内存占用多, 3G的ios内存吃紧很不友好,容易闪退。
所以一个方法 调了lua gc的参数, 让其加快了gc频率, 由于lua这边是增量式GC的,所以gc频率高了 也没啥卡顿。 最后性能测试 发现lua 游戏里内存占用基本是 一条直线了。

参数是这么设的, 另外一个项目的lua也是这么设的,网上找到的一些例子也设了这个参数:

    collectgarbage("setpause",100)      --表示当收集器在总使用内存数量达到上次垃圾收集时的(100/100)一倍时再开启新的收集周期。 (默认200)
    collectgarbage("setstepmul",5000)   --表示垃圾收集器的运行速度是内存分配的50(5000/100)倍,如果此值小于100可能会导致垃圾回收不能形成完整的周期。 (默认200)
    collectgarbage("restart")

之前是默认值,回收频率比较低。


 

优化点2 去掉了因require路径 / 和 .的混用造成的重复加载:


参考我另外一篇文章单独说了这个问题。
发现契机是这样的, 这边点开始游戏 会初始化预处理很多数值表(原因就是 require 来 require 去, 引用关系嵌套 导致很多不一定用的表也加载了。  因为登录游戏后服务器发数据过来 必须把有的模块初始化好, 这个也是个优化点,暂时还没去处理),  卡顿很久体验不好。   所以想到刚进游戏 在登录界面等待没事做时可以 分帧加载必须的数值表。  减少一次性的卡顿。

但跟踪发现 好像优化不大,而且好多表都加载2次。
才发现 require "data/xxxx" require "data.xxxx" 在真机上会加载2次 (用的库没改好)。

简单优化方案,入口lua最开头,重写 require 把 传进来的路径 把/替换成的.

实际一跑,发现卡顿时间变少了, 内存还减少了35M左右。

优化点3 数值表lua里内存精简:


一开始看了这篇文章:
Lua性能优化(一):Lua内存优化 - 知乎
里面提到了这篇文章:
Lua配置表存储优化方案 - UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技

这边项目的策划数值表是导出成protobuf的二进制格式,然后加载到内存里。方便前后端解析(因为协议都是用Protobuf)。
但项目里数值后期太多, 大头都是数值表,所以优化数值表可以省很多内存:

优化方法A    就是前面有提到的 把字段名优化掉 (这个项目很早之前就实现过了),   
 把解析出来的数据 每行字段值 按[1] [2] ……[n] 索引存放, 代码请求时 用了一个meta table,里面记录了 表的所有字段名及对应的索引 (从.pbc文件里解析 google.protobuf.FileDescriptorSet 得到的)

	local dataMetatable = {}
	dataMetatable.keys = {}
	local t_pbc = protobuf.decode("google.protobuf.FileDescriptorSet", pbcBuff)
	local proto = t_pbc.file[1]
	for _,v in ipairs(proto.message_type[1].field) do
		dataMetatable.keys[v.name] = v.number
	end
	
	dataMetatable.__index = function(t, k)
		local v = rawget(t, dataMetatable.keys[k])
		return v
	end

这样确实省下二三十M内存吧(数值不一定准)。    解析表会稍慢些。

优化方案B  每行数据按需加载
这个方案思路本来挺好的, 当时也是为了节省C#那边的mono内存。  
把数值文件,预处理一下,把每行数据的各自序列化后按顺序存放成一个二进制文件,  另外还要生成一个索引对照文件,里面记录了某个key 在数值表的起止位置。 
这样数值表很多暂时用不到的数据就不用加载进来。 省下很多内存。 getbykey时,找一下发现内存里没有,则用流方式去文件里读取数据,然后单行反序列化下就行了。  (只不过索引文件也会占一部分额外内存放在内存里面)

实际项目到了后期,发现内存没省多少,进游戏加载时也特别卡了。    因为很多数值表 数据需要全部遍历预处理一下一些字段, 造成不少表还是全部读取了,反而没有优化,变得更卡更占内存。   也没有 很久不用就回收 的机制。 
(这个可以继续规范优化,比如个别表全部加载方式,个别表按需加载,  再实现长久不用的数据或表释放掉……)


优化方案C 每个数值表设一张默认值表

就是前面uwa文章里提到的,一般数值表有很多字段完全一样,没必要重复存放。(这边项目后期确实很多字段虽然看起来用着但都默认填一样,基本是废的,但还占用内存)
这样就可以 把一些数据很多的表,统计一下每个字段的默认值, 
导表或者解析表数据存到内存时, 发现字段和默认值一样的,就不要导出或者存到内存里,直接置空就行了:



这边是这样实现的在 方案A的基础上做了调整, metatable里加了一个default表, 
__index时,如果key取到数据为nil,则从default表里取:

		local data_name = proto.message_type[1].name -- 数值表名
		dataMetatable.default = InitDataDefault.get_data_default(data_name)
		for _,v in ipairs(proto.message_type[1].field) do
			dataMetatable.keys[v.name] = v.number
		end
		
		dataMetatable.__index = function(t, k)
			local v = rawget(t, dataMetatable.keys[k])
			if nil == v and dataMetatable.default then
				v = dataMetatable.default[k];
			end
			return v
		end
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==


default表的结构类似这样:

针对几个大表处理, lua gc后,内存降了有40多M,  只不过加载时间可能会变长些,所以目前只是在IOS小内存设备上开了这个处理。  

内存优化量仅供参考。 具体还是看数值表的复杂情况和量级。



附带其他几个lua 优化的文章:
Lua性能优化技巧_lua 性能优化-CSDN博客

https://www.cnblogs.com/marcher/p/16866981.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/440445.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

S4---FPGA-K7板级原理图硬件实战

视频链接 FPGA-K7板级系统硬件实战01_哔哩哔哩_bilibili FPGA-K7板级原理图硬件实战 基于XC7K325TFFG900的FPGA硬件实战框图 基于XILINX 的KINTEX-7 芯片XC7K325FPGA的硬件平台,FPGA 开发板挂载了4 片512MB 的高速DDR3 SDRAM 芯片,另外板上带有一个SODIM…

RabbitMQ的Windows版安装教程

文章目录 前言一、Windows安装RabbitMQ总结 前言 曾经写过一篇关于RabbitMQ的Ubuntu安装教程(http://t.csdnimg.cn/5CYfC),当时使用的是Docker将RabbitMQ安装到虚拟机上,但是有很多小伙伴问Windows上如何进行安装RabbitMQ&#x…

根据xlsx文件第一列的网址爬虫

seleniumXpath 在与该ipynb文件同文件下新增一个111.xlsx,第一列放一堆需要爬虫的同样式网页 然后使用seleniumXpath爬虫 from selenium import webdriver from selenium.webdriver.common.by import By import openpyxl import timedef crawl_data(driver, url)…

【力扣白嫖日记】1164.指定日期的产品价格

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 1164.指定日期的铲平价格 表:Products 列名类型product_idintnew_priceintchange_datedate (pr…

Nacos2.2.3之MySQL8.X持久化详细配置过程

Nacos2.2.3之MySQL8.X持久化详细配置过程 文章目录 Nacos2.2.3之MySQL8.X持久化详细配置过程1. 官网与下载1. 官网2. Naocs是什么?3. 下载 2. 安装与持久化配置1. 解压安装2. 创建数据库1. 连接数据库2. 创建nacos数据库3. 导入脚本4. 查看表 3. 持久化配置1. appli…

Ant Design Vue a-select 的 optionFilterProp 检索结果不对

<a-selectshow-search //可输入查询optionFilterProp"label" //查询的是labelv-model:value"form.roomId"placeholder"请选择房间名称":disabled"isUpdate"><a-select-optionv-for"item in rooms":key"ite…

【嵌入式高级C语言】9:万能型链表懒人手册

文章目录 序言单向不循环链表拼图框架搭建 - Necessary功能拼图块1 创建链表头信息结构体 - Necessary2 链表头部插入 - Optional3 链表的遍历 - Optional4 链表的销毁 - Necessary5 链表头信息结构体销毁 - Necessary6 获取链表中节点的个数 - Optional7 链表尾部插入 - Optio…

如何在Windows系统部署Jellyfin Server并实现公网访问内网影音文件

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

基于工业边缘网关的机械状态监测与故障诊断应用

机械设备工作于各种各样的环境&#xff0c;在运行过程中必然受到力、温度、摩擦等多种物理、化学作用,使机械设备状态和性能变化,进而产生“隐性故障”。随着机械设备“隐性故障”的长期累积&#xff0c;可能造成设备损伤损坏&#xff0c;甚至影响系统整体生产和运营&#xff0…

SVG 渐变边框在 CSS 中的应用

SVG 渐变边框在 CSS 中的应用 <template><div class"home"><div class"one"><svg width"100%" height"100%"><rect x"2" y"2" width"100%" height"100%" fill&q…

SpringCloud-搭建RabbitMQ消息队列

本文介绍了在 Windows 环境下安装 RabbitMQ 及其依赖的 Erlang 语言的过程。通过提供下载链接和详细的安装步骤&#xff0c;使读者能够快速搭建 RabbitMQ 开发环境。同时&#xff0c;展示了常用的命令和验证方法&#xff0c;确保安装正确完成。这为搭建 RabbitMQ 服务奠定了基…

千兆网络变压器的特点

不要选错了&#xff0c;同款的小24PIN工业级千兆网络变压器有两种&#xff0c;外壳尺寸、工程参数完全相同。很多客户对这两款产品傻傻分不清&#xff0c;今天我就来详细介绍一下&#xff1a; HX82409S特点有三个&#xff1a; 一&#xff0c;采用单环设计&#xff0c;只有一颗…

学历双非,找中小厂测试行不行

大家好&#xff0c;我是洋子。今年的24春招大部分互联网公司都启动了&#xff0c;25届实习生招聘也同步启动。 虽然就业市场看起来还是比较严峻&#xff0c;但值得欣慰的是大厂招聘hc确有回暖迹象&#xff0c;腾讯2024年招聘实习生5000&#xff0c;美团24春招&25转正实习hc…

在圆钢生产中 哪种直线度测量仪更具实用性?

圆钢直线度尺寸是其品质检测中重要一环&#xff0c;要说直线度测量方法&#xff0c;那肯定是有很多种&#xff0c;但要说适合产线&#xff0c;更具实用性的是哪种&#xff0c;本文就来简单的看一下。 简单来说&#xff0c;直线度测量方法有直尺法、重力法、直线法、百分表、水平…

外呼营销的出单成本

在虚拟通信里面&#xff0c;需要不断降低投诉骚扰营销。企业通过呼叫中心电话营销来销售产品&#xff0c;随着市场的管控越来越严格&#xff0c;那就是需要计算出呼叫意向客户的成本。 前期成本是企业引入呼叫中心系统的成本&#xff0c;主要取决于呼叫中心系统的类型。本地自建…

Linux 关于NTP同步硬件时钟的可靠性验证

Linux关于NTP同步硬件时钟的可靠性验证 1. 常见的时钟类型1.1 系统时钟1.2 硬件时钟 2. 常见时钟同步方式2.1 ntpd服务2.1.1 推荐配置/etc/ntp.conf2.1.2 推荐配置/etc/sysconfig/ntpd 2.2 定时任务ntpdate2.3 ntp命令同步状态相关命令解读2.3.1 ntpq -pn解读2.3.2 ntpdate -u解…

day04-Maven

一、初识 Maven Maven 是 Apache 旗下的一个开源项目&#xff0c;是一款用于管理和构建 java 项目的工具。 官网&#xff1a;https://maven.apache.org/ Maven的作用 依赖管理&#xff08;方便快捷的管理项目依赖的资源(jar包)&#xff0c;避免版本冲突问题&#xff09;统一项目…

蓝桥杯-最大距离

根据题意直接写出来就行。 简单题就话不多说上代码了 #include <iostream> #include <cmath> using namespace std; int main() {int n;cin>>n;int a[1000]{0};for(int i0;i<n;i){cin>>a[i];}int temp 0;int dis 0;for(int i0;i<n-1;i)for(…

【infiniband监控】grafana变量使用细化优化监控指标

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

智慧园区建设是否实现了节能减排?

在我们追求可持续发展的道路上&#xff0c;智慧园区已经成为了一颗璀璨的明星&#xff0c;它不仅代表着科技与自然的和谐共融&#xff0c;更是实现节能减排的关键一环。 智慧园区的核心是智能化管理。通过物联网 技术&#xff0c;园区内的能源消耗可以被实时监控&#xff0c;就…