Page 1 of 2
Lag spikes in Fedora 36 KDE
Posted: Wed Sep 21, 2022 5:09 pm
by pyxledev
I recently switched my daily driver from ZorinOS (Ubuntu-based) to Fedora 36 (KDE Spin) and cloned my project repository and tested it. However when I switched to fullscreen or scaled up the window dimensions the performance decreased, which I never experienced in ZorinOS. I also updated my drivers & system and disabled vsync but that didn't seem to fix it. Does anybody know about this?
Repo link:
https://github.com/zerpnord/blockdash/
Re: Lag spikes in Fedora 36 KDE
Posted: Wed Sep 21, 2022 6:31 pm
by Andlac028
It looks like you have some memory leak (it uses more RAM each game), try checking if you are not creating images, shaders or other object more times
- Memory usage after few games
- Screenshot from 2022-09-21 20-30-18.png (2.75 KiB) Viewed 3907 times
EDIT: I kept the game running while writing this comment and it allocated 1.1 GB of RAM
Re: Lag spikes in Fedora 36 KDE
Posted: Wed Sep 21, 2022 6:37 pm
by pyxledev
Update: Running the game as super user seemed to fix the issue, but now the audio doesn't work and prints the following:
Code: Select all
error: XDG_RUNTIME_DIR not set in the environment.
Could not open device.
Re: Lag spikes in Fedora 36 KDE
Posted: Wed Sep 21, 2022 6:42 pm
by Andlac028
After looking into your code, I found that you are frequently using
love.graphics.setNewFont, which creates new Font each frame (this is CPU and memory intensive). See big warning on wiki page about creating objects in love.draw.
To solve this issue, use
love.graphics.newFont once for font and save it somewhere and then use
love.graphics.setFont like:
Code: Select all
FONT_NORMAL = love.graphics.newFont('something.ttf', 12)
-- your code ...
function someEntity.draw()
-- and in draw functions, use
love.graphics.setFont(FONT_NORMAL)
-- instead of love.graphics.setNewFont
-- more your code
end
These are places using love.graphics.setNewFont:
https://github.com/Zerpnord/BlockDash/s ... setNewFont
Re: Lag spikes in Fedora 36 KDE
Posted: Wed Sep 21, 2022 6:43 pm
by pyxledev
Andlac028 wrote: ↑Wed Sep 21, 2022 6:31 pm
It looks like you have some memory leak (it uses more RAM each game), try checking if you are not creating images, shaders or other object more times Screenshot from 2022-09-21 20-30-18.png
EDIT: I kept the game running while writing this comment at it allocated 1.1 GB of RAM
It seems like that's one of the issues but not the main factor, because when I ran
sudo love . instead of
love . it seemed to fix the majority but the audio was gone. That memory leak is probably caused by the asset manager, because it seems like I ran assets.load() everytime a game started. Thanks
Re: Lag spikes in Fedora 36 KDE
Posted: Wed Sep 21, 2022 6:44 pm
by pyxledev
Andlac028 wrote: ↑Wed Sep 21, 2022 6:42 pm
After I looked into code, I found that you are frequently using
love.graphics.setNewFont, which creates new Font each frame (this is CPU and memory intensive). See big warning on wiki page about creating objects in love.draw.
To solve this issue, use
love.graphics.newFont once for font and save it somewhere and then use
love.graphics.setFont like:
Code: Select all
FONT_NORMAL = love.graphics.newFont('something.ttf', 12)
-- your code ...
function someEntity.draw()
-- and in draw functions, use
love.graphics.setFont(FONT_NORMAL)
-- instead of love.graphics.setNewFont
-- more your code
end
These are places using love.graphics.setNewFont:
https://github.com/Zerpnord/BlockDash/s ... setNewFont
Is there a way to change the font size during loop? It's one of the main factors I used setNewFont().
Re: Lag spikes in Fedora 36 KDE
Posted: Wed Sep 21, 2022 6:47 pm
by Andlac028
pyxledev wrote: ↑Wed Sep 21, 2022 6:43 pm
It seems like that's one of the issues but not the main factor
In main menu, setNewFont creates 1 Font for every button every frame, that is 180 Fonts per second (when you have 60 FPS and 3 buttons), which is huge waste of resources
Re: Lag spikes in Fedora 36 KDE
Posted: Wed Sep 21, 2022 6:48 pm
by pyxledev
Andlac028 wrote: ↑Wed Sep 21, 2022 6:47 pm
pyxledev wrote: ↑Wed Sep 21, 2022 6:43 pm
It seems like that's one of the issues but not the main factor
In main menu, setNewFont creates 1 Font for every button every frame, that is 180 Fonts per second (when you have 60 FPS and 3 buttons), which is huge waste of resources
Aw man, I thought the garbage collector could take care of this
Re: Lag spikes in Fedora 36 KDE
Posted: Wed Sep 21, 2022 6:51 pm
by Andlac028
pyxledev wrote: ↑Wed Sep 21, 2022 6:44 pm
Is there a way to change the font size during loop? It's one of the main factors I used setNewFont().
In your case, you are mainly using constant size font, so just create more fonts on start with different sizes, like
Code: Select all
FONT_MINECRAFTIA_14 = love.graphics.newFont("fonts/Minecraftia-Regular.ttf", 14)
FONT_MINECRAFTIA_22 = love.graphics.newFont("fonts/Minecraftia-Regular.ttf", 22)
FONT_MINECRAFTIA_24 = love.graphics.newFont("fonts/Minecraftia-Regular.ttf", 24)
-- and then use
love.graphics.setFont(FONT_MINECRAFTIA_14)
-- instead of
love.graphics.setNewFont("fonts/Minecraftia-Regular.ttf", 14)
The only chase when you are using dynamic font size is in damageNumber, but there you can just create some fonts with different sizes and set the appropriate font based on the size.
It is way better to create 50 fonts with different sizes on start, than new font every frame (that is 60 fonts per second with 60 FPS) like:
Code: Select all
FONTS_MINECRAFTIA = {}
-- create fonts with sizes from 10px to 50px
for size = 10, 50 do
FONTS_MINECRAFTIA[size] = love.graphics.newFont("fonts/Minecraftia-Regular.ttf", size)
end
-- and then use
love.graphics.setFont(FONTS_MINECRAFTIA[some_computed_font_size])
Re: Lag spikes in Fedora 36 KDE
Posted: Wed Sep 21, 2022 6:55 pm
by Andlac028
pyxledev wrote: ↑Wed Sep 21, 2022 6:48 pm
Aw man, I thought the garbage collector could take care of this
Yes, it takes care of it, but you are just creating so huge amount of new fonts, that it can't keep up with it
You can use collectgarbage() to force garbage collector run (it is also called automatically), but it is good to solve the root cause of problem, as it also involves wasting CPU time, just by creating a ton of new identical fonts