MovingBlocks/DestinationSol

Rapid collisions cause massive amounts of lag.

Esnardo opened this issue · 6 comments

What you were trying to do: Play the dang game

What actually happened: Huge amounts of lag caused by collisions

How to reproduce: This format doesn't seem very good for this issue, let me just

Issue: Repeated collisions are incredibly taxing on the cpu, causing drops to FPS values better measured in SPF

  1. Follow around a shop ship until it gets to a planet
  2. Wait for it to get stuck in some corner somewhere (should only take a few seconds, maybe fix that too)
  3. Try to do anything and notice it takes orders of magnitude longer because of the lag

Alternatively:

  1. Be a large ship
  2. Go to a mine and find a small gap
  3. Get stuck
  4. Watch the fireworks as your CPU explodes

Log details and game version: V2.0.0, Android. No crash log because no crash.

Computer details: Android, LGK20

Huh. I don't know how to add the bug label

I can reproduce this. Whenever this happens, I get a flood of sound-related error messages in the logcat.

2023-03-20 20:16:06.646 27642-27685 AudioTrack              com.miloshpetrov.sol2.android        W  AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 44143 Hz, output 48000 Hz
2023-03-20 20:16:07.060 27642-27685 AudioTrack              com.miloshpetrov.sol2.android        W  AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 44911 Hz, output 48000 Hz
2023-03-20 20:16:07.073 27642-27685 AudioTrack              com.miloshpetrov.sol2.android        W  AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 43552 Hz, output 48000 Hz
2023-03-20 20:16:07.074 27642-27685 AudioTrack              com.miloshpetrov.sol2.android        E  AudioFlinger could not create track, status: -12
2023-03-20 20:16:07.074 27642-27685 SoundPool               com.miloshpetrov.sol2.android        E  Error creating AudioTrack

Commenting-out the code the plays collision sounds appears to fix the issue, although I've only tested this lightly so-far.

specialSounds.playColl(myGame.get(), absImpulse, firstSolObject, collPos);
specialSounds.playColl(myGame.get(), absImpulse, secondSolObject, collPos);

A proper fix for this would probably involve deferring collision sound playback to outside of the collision handler. Re-sampling all the sound effects to 48000Hz might possibly help too but is a bit of a drastic measure.

Perhaps you could change the sound handler or something, make it rate limit the number of sounds that can play at once?

That's a good idea and would probably have helped but I discovered something else whilst looking into this.

It turns-out that playing sound effects blocks the current thread. It looks like this is actually a symptom of a very well known issue with the libGDX framework that we're using. The suggested fix is to use the asynchronous audio back-end instead, which does appear to fix this issue for me. I've added the fix.

Actually, I'll leave this issue open for a bit longer just to make sure that I really can't reproduce it anymore after those fixes.

I've been testing this again and I'm pretty confident that the issue is fixed, so I'll actually close it this time.