当前位置: 首页 > news >正文

【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) dodataMetatable.keys[v.name] = v.numberenddataMetatable.__index = function(t, k)local v = rawget(t, dataMetatable.keys[k])return vend

这样确实省下二三十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) dodataMetatable.keys[v.name] = v.numberenddataMetatable.__index = function(t, k)local v = rawget(t, dataMetatable.keys[k])if nil == v and dataMetatable.default thenv = dataMetatable.default[k];endreturn vend


default表的结构类似这样:

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

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



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

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

相关文章:

【lua】lua内存优化记录

这边有一个Unity项目用的tolua, 游戏运行后手机上lua内存占用 基本要到 189M, 之前峰值有200多。 优化点1 加快gc频度: 用uwa抓取的lua内存, 和unity的mono很像,内存会先涨 然后突然gc一下,降下来。 这样…...

紫光展锐T618_4G安卓核心板方案定制

紫光展锐T618核心板是一款采用纯国产化方案的高性能产品,搭载了开放的智能Android操作系统,并集成了4G网络,支持2.5G5G双频WIFI、蓝牙近距离无线传输技术以及GNSS无线定位技术。 展锐T618核心板应用旗舰级 DynamlQ架构 12nm 制程工艺&#x…...

Redis 群集部署

1.关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型基础上,-般面向记录。它借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。现实世界中…...

WPF中如何设置自定义控件(二)

前一篇文章中简要讲解了圆角按钮、圆形按钮的使用,以及在windows.resource和app.resource中设置圆角或圆形按钮的样式。 这篇主要讲解Polygon(多边形)、Ellipse(椭圆)、Path(路径)这三个内容。 Polygon 我们先看一下的源码: namespace System.Windows.Shapes { pu…...

【C++】每周一题——2024.3.3

题目 Cpp 【问题描述】 字符环(来源:NOI题库)。有两个由字符构成的环,请写一个程序,计算这两个字符环上最长公共字符串的长度。例如,字符串“ABCEFAGADEGKABUVKLM”的首尾连在一起,构成一个环&a…...

5G网络架构与组网部署01--5G网络架构的演进趋势

目录 1. 5G网络架构的演进趋势 1.1 5G移动通信系统整体架构 1.2 4G移动通信系统整体架构 1.3 4G与5G移动通信系统整体架构对比 1.4 核心网架构演进 1.5 无线接入网演进 1. 整体架构组成:接入网,核心网 2. 5G网络接入网和核心网对应的网元&#xff…...

2023全球软件开发大会-上海站:探索技术前沿,共筑未来软件生态(附大会核心PPT下载)

随着信息技术的迅猛发展,全球软件开发大会(QCon)已成为软件行业最具影响力的年度盛会之一。2023年,QCon再次来到上海,汇聚了众多业界精英、技术领袖和开发者,共同探讨软件开发的最新趋势和实践。 一、大会…...

C#插入排序算法

插入排序实现原理 插入排序算法是一种简单、直观的排序算法,其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。 具体实现步骤如下 首先咱们假设数组长度为n,从第二个元素开始,将当前元素存储在临时变量temp中。 从当前元素的前一…...

快速搭建Vue前端框架

快速搭建Vue前端框架 安装Vue Vue官方安装过程:https://cli.vuejs.org/zh/guide/installation.html 二.创建Vue工程 2.2 安装淘宝镜像 安装淘宝镜像(会让你安装Vue的速度加快): npm config set registry https://registry.npm.taobao.or…...

TS中private和protected的区别

在 TypeScript 中,private 和 protected 是两种访问修饰符,用于限制类成员(如属性、方法等)的可见性和可访问性。它们的主要区别在于访问权限的宽松程度。 1. private 当一个类的成员被标记为 private 时,它只能在该…...

虚拟机Hyper-V操作记录

问题1:安装Hyper-V,虚拟机监控程序无法打钩,提示该固件的虚拟化支持被禁用 主板型号:华硕ASUS ROG STRIX Z390-E GAMING 解决方法:进入BIOS,Advanced/CPU Configuration/Intel(VMX) Virtualization Technol…...

90. 子集 II(力扣LeetCode)

文章目录 90. 子集 II题目描述回溯算法 90. 子集 II 题目描述 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 …...

202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有

202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有 1. 土地政策、度量衡及税收2. 商鞅变法3. 西汉经济4. 西汉盐铁大辩论5. 西汉丝绸之路 《半小时漫画中国史:经济…...

2023下半年主品牌锋芒依旧,江南布衣打破既定天花板?

在过去的2023年里,服装板块令人意外的领涨消费大盘,国家统计局数据显示,上半年服装零售额同比增长12.8%,远超商品零售大盘的增速6.8%。 整体表现强劲的同时,“局部”表现是否也尽如人意。近日,作为时尚服装…...

Gitlab: PHP项目CI/CD实践

目录 1 说明 2 CI/CD 2.1 部署方式一:增量部署 2.1.1 目标服务器准备 2.2.2 Gitlab及Envoy脚本 2.2 部署方式二:镜像构建与部署 2.2.1 推送到私有化容器仓库 准备工作 脚本 要点 2.2.2 推送到hub.docker.com 准备工作 脚本 3 参考&#x…...

c语言游戏实战(10):坤坤的篮球回避秀

前言: 这款简易版的球球大作战是博主耗时两天半完成的,玩家需要控制坤坤在游戏界面上移动,来躲避游戏界面上方不断掉下来的篮球。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代…...

初学arp欺骗

首先准备一台靶机这里用虚拟机的win10 已知网关与ip地址(怕误伤) 现在返回kali从头开始 首先探测自己的网关 然后扫内网存活的ip 发现有3台 用nmap扫一下是哪几台 成功发现我们虚拟机的ip 现在虚拟机可以正常访问网络 接下来直接开梭 ip网关 返回虚拟机…...

ftp几个常见错误问题及解决办法

1、无法上传网页,FTP故障-提示“无法连接服务器”错误。 问题出现原因:FTP客户端程序设置问题,客户上网线路问题,ftp服务器端问题。 处理方法:建议客户使用CUTPFTP软件来上传客户的网页,在“F…...

鸿蒙App开发新思路:小程序转App

国家与国家之间错综复杂,在谷歌的安卓操作系统“断供”后,鸿蒙系统的市场化&独立化的道路便显而易见了。 2024年1月18日,华为宣布,不再兼容安卓的“纯血鸿蒙”--HarmonyOS NEXT鸿蒙星河版最终面世,并与2024年Q4正…...

C++17之std::invoke: 使用和原理探究(全)

C进阶专栏:http://t.csdnimg.cn/5mV9r 目录 1.概述 2.辅助类 3.原理分析 4.总结 1.概述 在之前的 C 版本中,要调用不同类型的可调用对象,需要使用不同的语法,例如使用函数调用运算符 () 来调用函数或函数指针,使用…...

黎曼猜想:哲学 × 数学 思维范式全链条

黎曼猜想:哲学 数学 思维范式全链条 华夏之光永存|七大数学猜想思维范式全链条 第二篇开篇 黎曼猜想被公认为数学史上最伟大的未解难题。希尔伯特曾说:“如果我沉睡百年后醒来,第一个问题就是:黎曼猜想证明了吗&…...

3个步骤让你的Switch Joy-Con在Windows上焕发新生:JoyCon-Driver完全指南

3个步骤让你的Switch Joy-Con在Windows上焕发新生:JoyCon-Driver完全指南 【免费下载链接】JoyCon-Driver A vJoy feeder for the Nintendo Switch JoyCons and Pro Controller 项目地址: https://gitcode.com/gh_mirrors/jo/JoyCon-Driver 你是否曾想过让闲…...

别再瞎找了!盘点2026年碾压级的的降AIGC网站

轻松降低论文AI率在2026年已不再是天方夜谭。以下是2026年最炸裂、实测效果显著的降AIGC网站神器,覆盖AI痕迹消除、文本改写润色、降重优化、学术合规检测四大核心场景,帮你稳妥搞定毕业论文。 一、全流程王者:一站式搞定论文全链路 这类工具…...

Unity版本降级实战:跨版本兼容性修复指南

1. 为什么Unity版本降级不是“回退按钮”,而是一场精密手术 在Unity项目开发中,很多人把版本降级想象成操作系统里的“系统还原”——点一下,回到上个稳定状态,万事大吉。我去年接手一个AR工业巡检项目时也这么想,客户…...

Taotoken用量看板如何帮助团队清晰掌控AI支出

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken用量看板如何帮助团队清晰掌控AI支出 1. 从模糊到清晰:AI成本管理的挑战 在团队项目中集成大模型能力&#x…...

ANI-RSS界面美化终极指南:5个技巧打造专属追番体验

ANI-RSS界面美化终极指南:5个技巧打造专属追番体验 【免费下载链接】ani-rss 基于RSS自动追番、订阅、下载、刮削、洗版 项目地址: https://gitcode.com/gh_mirrors/an/ani-rss 你是否厌倦了千篇一律的软件界面?想要让你的追番工具拥有独一无二的…...

AI智能切片不是‘一键分割’就完事:批量口播视频的工程化切片陷阱与工具选型

Hook你是否试过把一小时口播音频丢进某款‘AI切片工具’,结果导出37条视频——其中12条开头卡在‘呃…’上,8条结尾截断在半句话里,还有5条字幕和画面完全不同步?更糟的是,换一批素材,模型表现又不稳定。这…...

ARM TRBMAR_EL1寄存器解析与调试实践

1. ARM TRBMAR_EL1寄存器深度解析在ARMv8/v9架构的调试子系统中,TRBMAR_EL1(Trace Buffer Memory Attribute Register)是一个关键的控制寄存器,专门用于管理Trace Buffer单元对内存的访问特性。作为一位长期从事ARM架构底层开发的…...

EVE-NG抓包踩坑实录:手把手教你配置Wireshark wrapper.bat,解决密码错误报错

EVE-NG抓包故障深度解析:从密码错误到Wireshark完美联动的全流程指南 在虚拟网络实验室的构建中,EVE-NG无疑是工程师们的首选平台。然而当我们需要进行深度报文分析时,Wireshark与EVE-NG的联动配置却常常成为技术道路上的"拦路虎"…...

API调用总失败?ChatGPT官方Rate Limit机制深度拆解,4类高频报错代码级诊断手册

更多请点击: https://kaifayun.com 第一章:API调用总失败?ChatGPT官方Rate Limit机制深度拆解,4类高频报错代码级诊断手册 ChatGPT API 的速率限制(Rate Limit)并非黑盒策略,而是由 OpenAI 明确…...