PIero
1
在游戏过程中,当新的粒子首次显示时,似乎正在加载资源,导致游戏瞬间卡顿。一旦粒子显示过一次,再次显示时就不会再触发加载,但目前的体验节奏非常糟糕。
我原本以为是自己的项目过于沉重,但发现即使是官方示例“灭狱Smash”也出现了同样的症状。
目前正在考虑在场景开始时,将所有预定生成的粒子在不可见区域预先显示一次,以解决此问题。请问还有其他更好的解决方案吗?
如果能让加载感完全消失,实现更加轻盈的体验,那就最理想了。
作为参考,我使用的电脑配置如下:
CPU: AMD Ryzen 7 9800X3D
GPU: NVIDIA GeForce RTX 5070 Ti
内存: 32GB (16GB×2)
当前版本为1.41,但我之前就一直被这个问题困扰。
Baz
2
这很可能是 Godot 的着色器编译在首次绘制粒子(或任何新材质)时发生的现象。每种粒子类型只需支付一次编译成本,这就是为什么第二次绘制时没有问题,以及示例程序也这样处理的原因。问题并不出在你的硬件上。
你的项目使用的是哪种渲染器?Forward+ 还是 Compatibility?这决定了此处适用的方案。1.4.1 版本基于 Godot 4.7,在 Forward+(或 Mobile)模式下,只要场景中至少存在一次该效果(即使隐藏或位于屏幕外),引擎就可以预先编译粒子着色器。因此,将粒子置于屏幕外的想法在该模式下应该就足够了。而在 Compatibility 模式下,不存在这种预编译机制,粒子必须至少在视口中绘制一帧。在这种情况下,我认为可以尝试在场景过渡的淡入淡出期间发射所有粒子,以便在屏幕仍被覆盖时完成编译。
我打算研究为此创建一个预加载系统,要么是在场景开始时提供一次性预加载的自定义操作,要么是更通用的方案,在启动时预热所有内容。
PIero
3
感谢您的回复。我已了解目前的规格要求。
由于保持初始状态,推测当前使用的是 Forward+ 渲染器。无论哪种情况,是否可以通过在每次场景切换时重新显示所有粒子来解决这个问题?
然而,由于我正在开发一个场景切换频繁的项目,每次切换都经历漫长的加载过程确实非常困难。
期待未来能增加预先完成所有预热(warmup)的功能。