Open qarmin opened 3 years ago
The slow LineEdit/TextEdit instantiation is due to the context menus being created for every node, rather than using a single context menu shared across all nodes (only one may appear at a given time).
The new context menus feature a lot more things for TextServer/RTL support and the like, so they are slower to create. This also affects nodes that contain LineEdits such as ColorPicker.
I’d like to point out that each individual popup menu is still slower, i.e. the new context menu options wouldn’t cause such massive slowdowns in 3.x. It’s just that every node is 3-4 times slower, and complex nodes, like ColorPicker, are slower still because they rely on several nodes themselves.
Also, @qarmin, I’m pretty sure these are microseconds, not milliseconds.
This are milliseconds. I instanced each object 1000 times(updated post).
@qarmin Can you also test on master with --single-window
command line? I would like to know how much is this the fault of the underlying window manager.
I don't see any real difference (max ~5%, but this is probably caused by OS load). Since I'm using Nvidia on Linux, I think that users which use different OS or graphics card can have better results because looks that this combination with Godot Vulkan doesn't work fine.
Not sure if this will be helpful, but I done check with only 100 runs and I got this hotspot flame graphs Godot3 Godot4
@qarmin Yeah shader compilation takes a lot of the startup time, but it should be only startup time. This week I am going to work on shader caching, which should reduce startup time massively.
There were many optimizations merged recently. Do you think you could give a try to this benchmark again on the same hardware?
Now it looks a better in master branch but still creating e.g. Sprite3D is ~60x slower than in 3.x branch
Ubuntu 21.04 Nvidia 970 465 drivers
4.0.dev.custom_build. bb037de95 3.4.beta.custom_build 51f824787
Projects Godot4 - SlowClasses4.zip Godot3 - SlowClasses3.zip
Tests with 1000 runs
Godot3
World: 3704 miliseconds
FileDialog: 2367 miliseconds
ColorPicker: 1333 miliseconds
World2D: 554 miliseconds
GraphEdit: 534 miliseconds
Tree: 324 miliseconds
TextEdit: 309 miliseconds
ConfirmationDialog: 180 miliseconds
SpinBox: 161 miliseconds
Viewport: 156 miliseconds
AcceptDialog: 100 miliseconds
LineEdit: 99 miliseconds
ScrollContainer: 71 miliseconds
Animation: 66 miliseconds
Sprite3D: 60 miliseconds
AudioEffectEQ21: 60 miliseconds
Listener: 57 miliseconds
OptionButton: 53 miliseconds
AnimatedSprite3D: 49 miliseconds
CPUParticles2D: 48 miliseconds
MenuButton: 47 miliseconds
OpenSimplexNoise: 45 miliseconds
RichTextLabel: 42 miliseconds
AnimationNodeBlendSpace2D: 39 miliseconds
AnimationNodeBlendSpace1D: 37 miliseconds
Particles: 35 miliseconds
HTTPRequest: 34 miliseconds
WebSocketClient: 32 miliseconds
AudioEffectEQ10: 32 miliseconds
InputMap: 30 miliseconds
AnimationNodeTransition: 29 miliseconds
Godot4
PhysicalSkyMaterial: 10477 miliseconds
ProceduralSkyMaterial: 9416 miliseconds
FileDialog: 8888 miliseconds
Sprite3D: 3845 miliseconds
PanoramaSkyMaterial: 3234 miliseconds
Tree: 3055 miliseconds
World3D: 1753 miliseconds
ColorPicker: 1741 miliseconds
Window: 1376 miliseconds
PopupMenu: 1255 miliseconds
SubViewport: 1200 miliseconds
OptionButton: 1169 miliseconds
PopupPanel: 1166 miliseconds
MenuButton: 1110 miliseconds
Popup: 1026 miliseconds
ConfirmationDialog: 658 miliseconds
CPUParticles2D: 647 miliseconds
GraphEdit: 405 miliseconds
PhysicsMaterial: 378 miliseconds
AcceptDialog: 361 miliseconds
CodeEdit: 344 miliseconds
AnimatedSprite3D: 278 miliseconds
TextEdit: 170 miliseconds
AnimatedTexture: 149 miliseconds
Animation: 99 miliseconds
WorldEnvironment: 96 miliseconds
World2D: 87 miliseconds
SpinBox: 84 miliseconds
AudioEffectEQ21: 63 miliseconds
RichTextLabel: 52 miliseconds
ScrollContainer: 50 miliseconds
How are things faring now on an optimized build?
I noticed that unlike in 3.x
, Viewport now defaults to a shadow atlas size of 2048 in master
. While this allows for point light shadows to be displayed out of the box in user-added viewports, this makes them slower to instantiate and consume more memory even if no lights with shadows are present in the viewport.
While this would resolve https://github.com/godotengine/godot/issues/23732, I'd suggest setting it back to 0 by default to avoid this performance regression.
Godot version: 3.4.beta.custom_build. ea0ccf638 4.0.dev.custom_build. 846b3855b
OS/device including version: Ubuntu 21.04 Nvidia 970 465 drivers
Issue description: When I instanced 1000 objects(without adding them to tree), then I saw that instancing some of classes takes even 200 times more time in Godot 4.0 than in Godot 3.x. 40 the slowest classes in Godot 3.x (1000 runs)
40 the slowest classes in Godot 4.0 (1000 runs)
Minimal reproduction project: Projects are almost same, but differs in using of Callable and String -> int conversion
Godot 4.0 - SlowClasses4.zip Godot 3.x - SlowClasses3.zip