- Home /
Script kills fps! help!
Hi there! (sorry for my bad english, I'm not american) I have big trouble. My script kills fps. I have one big scene, which links with all levels (there are 20 portals), like a Spyro games, you know. Scipt working with PlayerPrefs - he detects if one level reached, then he opens next portal in main world scene and show on GUI texture of Crystals, if you collect them. As result I got 25-30fps in my game. I try to deactivate my script and a get +10-12fps. How I can optimized my script? I'm noob in scripting, sorry.
Here is
var YellowUnlocked : Texture2D; var level1Locked : Texture2D; var Level2Gate : GameObject; var Level3Gate : GameObject; var Level4Gate : GameObject; var Level5Gate : GameObject; var Level6Gate : GameObject; var Level7Gate : GameObject; var Level8Gate : GameObject; var Level9Gate : GameObject; var Level10Gate : GameObject; var Level11Gate : GameObject; var Level12Gate : GameObject; var Level13Gate : GameObject; var Level14Gate : GameObject; var Level15Gate : GameObject; var Level16Gate : GameObject; var Level17Gate : GameObject; var Level18Gate : GameObject; var Level19Gate : GameObject; var Level20Gate : GameObject; var LOCK2 : GameObject; var LOCK3 : GameObject; var LOCK4 : GameObject; var LOCK5 : GameObject; var LOCK6 : GameObject; var LOCK7 : GameObject; var LOCK8 : GameObject; var LOCK9 : GameObject; var LOCK10 : GameObject; var LOCK11 : GameObject; var LOCK12 : GameObject; var LOCK13 : GameObject; var LOCK14 : GameObject; var LOCK15 : GameObject; var LOCK16 : GameObject; var LOCK17 : GameObject; var LOCK18 : GameObject; var LOCK19 : GameObject; var LOCK20 : GameObject; var LOCK21 : GameObject; var LOCKBONUS1 : GameObject; var LOCKBONUS2 : GameObject; var LOCKBONUS3 : GameObject; var LOCKBONUS4 : GameObject; var LOCKBONUS5 : GameObject; var Crystal1 : GameObject; var Crystal2 : GameObject; var Crystal3 : GameObject; var Crystal4 : GameObject; var Crystal5 : GameObject; var Crystal6 : GameObject; var Crystal7 : GameObject; var Crystal8 : GameObject; var Crystal9 : GameObject; var Crystal10 : GameObject; var Crystal11 : GameObject; var Crystal12 : GameObject; var Crystal13 : GameObject; var Crystal14 : GameObject; var Crystal15 : GameObject; var Crystal16 : GameObject; var Crystal17 : GameObject; var Crystal18 : GameObject; var Crystal19 : GameObject; var Crystal20 : GameObject; var Ygem : GameObject; var Rgem : GameObject; var Pgem : GameObject; var Ggem : GameObject; var Bgem : GameObject; // var levelReached : int = 0; levelReached = PlayerPrefs.GetInt("level1"); var levelReached2 : int = 0; levelReached2 = PlayerPrefs.GetInt("level2"); var levelReached3 : int = 0; levelReached3 = PlayerPrefs.GetInt("level3"); var yellowgem : int = 0; yellowgem = PlayerPrefs.GetInt("yellowgem"); var levelReached4 : int = 0; levelReached4 = PlayerPrefs.GetInt("level4"); var levelReached5 : int = 0; levelReached5 = PlayerPrefs.GetInt("level5"); var levelReached6 : int = 0; levelReached6 = PlayerPrefs.GetInt("level6"); var redgem : int = 0; redgem = PlayerPrefs.GetInt("redgem"); var purplegem : int = 0; purplegem = PlayerPrefs.GetInt("purplegem"); var greengem : int = 0; greengem = PlayerPrefs.GetInt("greengem"); var bluegem : int = 0; bluegem = PlayerPrefs.GetInt("bluegem"); var levelReached7 : int = 0; levelReached7 = PlayerPrefs.GetInt("level8"); var levelReached8 : int = 0; levelReached8 = PlayerPrefs.GetInt("level9"); var levelReached9 : int = 0; levelReached9 = PlayerPrefs.GetInt("level9"); var levelReached10 : int = 0; levelReached10 = PlayerPrefs.GetInt("level10"); var levelReached11 : int = 0; levelReached11 = PlayerPrefs.GetInt("level11"); var levelReached12 : int = 0; levelReached12 = PlayerPrefs.GetInt("level12"); var levelReached13 : int = 0; levelReached13 = PlayerPrefs.GetInt("level13"); var levelReached14 : int = 0; levelReached14 = PlayerPrefs.GetInt("level14"); var levelReached15 : int = 0; levelReached15 = PlayerPrefs.GetInt("level15"); var levelReached16 : int = 0; levelReached16 = PlayerPrefs.GetInt("level16"); var levelReached17 : int = 0; levelReached17 = PlayerPrefs.GetInt("level17"); var levelReached18 : int = 0; levelReached18 = PlayerPrefs.GetInt("level18"); var levelReached19 : int = 0; levelReached19 = PlayerPrefs.GetInt("level19"); var levelReached20 : int = 0; levelReached20 = PlayerPrefs.GetInt("level20"); // function OnGUI() { // if (levelReached == 2) { Level2Gate.animation.Play("n2"); Destroy (LOCK2); Crystal1.active = true; } // else if (levelReached == 0) { Crystal1.active = false; }
if (levelReached2 == 2) { Level3Gate.animation.Play("n3"); Destroy (LOCK3); Crystal2.active = true; } // else if (levelReached2 == 0) { Crystal2.active = false; }
if (levelReached3 == 2) { Level4Gate.animation.Play("n4"); Destroy (LOCK4); Crystal3.active = true; } // else if (levelReached3 == 0) { Crystal3.active = false; } // if (yellowgem == 2) { Destroy (LOCKBONUS1); Ygem.active = true; } // else if (yellowgem == 0) { Ygem.active = false; } // if (levelReached4 == 2) { Level5Gate.animation.Play("n5"); Destroy (LOCK5); Crystal4.active = true; } // else if (levelReached4 == 0) { Crystal4.active = false; } // if (levelReached5 == 2) { Level6Gate.animation.Play("n6"); Destroy (LOCK6); Crystal5.active = true; } // else if (levelReached5 == 0) { Crystal5.active = false; } // if (levelReached6 == 2) { Level7Gate.animation.Play("n7"); Destroy (LOCK7); Crystal6.active = true; } // else if (levelReached6 == 0) { Crystal6.active = false; } if (redgem == 2) { Destroy (LOCKBONUS4); Rgem.active = true; } // else if (redgem == 0) { Rgem.active = false; } // if (levelReached7 == 2) { Level8Gate.animation.Play("n8"); Destroy (LOCK8); Crystal7.active = true; } // else if (levelReached7 == 0) { Crystal7.active = false; } // if (levelReached8 == 2) { Level9Gate.animation.Play("n9"); Destroy (LOCK9); Crystal8.active = true; } // else if (levelReached8 == 0) { Crystal8.active = false; } // if (levelReached9 == 2) { Level10Gate.animation.Play("n10"); Destroy (LOCK10); Crystal9.active = true; } // else if (levelReached9 == 0) { Crystal9.active = false; } // if (levelReached10 == 2) { Level11Gate.animation.Play("n11"); Destroy (LOCK11); Crystal10.active = true; } // else if (levelReached10 == 0) { Crystal10.active = false; } // if (levelReached11 == 2) { Level12Gate.animation.Play("n12"); Destroy (LOCK12); Crystal9.active = true; } // else if (levelReached11 == 0) { Crystal11.active = false; } // if (levelReached12 == 2) { Level13Gate.animation.Play("n13"); Destroy (LOCK13); Crystal12.active = true; } // else if (levelReached12 == 0) { Crystal12.active = false; } // if (levelReached13 == 2) { Level14Gate.animation.Play("n14"); Destroy (LOCK14); Crystal13.active = true; } // else if (levelReached13 == 0) { Crystal13.active = false; } // if (levelReached14 == 2) { Level15Gate.animation.Play("n15"); Destroy (LOCK15); Crystal14.active = true; } // else if (levelReached14 == 0) { Crystal14.active = false; } // if (levelReached15 == 2) { Level16Gate.animation.Play("n16"); Destroy (LOCK16); Crystal15.active = true; } // else if (levelReached15 == 0) { Crystal15.active = false; } // if (levelReached16 == 2) { Level17Gate.animation.Play("n17"); Destroy (LOCK17); Crystal16.active = true; } // else if (levelReached16 == 0) { Crystal16.active = false; } // if (levelReached17 == 2) { Level18Gate.animation.Play("n18"); Destroy (LOCK18); Crystal17.active = true; } // else if (levelReached17 == 0) { Crystal17.active = false; } // if (levelReached18 == 2) { Level19Gate.animation.Play("n19"); Destroy (LOCK19); Crystal18.active = true; } // else if (levelReached18 == 0) { Crystal18.active = false; } // if (levelReached19 == 2) { Level20Gate.animation.Play("n20"); Destroy (LOCK20); Crystal19.active = true; } // else if (levelReached19 == 0) { Crystal19.active = false; } // if (levelReached20 == 2) { Destroy (LOCK21); Crystal20.active = true; } // else if (levelReached20 == 0) { Crystal20.active = false; } // if (purplegem == 2) { Destroy (LOCKBONUS2); Pgem.active = true; } // else if (purplegem == 0) { Ggem.active = false; } // if (greengem == 2) { Destroy (LOCKBONUS5); Ggem.active = true; } // else if (greengem == 0) { Ggem.active = false; } // if (bluegem == 2) { Destroy (LOCKBONUS3); Bgem.active = true; } // else if (bluegem == 0) { Bgem.active = false; } }
First of all why are you using OnGUI? You are never calling GUI functions so that is really redundant. Plus OnGUI updates at least 3 times more often than Update so checking if a condition is true would be 3 times more costly.
Secondly there is a lot of variables and checking going on in this script. I would recommend you looking into arrays(Google them). They are really easy to work with once you get to know them and they will give you a much bigger overview.
I'm sorry, but this script is insane. ;) (Also, you didn't bother to format it.) Why are you using 50 million separate variables when you can just use arrays and make your code literally 100X shorter and simpler?
Oh ... my ... god ... No wonder your fps is non-existent ... That script is literally having to iterate through 96 variables at any one time ...
Arrays and in some case enums would be much much much recommended here. $$anonymous$$ake sure to use Built-in Arrays though.
Wow.
Oh dear, I can feel a wave of embarrassment co$$anonymous$$g on ... no, I did actually mean 'to use' ... why not? From what I can see in his code, there does't seem to be any need for dynamic arrays, so why waste performance in doing so?
Haha, try to go easy on me Eric, I am but a lowly noob. :D
Answer by aldonaletto · Mar 18, 2012 at 04:05 PM
Dude, this is really a complicated way to do stuff! There are several things that you could do to improve your code:
1- If the levels can only be reached in sequence, you could just save a variable like currentLevel to show in which level you are;
2- If levels can be randomly reached, you could have an array of booleans (instead of int), which tell if the level was reached;
3- Instead of checking all variables each OnGUI (or even each Update), you should have an independent function - let's call it SetupLevels() - which you would call only when needed - each time you completed some level, for instance.
4- Use arrays instead of lots of variables.
Just as an example, in the script below I kept the PlayerPrefs the way they are, but added the SetupLevels() function and switched to arrays where possible. Maybe this script can't replace yours directly, since some levels seem to have different actions associated, but hope it can show you a simpler way to do the thing:
var YellowUnlocked : Texture2D; var level1Locked : Texture2D;
// fill these arrays in the Inspector: var LevelGate: GameObject[]; var LOCK: GameObject[]; var Crystal: GameObject[];
var Ygem : GameObject; var Rgem : GameObject; var Pgem : GameObject; var Ggem : GameObject; var Bgem : GameObject; var LOCKBONUS1: GameObject; var LOCKBONUS2: GameObject; var LOCKBONUS3: GameObject; var LOCKBONUS4: GameObject; var LOCKBONUS5: GameObject; // var numLevels = 20; var levelReached: int[] = new int[numLevels+1]; var yellowgem: int; var redgem: int; var purplegem: int; var greengem: int; var bluegem: int;
function Start(){ // set the default value to 0 when reading the prefs for (var i = 1; i ]
// call this function when you want to update the levels:
function SetupLevels(){ for (var j = 1; j < numLevels; j++){ if (levelReached[j]==2){ var n = j+1; // n = next level LevelGate[n].animation.Play("n"+n.ToString()); if (LOCK[n]) Destroy(LOCK[n]); Crystal[n].active = true; } else { Crystal[n].active = false; } } if (yellowgem == 2) { Destroy (LOCKBONUS1); Ygem.active = true; } else if (yellowgem == 0) { Ygem.active = false; } if (redgem == 2) { Destroy (LOCKBONUS4); Rgem.active = true; } else if (redgem == 0) { Rgem.active = false; } if (purplegem == 2) { Destroy (LOCKBONUS2); Pgem.active = true; } else if (purplegem == 0) { Ggem.active = false; } if (greengem == 2) { Destroy (LOCKBONUS5); Ggem.active = true; } else if (greengem == 0) { Ggem.active = false; } if (bluegem == 2) { Destroy (LOCKBONUS3); Bgem.active = true; } else if (bluegem == 0) { Bgem.active = false; } }
Your answer
Follow this Question
Related Questions
Character Respawn 1 Answer
FPS RIGIDBODY PROBLEM 1 Answer
How to sprint and have a stamina bar? 0 Answers
Question about FPS Player Script 1 Answer
Where is the FPSPlayer Script? 0 Answers