public void Update()
    {
        var oceanJob = new OceanJob()
        {
            vertices = m_Vertices,
            time     = Time.time * m_TimeMult,
            scale    = m_Scale,

            perlinStrength = m_PerlinStrength,
            rippleStrength = m_RippleStrength,
        };

        if (multiThreaded)
        {
            m_JobHandle = oceanJob.Schedule(m_Vertices.Length, 64);

            //jobs wont be scheduled unless explicitly invoked or something starts waiting for them
            JobHandle.ScheduleBatchedJobs();
        }
        else
        {
            Profiler.BeginSample("RUN");
            oceanJob.Run(m_Vertices.Length);
            Profiler.EndSample();
        }
    }
    //1. COMPUTE OVER FRAME
    //2. NORMAL CALCULATIONS
    //3. SIMD STUFF ComputeTrisNormalsJob
    //4. https://forum.unity.com/threads/burst-simd-and-float3-float4-best-practices.527504/
    public void Update()
    {
        //DO CALCULATION OVER THE FRAME LENGTH and RENDERING
        Profiler.BeginSample("__WAIT_FOR_JOB_COMPLETE__");
        m_OceanJobHandle.Complete();
        Swap <NativeArray <Vector3> >(m_Vertices);
        Profiler.EndSample();

        Profiler.BeginSample("__SCHEDULE_JOBS_ASYNC__");
        var oceanJob = new OceanJob()
        {
            verticesIn  = m_Vertices[READ],
            verticesOut = m_Vertices[WRITE],

            time  = Time.time * m_TimeMult,
            scale = m_Scale,

            perlinStrength = m_PerlinStrength,
            rippleStrength = m_RippleStrength,
        };

        m_OceanJobHandle = oceanJob.Schedule(m_Mesh.vertexCount, 64);

        //limit number of threads to two
        //m_OceanJobHandle = oceanJob.Schedule(m_Mesh.vertexCount, m_Mesh.vertexCount / 2);


        //var recalculateNormalsJob = new RecalculateNormalsJob
        //{
        //    vertices = m_Vertices[READ],
        //    normals = m_Normals,
        //    indices = m_Indices
        //};
        //m_NormalsJobHndl = recalculateNormalsJob.Schedule();

        var triNormalsJob = new ComputeTrisNormalsJobSimd
        {
            vertices   = m_Vertices[READ],
            triNormals = m_TriNormals,
            indices    = m_Indices,
        };

        m_NormalsJobHndl = triNormalsJob.Schedule(m_Indices.Length / 3, 64);

        var normalsJob = new ComputeNormalsJobSimd
        {
            verticesToTrianglesMapping      = m_VerticesToTrianglesMapping,
            verticesToTrianglesMappingCount = m_VerticesToTrianglesMappingCount,
            triNormals = m_TriNormals,
            normals    = m_Normals
        };

        m_NormalsJobHndl = normalsJob.Schedule(m_Mesh.vertexCount, 64, m_NormalsJobHndl);

        //m_NormalsJobHndl.Complete();


        //jobs wont be scheduled until below function is called or something starts waiting for them
        JobHandle.ScheduleBatchedJobs();
        Profiler.EndSample();
    }