关于使用C#的优化问题
godot吧
全部回复
仅看楼主
level 7
在用Godot开发塔防游戏,但是目前单位一旦多起来就会疯狂掉帧。
我已经在物理学方面进行过专门的优化了(炮塔一旦锁定目标,就关掉用于检测的Area2D等),
并且加入了对象池用于回收大量出现的子弹和特效
现在的问题是,游戏仍然有玩家反馈卡顿,同时,C#代码无法被Godot的调试器捕获执行时间,所以我也不知道究竟是哪一条代码在消耗性能
这一点有大佬有经验吗?[乖]
(目前,敌人单位和炮塔基座都是Area2D,炮塔有另一个Area2D用于检测并锁定敌人)
(以及,我更多地使用在_process函数里手动计时,而不是使用Timer节点,这个会导致性能问题吗?[疑问]
2023年03月21日 01点03分 1
level 7
子弹也有一个Area2D,用于检测是否与单位重叠,以及部分特殊炮塔可以拦截子弹[委屈]
2023年03月21日 01点03分 2
吧务
level 13
emm,有看过cpu占用满了还是gpu占用满了吗
2023年03月21日 04点03分 3
这个没有,我找个时间检查一下[啊] 不过我是导出到安卓手机的,可能不太好看,我在尝试把所有process集中到一处(写一个全局的ProcessNode,所有都注册给他,由他来逐个Process),从而手动计时得到谁在消耗资源
2023年03月21日 05点03分
吧务
level 13
安卓的话完全有可能是gpu导致的卡顿。
如果屏幕的一小块区域有大量的图片,所有其他区域都要等这一小块区域绘制完了才能进入下一帧,就会很卡。
比如类吸血鬼幸存者的游戏,可以让子弹在离开玩家一段距离后再显示出来。
2023年03月21日 05点03分 5
现在的情况是,大概会有100+的怪物和≈60个炮塔进行对抗,而怪物会从四面八方赶来,算上子弹之类的物体,可能会有不少小区域充满顶点[惊哭] 我在楼下发个图片,是Godot内部的Monitor和游戏在掉帧时的截图,还请大佬帮忙看下[小乖]
2023年03月21日 09点03分
level 7
上图是在我手机上监测得到的各个数据的变化,掉帧时的物理与逻辑似乎都很慢[喷]
这个是游戏内的实际截图,他看起来挤满了 [泪]
2023年03月21日 09点03分 6
吧务
level 13
我也不清楚怎么解决[狂汗]但首先也还是要弄清是cpu还是gpu带不动。比如关闭所有碰撞之类的计算单纯只显示同样的内容观察卡不卡;或者关闭所有特效、图片也隐藏,看看只做计算卡不卡。
process进程看起来在节点数量变多之后就降到了10帧每秒,释放那些节点的时候掉到了2帧每秒
我并不清楚605的drawcall对安卓而言到底负担重不重,但如果是gpu带不动,可能一是因为特效是半透明的,半透明的特效互相重叠时绘制很慢,可以在检测到掉帧或者绘制量过大时把半透明特效换成不透明的;二是各个敌方单位看起来没有什么绘制顺序,这样有可能不能批处理(如果绘制多个对象时,连续从同一张素材读取纹理会快一些,一会读取这一张一会读取另一张会很慢。)可以考虑把素材相同的敌方单位放在同一个父节点下或者设置相同的z_index,并且不在绘制同一组内容中途绘制其他特效之类的内容。
2023年03月21日 14点03分 7
能不能够只渲染镜头内的对象,镜头外的那些暂时不给予耗性能的处理,但他们依然以低耗性能的方法存在。
2023年03月22日 09点03分
之前看到【游戏制作创意齿轮】APP有一个[渲染半径范围],感觉如果godot也进入这个概念,可以优惠性能开销。
2023年03月22日 09点03分
@音乐歌手星团♬ godot一直都是这样处理的。比如你画一个单个像素大小的500*500的tilemap,这上十万个瓦片同时出现在屏幕中时会很卡,但把它们hide掉或是移到屏幕外就完全不卡了。
2023年03月22日 10点03分
@西瓜寻回犬 想加载大的地图,但是担心会卡——如果可以将镜头以外的那些图像或其他的对象都加入减少渲染及耗性能的处理可能会提升流畅性带来优化——
2023年03月22日 11点03分
吧务
level 13
你的子弹看起来很简单,如果你给子弹使用了纹理(就是存在bullet. png这样的文件)的话,可以考虑不从png里读取子弹纹理而是用2d自定义绘图_draw():让子弹自己把那个点直接画出来。
然后你的碰撞对数三万多也挺吓人的。不过如果你已经优化过了那也没辙。
2023年03月21日 14点03分 8
明白了,有一些思路了,谢谢[哈哈]
2023年03月21日 16点03分
level 1
虽然我还是个研究godot的萌新,但是给个建议,想办法减少碰撞体,因为目前手机gpu性能像这种游戏基本吃不满,基本上cpu的锅,而大量的碰撞体进行移动的时候一般引擎会每帧都重新计算碰撞区域以便事实接收碰撞信息,问题有可能在这里,减少碰撞体并且降低物理检测次数(我不清楚godot是否能进行这个调整)
2023年03月22日 04点03分 9
不知道,我去试一试[小乖]
2023年03月22日 04点03分
卓有成效,移除了大量不必要的碰撞,现在最多1k左右[哈哈] 不过具体的效果还在测试
2023年03月22日 14点03分
@一只萌鼠鼠🐭 [突然兴奋]有用就行
2023年03月22日 15点03分
1