How to increase the performance of terrain generation? Unity 2017.2.0f3
I want to make an android game for a friend.
A typically sidescrolling space game, but in this case with a third-person view.
Since it is a complex calculation to instantiate new terrain, based on the position of the player, I let the vertices of the terrain move to my player, so that tranform-component is changed.
For this I use the PerlinNoise algorithm and add a constantly increasing offset.
The problem is that the texture of the terrain does not move along with it. That's why I use SplatPrototypes.
SplatPrototype[] splatPrototype = terrain.terrainData.splatPrototypes;
splatPrototype[0].tileOffset = new Vector2(0.0f, offsetX * offsetMultiplier);
terrain.terrainData.splatPrototypes = splatPrototype;
This works quite well and also the terrain is created and changed very reliably by a simple algorithm.
using UnityEngine;
public class DynamicTerrain : MonoBehaviour {
public int width = 256;
public int height = 256;
public int depth = 5;
public float offsetX = 0.0f;
public float offsetY;
private float offsetMultiplier = 6.5f;
public float scale = 20.0f;
// Use this for initialization
void Start () {
Terrain terrain = GetComponent<Terrain>();
terrain.terrainData = GenerateTerrain(terrain.terrainData);
}
// Update is called once per frame
void Update () {
Game game = new Game();
offsetX += game.speed * Time.deltaTime;
Terrain terrain = GetComponent<Terrain>();
terrain.terrainData = GenerateTerrain(terrain.terrainData);
// Texture bewegt sich mit dem Terrain mit
SplatPrototype[] splatPrototype = terrain.terrainData.splatPrototypes;
splatPrototype[0].tileOffset = new Vector2(0.0f, offsetX * offsetMultiplier);
terrain.terrainData.splatPrototypes = splatPrototype;
}
private TerrainData GenerateTerrain (TerrainData terraindata)
{
terraindata.heightmapResolution = width + 1;
terraindata.size = new Vector3(width, depth, height);
terraindata.SetHeights(0, 0, GenerateHeight());
return terraindata;
}
private float[,] GenerateHeight ()
{
float[,] heights = new float[width, height];
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
heights[x, y] = CalculateHeight(x, y);
}
}
return heights;
}
private float CalculateHeight(int x, int y)
{
float xCoord = (float) x / width * scale + offsetX;
float yCoord = (float) y / height * scale;
return Mathf.PerlinNoise(xCoord, yCoord);
}
}
The problem is that the algorithm is easy to process for a PC, but not for a mobile device.
So here is my question:
Can I simplify the calculations somehow, in favor of the performance, so that it works on a mobile device fluently and the result remains the same?