- Home /
Optimize perlin code
My question is if you have any way to make this delay less than 0.1 or make it un-noticable? So for example simplify some of the code to make it run a little faster :) Is there for example a way to multithread it and do the math on another thread then just apply it on the main thread? I think that the SetHeights and SetDetailLayer is taking alot of time to perform, but that is just a theory.
EDIT: That wasn't it, it was the loops that took 0.07 each, which gives that small delay. My problem is I can't make the two loops into one, because I can't get steepness if the terrain height hasn't been set.
I have this code which moves 3 tiles in 0.4 seconds, which gives this small lag everytime I walk onto a new tile:
     var Chunk : Terrain;
     var tmp = GameObject.Find("Chunk "+fromnx+","+fromnz);
     var ocupied = GameObject.Find("Chunk "+nx+","+nz);
     if (ocupied != null) {
         Destroy(tmp);
         return;
     }
     if (tmp == null) {
         var td = new TerrainData();
         td.heightmapResolution = 256;
         td.alphamapResolution = td.heightmapResolution;
         td.SetDetailResolution(td.heightmapResolution, 16);
         
         td.size = new Vector3(terrainSize, terrainHeight, terrainSize);
         
         td.splatPrototypes = splatPrototypes;
         td.treePrototypes = treeProtoTypes;
         td.detailPrototypes = detailProtoTypes;
         tmp = Terrain.CreateTerrainGameObject(td);
     }
     Chunk = tmp.GetComponent(Terrain);
     if (PlayerPrefs.HasKey("GrassDistance")) {
         Chunk.detailObjectDistance = PlayerPrefs.GetInt("GrassDistance");
     }
     var hw : float = Chunk.terrainData.heightmapWidth;
     var ChunkPosX : float = terrainSize * nx;
     var ChunkPosZ : float = terrainSize * nz;
     
     Chunk.transform.position = Vector3(ChunkPosX, 0, ChunkPosZ);
     Chunk.name = "Chunk "+nx+","+nz;
     Chunk.tag = "Chunk";
     
     var startPosX = (hw-1)*(nx-1);
     var startPosZ = (hw-1)*(nz-1);
     
     if (Chunk.transform.Find("Water") == null) {
         var Water = GameObject.Instantiate(WaterPrefab, Vector3(0, WaterLevel, 0), Quaternion.identity);
         Water.name = "Water";
         Water.transform.parent = Chunk.transform;
     }
     
     var a = Chunk.terrainData.alphamapWidth;
     var heightmap = new float[hw,hw];
     var ratio = terrainSize/hw;
     
     for(var x = 0; x < hw; x++) {
         for(var z = 0; z < hw; z++) {
             var worldPosX : float = (x+startPosX)*ratio;
             var worldPosZ : float = (z+startPosZ)*ratio;
             
             var mountains : float = Mathf.Max(0.0f, perlin.FractalNoise2D(worldPosX+250, worldPosZ+250, 5, Frq, 0.8f));
             var plain : float = perlin.FractalNoise2D(worldPosX-250, worldPosZ-250, 1, Frq, 0.5f) + 0.175f;
             
             heightmap[z,x] = plain+mountains;
         }
     }
     
     Chunk.terrainData.SetHeights(0,0,heightmap);
     var map = new float[a, a, Chunk.terrainData.alphamapLayers];
     var detailMap = new int[a,a];
     var aratio = (terrainSize/a);
     var aunit = 1.0f/(a-1);
     for (var ax = 0; ax < a; ax++) {
         for (var az = 0; az < a; az++) {
             var worldPosX1 : float = (ax+startPosX)*aratio;
             var worldPosZ1 : float = (az+startPosZ)*aratio;
             
             var Biome = GetBiome(worldPosX1,worldPosZ1);
             var normX : float = ax*aunit;
             var normZ : float = az*aunit;
                 
             // Get the steepness value at the normalized coordinate.
             var angle = Chunk.terrainData.GetSteepness(normX,normZ);
             var height = Chunk.terrainData.GetInterpolatedHeight(normX,normZ);
             
             if (height < WaterLevel + 2 || Biome == "Desert") {
                 map[az,ax,2] = 1;
             } else if (height > 120 || Biome == "Snow") {
                 map[az,ax,3] = 1;
             } else if (angle > 25) {
                 map[az,ax,1] = 1;
             } else if (Biome == "Plain") {
                 detailMap[az,ax] = 2;
                 map[az,ax,0] = 1;
             } else if (Biome == "Forest") {
                 detailMap[az,ax] = 1;
                 map[az,ax,0] = 1;
             }
         }
     }
     Chunk.terrainData.SetDetailLayer(0,0,0,detailMap);
     Chunk.terrainData.SetAlphamaps(0,0,map);
Answer by lamecheesykiwi · Oct 28, 2014 at 10:14 PM
Have you tried .05?
@lamecheesykiwi As the amplitude in the fractal noise?
Your answer
 
 
             Follow this Question
Related Questions
Low performance on multiple runtime generated sprites 1 Answer
Basics of Perlin Noise? 1 Answer
Perlin Noise Plane Manipulation 1 Answer
Using noise as texture 2 Answers
easy c# Simplex Noise script code 1 Answer
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                