performance for more that one terain

I currently am using the performance script from the island demo to help with game performance.

I currently have 7 different terrains that make up the world of the game.

how do i modify that performance script to recognize each of the terrains and tweak performance accordingly.

var fpsCounter : FPSCounter;
var water : IslandWater;
var terrain : Terrain;
var messageTime = 10.0;
var scrollTime = 0.7;

private var messages = new Array();
private var times = new Array();
private var lastTime = 0.0;
private var doneNotes = false;
private var origDetailDist = 0.0;
private var origSplatDist = 0.0;
private var origTreeDist = 0.0;
private var origMaxLOD = 0;
private var softVegetationOff = false;
private var splatmapsOff = false;

private var lowFPS = 15.0;

private var skipChangesTimeout = 1.0;
private var nextTerrainChange = 0;

function Start()
{
	if( !fpsCounter || !water || !terrain ) {
		Debug.LogWarning("Some of performance objects are not set up");
		enabled = false;
		return;
	}
	
	origDetailDist = terrain.detailObjectDistance;
	origSplatDist = terrain.basemapDistance;
	origTreeDist = terrain.treeDistance;
	origMaxLOD = terrain.heightmapMaximumLOD;
	skipChangesTimeout = 0.0;
}

function Update ()
{
	if( !fpsCounter || !water || !terrain )
		return;
		
	if( !doneNotes  !Application.isEditor )
	{
		var hwWater = water.FindHardwareWaterSupport();
		if( hwWater == IslandWater.WaterMode.Simple )
		{
			AddMessage( "Note: water reflections not supported on this computer" );
			// in this case it also happens that terrain splat maps are not supported :)
			AddMessage( "Note: high detail terrain textures not supported on this computer" );
			splatmapsOff = true;
		}
		if( hwWater == IslandWater.WaterMode.Reflective )
			AddMessage( "Note: water refractions not supported on this computer" );
			
		var gfxCard = SystemInfo.graphicsDeviceName.ToLower();
		var gfxVendor = SystemInfo.graphicsDeviceVendor.ToLower();
		if( gfxVendor.Contains("intel") )
		{
			// on pre-GMA950, increase fog and reduce far plane by 4x :)
			if( hwWater == IslandWater.WaterMode.Simple )
			{
				ReduceDrawDistance( 4.0, "Note: reducing draw distance (old Intel video card detected)" );
			}
			
			softVegetationOff = true;
			QualitySettings.softVegetation = false;
			AddMessage( "Note: turning off soft vegetation (Intel video card detected)" );
		}
		else if( gfxVendor == "sis" )
		{
			softVegetationOff = true;
			QualitySettings.softVegetation = false;
			AddMessage( "Note: turning off soft vegetation (SIS video card detected)" );
		}
		else if( gfxCard.Contains("geforce")  (
			gfxCard.Contains("5200") || gfxCard.Contains("5500") || gfxCard.Contains("6100") || hwWater == IslandWater.WaterMode.Simple) )
		{
			// on slow/old geforce cards, increase fog and reduce far plane by 2x
			ReduceDrawDistance( 2.0, "Note: reducing draw distance (slow GeForce card detected)" );
			
			softVegetationOff = true;
			QualitySettings.softVegetation = false;
			AddMessage( "Note: turning off soft vegetation (slow GeForce card detected)" );
		}
		else
		{
			// on other old cards, increase fog and reduce far plane by 2x
			if( hwWater == IslandWater.WaterMode.Simple )
			{
				ReduceDrawDistance( 2.0, "Note: reducing draw distance (old video card detected)" );
			}
		}
		
		skipChangesTimeout = 0.0;
		doneNotes = true;
	}
	
	DoTweaks();
	
	UpdateMessages();
}

function ReduceDrawDistance( factor : float, message : String )
{
	AddMessage( message );
	var underwater : UnderwaterEffects;
	underwater = FindObjectOfType(UnderwaterEffects);
	RenderSettings.fogDensity *= factor;
	if( underwater )
	{
		underwater.uDensity *= factor;
		underwater.aDensity *= factor;
	}
	Camera.main.farClipPlane /= factor;
}

function OnDisable()
{
	QualitySettings.softVegetation = true;
}

function DoTweaks()
{
	if( !fpsCounter.HasFPS() )
		return; // enough time did not pass yet to get decent FPS count		
	
	var hwWater = water.FindHardwareWaterSupport();
	var fps : float  = fpsCounter.GetFPS();
	
	// don't do too many adjustments at time... allow one per
	// FPS update interval
	skipChangesTimeout -= Time.deltaTime;
	if( skipChangesTimeout < 0.0 )
		skipChangesTimeout = 0.0;
	if( skipChangesTimeout > 0.0 )
		return;
	
	// water tweaks
	var curWater = water.GetWaterMode();
	if( fps > 35.0 )
	{
		// frame rate high, use refractions | reflections
		if( hwWater == IslandWater.WaterMode.Refractive  curWater < IslandWater.WaterMode.Refractive ) {
			water.m_WaterMode = IslandWater.WaterMode.Refractive;
			AddMessage( "Framerate high, turning water refractions on" );
			return;
		}
		if( hwWater == IslandWater.WaterMode.Reflective  curWater < IslandWater.WaterMode.Reflective ) {
			water.m_WaterMode = IslandWater.WaterMode.Reflective;
			AddMessage( "Framerate high, turning water reflections on" );
			return;
		}
	}
	else if( fps > 25.0 )
	{
		// frame rate sort of high, can use water reflections
		if( hwWater > IslandWater.WaterMode.Simple  curWater == IslandWater.WaterMode.Simple ) {
			water.m_WaterMode = IslandWater.WaterMode.Reflective;
			AddMessage( "Framerate ok, turning water reflections on" );
			return;
		}
	}
	else if( fps < 10.0 )
	{
		// frame rate very low, turn water to simple
		if( curWater > IslandWater.WaterMode.Simple ) {
			water.m_WaterMode = IslandWater.WaterMode.Simple;
			AddMessage( "Framerate very low, turning water reflections off" );
			return;
		}
	}
	else if( fps < 25.0 )
	{
		// frame rate sort of low, use reflections only
		if( curWater > IslandWater.WaterMode.Reflective ) {
			water.m_WaterMode = IslandWater.WaterMode.Reflective;
			AddMessage( "Framerate low, turning water refractions off" );
			return;
		}
	}
	
	
	// terrain tweaks
	if( fps > 25.0 )
	{
		// bump up!
		++nextTerrainChange;
		if( nextTerrainChange >= 4 )
			nextTerrainChange = 0;
			
		if( nextTerrainChange == 0  terrain.detailObjectDistance < origDetailDist )
		{
			terrain.detailObjectDistance *= 2.0;
			if( !softVegetationOff )
				QualitySettings.softVegetation = true;
			AddMessage( "Framerate ok, increasing vegetation detail" );
			return;
		}
		if( nextTerrainChange == 1  !splatmapsOff  terrain.basemapDistance < origSplatDist )
		{
			terrain.basemapDistance *= 2.0;
			AddMessage( "Framerate ok, increasing terrain texture detail" );
			return;
		}
		if( nextTerrainChange == 2  terrain.treeDistance < origTreeDist )
		{
			terrain.treeDistance *= 2.0;
			AddMessage( "Framerate ok, increasing tree draw distance" );
			return;
		}
		if( nextTerrainChange == 3  terrain.heightmapMaximumLOD > origMaxLOD )
		{
			--terrain.heightmapMaximumLOD;
			AddMessage( "Framerate ok, increasing terrain detail" );
			return;
		}
	}
	if( fps < lowFPS )
	{
		// lower it
		++nextTerrainChange;
		if( nextTerrainChange >= 4 ) {
			nextTerrainChange = 0;
			lowFPS = 10.0; // ok, this won't be fast...
		}
			
		if( nextTerrainChange == 0  terrain.detailObjectDistance >= origDetailDist / 16.0 ) {
			terrain.detailObjectDistance *= 0.5;
			QualitySettings.softVegetation = false;
			AddMessage( "Framerate low, reducing vegetation detail" );
			return;
		}
		if( nextTerrainChange == 1  !splatmapsOff  terrain.basemapDistance >= origSplatDist / 16.0 )
		{
			terrain.basemapDistance *= 0.5;
			AddMessage( "Framerate low, reducing terrain texture detail" );
			return;
		}
		if( nextTerrainChange == 2  terrain.treeDistance >= origTreeDist / 16.0 )
		{
			terrain.treeDistance *= 0.5;
			AddMessage( "Framerate low, reducing tree draw distance" );
			return;
		}
		if( nextTerrainChange == 3  terrain.heightmapMaximumLOD < 1 )
		{
			++terrain.heightmapMaximumLOD;
			AddMessage( "Framerate low, reducing terrain detail" );
			return;
		}
	}
}

function AddMessage( t : String )
{
	messages.Add( t );
	times.Add( messageTime );
	lastTime = scrollTime;
	skipChangesTimeout = fpsCounter.updateInterval * 3.0;
}

function UpdateMessages()
{
	var dt = Time.deltaTime;
	for( var t in times )
		t -= dt;
	while( times.length > 0  times[0] < 0.0 ) {
		times.Shift();
		messages.Shift();	
	}
	lastTime -= dt;
	if( lastTime < 0.0 )
		lastTime = 0.0;
}

function OnGUI()
{
	var height = 15;
	var n : int = messages.length;
	var rc = Rect( 2, Screen.height - 2 - n * height + (lastTime/scrollTime*height), 600, 20 );
	for( var i = 0; i < n; ++i )
	{
		var text : String = messages[i];
		var time : float = times[i];
		var alpha = time / messageTime;
		if( alpha < 0.2 )
			GUI.color.a = alpha / 0.2;
		else if( alpha > 0.9 )
			GUI.color.a = 1.0 - (alpha-0.9) / (1-0.9);
		else
			GUI.color.a = 1.0;
		
		GUI.Label( rc, text );
		rc.y += height;
	}
}

thanks

search for all game objects of type Terrain :slight_smile: