I was tired of the normal calculation hogging Unity. So I came up with this idea:

Now the normal calculation for each vertex is relayed on sampling the height map. But that's not necessary for all the vertex on the patch.

Almost all the data needed to calculate normals is on the grid itself. But you need to sample the height map for the ones on the borders since we don't have the info of the surrounding patches. So I came up with this Calculate value method:

Code:

public void CalculateValues()
{
var normals = new Vector3[mesh.vertexCount];
var tangents = new Vector4[mesh.vertexCount];
for (int i = 0; i < mesh.vertexCount; i++)
{
if (i < size || i % size == 0 || (i + 1) % size == 0 || i > (size * (size - 1)))
{
var vertex = mesh.vertices[i];
vertex += position;
normals[i] = CalculateSampleNormal(vertex);
tangents[i] = CalculateTangents(vertex);
}
else
{
var ul = mesh.vertices[i + size];
ul += position;
var ur = mesh.vertices[i + size + 1];
ur += position;
var dl = mesh.vertices[i - size];
dl += position;
var dr = mesh.vertices[i - size - 1];
dr += position;
var lt = mesh.vertices[i - 1];
lt += position;
var rt = mesh.vertices[i + 1];
rt += position;
var u = (ul.y + ur.y) / 2;
var d = (dl.y + dr.y) / 2;
normals[i] = new Vector3(lt.y - rt.y, spacing, d - u).normalized;
tangents[i] = new Vector4(spacing, u - d, 0, -1).normalized;
}
}
mesh.normals = normals;
mesh.tangents = tangents;
}

The if statement is where the magic occurs. It's responsible for identifying the vertex at the border of the patch.

I can't check if this is calculated correctly since I can't compare with a Maya import (I don't have MAYA here)

But if everything is Alright I've decreased the starting time of the level from 7.686s to 2.609s

With this settings:

PatchRowCount = 5

PatchVertexCount = 33

PatchVertexSpacing = 2

Hope this helps.