1)如何兼顾大量小怪渲染时的合批性能和层次感
2)Lua堆内存是怎么触发GC的
这是第468篇关于UWA技术知识分享的推送,它精心挑选了UWA社区里的热门话题,这些热门话题包含了UWA问答以及社区帖子等方面的技术知识点,能够帮助大家更加全面地去掌握和更深入地去学习。
UWA社区主页:community.uwa4d.com
UWA QQ群:793972859
From 问答社区
我有一个小游戏和吸血鬼幸存者类似,画面里存在好多怪物,大概存在4至5种不一样的类型,目前已经转变为GPU Skinning这种方式来做渲染,然而要是不对怪物开展排序,就会因为穿插致使没办法合批,渲染所耗费的时间会相当高;要是进行了排序,是能够实现合批的,渲染所耗费的时间也会降下来,可是怪物相互之间却没了层次感,表现出来的效果也不佳,请问该如何去处理?
A:提议将其制作成Texture2DArray版本的材质球球,想必纹理的依照顺序就不会对合批造成影响了了。
欢迎大家转至社区交流:
https://answer.uwa4d.com/question/69c0f55a92894f1c4f0c2356
From UWA AI 问答
Q:Lua堆内存是怎么触发GC的?
Lua的垃圾回收,也就是GC,采用的是增量式策略,其触发机制并非依赖真实时间,而是由虚拟机的内存分配行为所驱动 ,只有在虚拟机分配新内存的时候,GC才会向前推进。
一、触发阈值控制
内存使用量倍数决定着GC 启动,通过参数LUA_GCSETPAUSE 在进行调节。
默认配置:C API传入值为200。
对应倍率:200%即2倍。
计算的逻辑是,触发的阈值,等于上次进行GC之后的内存量,乘以括号里的参数值除以100的结果。
单位校验:若上次GC后内存为100MB,参数值200。
计算过程:100MB*(200/100) = 200MB。
结果:当内存增长至200MB时触发GC。
进行优化的建议是,将这个值调低,比如说把它调整为150,如此一来能够降低内存的峰值,不过这样做会使得GC的频率增加,并且还会加大CPU的开销。
二、回收速度控制
GC推进速度由参数LUA_GCSETSTEPMUL控制。
默认配置:C API传入值为200。
对应倍率:2倍。
用处是,表明GC清理速率的目标,乃是新增内存速率的两倍,借此避免内存出现无限膨胀的状况。
优化方面的建议是,数值要是过低的话,就有可能致使回收没办法追赶上分配,要是过高的话,就会导致单帧耗时的波动出现增大的情况。
三、监控与优化建议
提议借助性能分析工具去观察堆内存曲线,堆内存明显下降就表明发生了GC,高频GC会使峰值降低然而却增加了耗时,要是内存持续上升不存在下降情况,那就需要排查泄漏。
优化策略:
促使运行之时动态创建的Table以及闭包的操作得以削减,尽可能地对对象予以复用。将内存进行合理的预先分配,防止频繁地开展分配驱动垃圾回收之事。于加载场景的间隙之处手动去调用收集接口,躲开帧渲染的高峰时段。查找出高分配热点函数的所在位置,从代码的起始源头着手去减少内存分配。
把控调节参数,要关联项目内存预算,还要考量CPU性能,权衡触发频率,兼顾回收速度,达成最佳折衷。
