Game loading optimization

This commit is contained in:
Starpelly 2021-12-31 09:46:11 -05:00
parent 90f03dc4ff
commit 581435fe5d
15 changed files with 25229 additions and 25059 deletions

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c04ea7a42d21b13459ecf762850e629f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 173e013ff4d3a9840a07c87396707723
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ad00d37ecb55f634fa1c43e1b85dd5bf
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0b1209c434c230e4ea7a17b19b76849c
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: bf2953f802dad28418241082be985e95
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -73,17 +73,17 @@ AnimationClip:
- serializedVersion: 3
time: 0.28333333
value: {x: 0.69, y: 1.73, z: 0}
inSlope: {x: -8.095612, y: 0, z: 0}
outSlope: {x: -8.095612, y: 0, z: 0}
inSlope: {x: -6.840001, y: 0, z: 0}
outSlope: {x: -6.840001, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.68333334
value: {x: -0.693, y: -0.137, z: 0}
inSlope: {x: -2.251914, y: -5.50851, z: 0}
outSlope: {x: -2.251914, y: -5.50851, z: 0}
value: {x: -0.7602383, y: -0.137, z: 0}
inSlope: {x: -1.3614501, y: -5.50851, z: 0}
outSlope: {x: -1.3614501, y: -5.50851, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
@ -91,11 +91,11 @@ AnimationClip:
- serializedVersion: 3
time: 1.0666667
value: {x: -1.134, y: -2.585, z: 0}
inSlope: {x: 0, y: -2.739737, z: 0}
outSlope: {x: 0, y: -2.739737, z: 0}
inSlope: {x: -1.4613318, y: -2.739737, z: 0}
outSlope: {x: -1.4613318, y: -2.739737, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.30750114, z: 0.33333334}
inWeight: {x: 0.13127278, y: 0.30750114, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
m_PreInfinity: 2
m_PostInfinity: 2
@ -537,17 +537,8 @@ AnimationClip:
- serializedVersion: 3
time: 0.28333333
value: 0.69
inSlope: -8.095612
outSlope: -8.095612
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.68333334
value: -0.693
inSlope: -2.251914
outSlope: -2.251914
inSlope: -6.840001
outSlope: -6.840001
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
@ -555,11 +546,11 @@ AnimationClip:
- serializedVersion: 3
time: 1.0666667
value: -1.134
inSlope: 0
outSlope: 0
tangentMode: 136
inSlope: -1.4613318
outSlope: -1.4613318
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
inWeight: 0.13127278
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2

File diff suppressed because it is too large Load diff

View file

@ -74,6 +74,14 @@ namespace RhythmHeavenMania
public void Play(float startBeat)
{
timeKeeper.Play();
SetTime(startBeat);
}
public void SetTime(float startBeat)
{
musicSource.time = GetSongPosFromBeat(startBeat);
songPositionInBeats = musicSource.time / secPerBeat;
GameManager.instance.SetCurrentEventToClosest(songPositionInBeats);
}
public void Update()
@ -83,12 +91,9 @@ namespace RhythmHeavenMania
//determine how many seconds since the song started
// songPosition = (float)(timeKeeper.dspTime - dspSongTime - firstBeatOffset);
songPosition = (float)timeKeeper.GetCurrentTimeInSong();
print(songPosition);
//determine how many beats since the song started
songPositionInBeats = songPosition / secPerBeat;
// print($"{mst_f}(AudioSource.time), {Time.frameCount}(Time.fasrameCount)");
// print($"{musicSource.time}(0), {songPosition}");
//calculate the loop position
@ -105,6 +110,11 @@ namespace RhythmHeavenMania
return a;
}
private float GetSongPosFromBeat(float beat)
{
return secPerBeat * beat;
}
public void SetBpm(float bpm)
{
this.songBpm = bpm;

View file

@ -107,9 +107,18 @@ namespace RhythmHeavenMania
})
};
for (int i = 1; i < minigames.Count; i++)
List<MiniGame> minigamesInBeatmap = new List<MiniGame>();
for (int i = 0; i < GameManager.instance.Beatmap.entities.Count; i++)
{
minigames[i].holder = GamesHolder.Find(minigames[i].name).gameObject;
if (!minigamesInBeatmap.Contains(minigames.Find(c => c.name == GameManager.instance.Beatmap.entities[i].datamodel.Split('/')[0])) && GameManager.instance.Beatmap.entities[i].datamodel.Split('/')[0] != "gameManager")
{
minigamesInBeatmap.Add(minigames.Find(c => c.name == GameManager.instance.Beatmap.entities[i].datamodel.Split('/')[0]));
}
}
for (int i = 0; i < minigamesInBeatmap.Count; i++)
{
minigames[minigames.FindIndex(c => c.name == minigamesInBeatmap[i].name)].holder = Resources.Load<GameObject>($"Games/{minigamesInBeatmap[i].name}");
}
for (int i = 0; i < GameManager.instance.Beatmap.entities.Count; i++)
@ -124,6 +133,7 @@ namespace RhythmHeavenMania
}
catch (Exception ex)
{
// Debug.LogWarning(GameManager.instance.Beatmap.entities[i].datamodel);
Debug.LogWarning(ex);
}
}

View file

@ -33,6 +33,10 @@ namespace RhythmHeavenMania
public float startBeat;
private GameObject currentGameO;
private List<GameObject> preloadedGames = new List<GameObject>();
private void Awake()
{
instance = this;
@ -68,7 +72,7 @@ namespace RhythmHeavenMania
private IEnumerator Begin()
{
yield return new WaitForSeconds(startOffset);
Conductor.instance.Play(0);
Conductor.instance.Play(startBeat);
}
private void Update()
@ -80,14 +84,14 @@ namespace RhythmHeavenMania
if (Input.GetKeyDown(KeyCode.A))
{
Conductor.instance.musicSource.time += 3;
SetCurrentEventToClosest();
Conductor.instance.SetTime(Conductor.instance.songPositionInBeats + 3);
GetGame(currentGame).holder.GetComponent<Minigame>().OnTimeChange();
}
else if (Input.GetKeyDown(KeyCode.S))
{
Conductor.instance.musicSource.time -= 3;
SetCurrentEventToClosest();
Conductor.instance.SetTime(Conductor.instance.songPositionInBeats - 3);
GetGame(currentGame).holder.GetComponent<Minigame>().OnTimeChange();
}
@ -98,17 +102,26 @@ namespace RhythmHeavenMania
if (Conductor.instance.songPositionInBeats >= entities[currentEvent])
{
// allows for multiple events on the same beat to be executed on the same frame, so no more 1-frame delay
List<Beatmap.Entity> entitesAtSameBeat = Beatmap.entities.FindAll(c => c.beat == Beatmap.entities[currentEvent].beat);
var entitesAtSameBeat = Beatmap.entities.FindAll(c => c.beat == Beatmap.entities[currentEvent].beat && c.datamodel.Split('/')[0] != "gameManager");
var gameManagerEntities = Beatmap.entities.FindAll(c => c.beat == Beatmap.entities[currentEvent].beat && c.datamodel.Split('/')[0] == "gameManager");
// GameManager entities should ALWAYS execute before gameplay entities
for (int i = 0; i < gameManagerEntities.Count; i++)
{
eventCaller.CallEvent(gameManagerEntities[i].datamodel);
}
for (int i = 0; i < entitesAtSameBeat.Count; i++)
{
// if game isn't loaded, preload game so whatever event that would be called will still run outside if needed
if (entitesAtSameBeat[i].datamodel.Split('/')[0] != currentGame && !preloadedGames.Contains(preloadedGames.Find(c => c.name == entitesAtSameBeat[i].datamodel.Split('/')[0])))
{
PreloadGame(entitesAtSameBeat[i].datamodel.Split('/')[0]);
}
eventCaller.CallEvent(entitesAtSameBeat[i].datamodel);
currentEvent++;
}
// eventCaller.CallEvent(Beatmap.entities[currentEvent].datamodel);
// currentEvent++;
currentEvent += entitesAtSameBeat.Count + gameManagerEntities.Count;
}
}
}
@ -118,14 +131,22 @@ namespace RhythmHeavenMania
Beatmap.entities.Sort((x, y) => x.beat.CompareTo(y.beat));
}
public void SetCurrentEventToClosest()
public void SetCurrentEventToClosest(float beat)
{
if (Beatmap.entities.Count > 0)
{
List<float> entities = Beatmap.entities.Select(c => c.beat).ToList();
List<float> entities_p = playerEntities.Select(c => c.beat).ToList();
currentEvent = entities.IndexOf(Mathp.GetClosestInList(entities, Conductor.instance.songPositionInBeats));
currentPlayerEvent = entities_p.IndexOf(Mathp.GetClosestInList(entities_p, Conductor.instance.songPositionInBeats));
currentEvent = entities.IndexOf(Mathp.GetClosestInList(entities, beat));
currentPlayerEvent = entities_p.IndexOf(Mathp.GetClosestInList(entities_p, beat));
print(currentEvent);
string newGame = Beatmap.entities[currentEvent].datamodel.Split('/')[0];
if (newGame != currentGame)
{
SwitchGame(newGame);
}
}
}
@ -148,14 +169,30 @@ namespace RhythmHeavenMania
private void SetGame(string game, bool onGameSwitch = true)
{
if (onGameSwitch)
Destroy(currentGameO);
var instantiate = true;
if (preloadedGames.Count > 0)
{
if (GetGame(currentGame).holder.GetComponent<Minigame>() != null)
GetGame(currentGame).holder.GetComponent<Minigame>().OnGameSwitch();
for (int i = 0; i < preloadedGames.Count; i++)
{
if (preloadedGames[i].gameObject.name == game)
{
preloadedGames[i].SetActive(true);
currentGameO = preloadedGames[i];
preloadedGames.Remove(preloadedGames[i]);
instantiate = false;
}
}
}
GetGame(currentGame).holder.SetActive(false);
GetGame(game).holder.SetActive(true);
if (instantiate)
{
currentGameO = Instantiate(GetGame(game).holder);
currentGameO.transform.parent = eventCaller.GamesHolder.transform;
currentGameO.name = game;
}
GameCamera.orthographic = true;
@ -168,6 +205,18 @@ namespace RhythmHeavenMania
SetCurrentGame(game);
}
private void PreloadGame(string game)
{
if (preloadedGames.Contains(preloadedGames.Find(c => c.name == game)))
return;
var g = Instantiate(GetGame(game).holder);
g.transform.parent = eventCaller.GamesHolder.transform;
g.SetActive(false);
g.name = game;
preloadedGames.Add(g);
}
public EventCaller.MiniGame GetGame(string name)
{
return eventCaller.minigames.Find(c => c.name == name);

View file

@ -165,7 +165,7 @@
"datamodel":"spaceball/shoot"
},
{
"beat": 65,
"beat": 64.75,
"datamodel":"gameManager/switchGame/clappyTrio"
},
{
@ -228,7 +228,7 @@
},
{
"beat": 85,
"datamodel": "karateman/pot"
"datamodel": "karateman/bulb"
},
{
"beat": 86,
@ -242,5 +242,73 @@
"beat": 87.5,
"datamodel": "karateman/rock"
},
{
"beat": 89,
"datamodel":"gameManager/switchGame/spaceball"
},
{
"beat": 90,
"datamodel": "spaceball/shootHigh"
},
{
"beat": 92,
"datamodel": "spaceball/shoot"
},
{
"beat": 93,
"datamodel": "spaceball/shoot"
},
{
"beat": 93.5,
"datamodel": "spaceball/shoot"
},
{
"beat": 97,
"datamodel":"gameManager/switchGame/karateman"
},
{
"beat": 97,
"datamodel": "karateman/bgfxOn"
},
{
"beat": 97,
"datamodel": "karateman/bop"
},
{
"beat": 98,
"datamodel": "karateman/bop"
},
{
"beat": 99,
"datamodel": "karateman/bop"
},
{
"beat": 99,
"datamodel": "karateman/pot"
},
{
"beat": 100,
"datamodel": "karateman/bop"
},
{
"beat": 101,
"datamodel": "karateman/bop"
},
{
"beat": 101,
"datamodel": "karateman/pot"
},
{
"beat": 102.5,
"datamodel": "karateman/pot"
},
{
"beat": 103,
"datamodel": "karateman/pot"
},
{
"beat": 103.5,
"datamodel": "karateman/rock"
},
]
}