[web] Optimize Matrix4.identity (#22622)

diff --git a/lib/web_ui/lib/src/engine/vector_math.dart b/lib/web_ui/lib/src/engine/vector_math.dart
index d91b417..fe0b3cd 100644
--- a/lib/web_ui/lib/src/engine/vector_math.dart
+++ b/lib/web_ui/lib/src/engine/vector_math.dart
@@ -67,7 +67,12 @@
   Matrix4.zero() : _m4storage = Float32List(16);
 
   /// Identity matrix.
-  factory Matrix4.identity() => Matrix4.zero()..setIdentity();
+  Matrix4.identity() : _m4storage = Float32List(16) {
+    _m4storage[15] = 1.0;
+    _m4storage[0] = 1.0;
+    _m4storage[5] = 1.0;
+    _m4storage[10] = 1.0;
+  }
 
   /// Copies values from [other].
   factory Matrix4.copy(Matrix4 other) => Matrix4.zero()..setFrom(other);
@@ -98,14 +103,12 @@
     ..setRotationZ(radians);
 
   /// Translation matrix.
-  factory Matrix4.translation(Vector3 translation) => Matrix4.zero()
-    ..setIdentity()
+  factory Matrix4.translation(Vector3 translation) => Matrix4.identity()
     ..setTranslation(translation);
 
   /// Translation matrix.
   factory Matrix4.translationValues(double x, double y, double z) =>
-      Matrix4.zero()
-        ..setIdentity()
+      Matrix4.identity()
         ..setTranslationRaw(x, y, z);
 
   /// Scale matrix.
@@ -198,6 +201,9 @@
   /// Copy into [arg].
   Matrix4 copyInto(Matrix4 arg) {
     final Float32List argStorage = arg._m4storage;
+    // Start reading from the last element to eliminate range checks
+    // in subsequent reads.
+    argStorage[15] = _m4storage[15];
     argStorage[0] = _m4storage[0];
     argStorage[1] = _m4storage[1];
     argStorage[2] = _m4storage[2];
@@ -213,7 +219,6 @@
     argStorage[12] = _m4storage[12];
     argStorage[13] = _m4storage[13];
     argStorage[14] = _m4storage[14];
-    argStorage[15] = _m4storage[15];
     return arg;
   }
 
@@ -248,6 +253,7 @@
     final double sy = y ?? x;
     final double sz = z ?? x;
     const double sw = 1.0;
+    _m4storage[15] *= sw;
     _m4storage[0] *= sx;
     _m4storage[1] *= sx;
     _m4storage[2] *= sx;
@@ -263,7 +269,6 @@
     _m4storage[12] *= sw;
     _m4storage[13] *= sw;
     _m4storage[14] *= sw;
-    _m4storage[15] *= sw;
   }
 
   /// Create a copy of [this] scaled by a [Vector3], [Vector4] or [x],[y], and
@@ -272,6 +277,7 @@
 
   /// Zeros [this].
   void setZero() {
+    _m4storage[15] = 0.0;
     _m4storage[0] = 0.0;
     _m4storage[1] = 0.0;
     _m4storage[2] = 0.0;
@@ -287,11 +293,11 @@
     _m4storage[12] = 0.0;
     _m4storage[13] = 0.0;
     _m4storage[14] = 0.0;
-    _m4storage[15] = 0.0;
   }
 
   /// Makes [this] into the identity matrix.
   void setIdentity() {
+    _m4storage[15] = 1.0;
     _m4storage[0] = 1.0;
     _m4storage[1] = 0.0;
     _m4storage[2] = 0.0;
@@ -307,7 +313,6 @@
     _m4storage[12] = 0.0;
     _m4storage[13] = 0.0;
     _m4storage[14] = 0.0;
-    _m4storage[15] = 1.0;
   }
 
   /// Returns the tranpose of this.
@@ -337,34 +342,35 @@
 
   /// Returns the determinant of this matrix.
   double determinant() {
+    final Float32List m = _m4storage;
     final double det2_01_01 =
-        _m4storage[0] * _m4storage[5] - _m4storage[1] * _m4storage[4];
+        m[0] * m[5] - m[1] * m[4];
     final double det2_01_02 =
-        _m4storage[0] * _m4storage[6] - _m4storage[2] * _m4storage[4];
+        m[0] * m[6] - m[2] * m[4];
     final double det2_01_03 =
-        _m4storage[0] * _m4storage[7] - _m4storage[3] * _m4storage[4];
+        m[0] * m[7] - m[3] * m[4];
     final double det2_01_12 =
-        _m4storage[1] * _m4storage[6] - _m4storage[2] * _m4storage[5];
+        m[1] * m[6] - m[2] * m[5];
     final double det2_01_13 =
-        _m4storage[1] * _m4storage[7] - _m4storage[3] * _m4storage[5];
+        m[1] * m[7] - m[3] * m[5];
     final double det2_01_23 =
-        _m4storage[2] * _m4storage[7] - _m4storage[3] * _m4storage[6];
-    final double det3_201_012 = _m4storage[8] * det2_01_12 -
-        _m4storage[9] * det2_01_02 +
-        _m4storage[10] * det2_01_01;
-    final double det3_201_013 = _m4storage[8] * det2_01_13 -
-        _m4storage[9] * det2_01_03 +
-        _m4storage[11] * det2_01_01;
-    final double det3_201_023 = _m4storage[8] * det2_01_23 -
-        _m4storage[10] * det2_01_03 +
-        _m4storage[11] * det2_01_02;
-    final double det3_201_123 = _m4storage[9] * det2_01_23 -
-        _m4storage[10] * det2_01_13 +
-        _m4storage[11] * det2_01_12;
-    return -det3_201_123 * _m4storage[12] +
-        det3_201_023 * _m4storage[13] -
-        det3_201_013 * _m4storage[14] +
-        det3_201_012 * _m4storage[15];
+        m[2] * m[7] - m[3] * m[6];
+    final double det3_201_012 = m[8] * det2_01_12 -
+        m[9] * det2_01_02 +
+        m[10] * det2_01_01;
+    final double det3_201_013 = m[8] * det2_01_13 -
+        m[9] * det2_01_03 +
+        m[11] * det2_01_01;
+    final double det3_201_023 = m[8] * det2_01_23 -
+        m[10] * det2_01_03 +
+        m[11] * det2_01_02;
+    final double det3_201_123 = m[9] * det2_01_23 -
+        m[10] * det2_01_13 +
+        m[11] * det2_01_12;
+    return -det3_201_123 * m[12] +
+        det3_201_023 * m[13] -
+        det3_201_013 * m[14] +
+        det3_201_012 * m[15];
   }
 
   /// Returns a new vector or matrix by multiplying [this] with [arg].
@@ -387,6 +393,7 @@
   /// defined by [this].
   Vector3 perspectiveTransform(Vector3 arg) {
     final Float32List argStorage = arg._v3storage;
+
     final double x = (_m4storage[0] * argStorage[0]) +
         (_m4storage[4] * argStorage[1]) +
         (_m4storage[8] * argStorage[2]) +
@@ -733,6 +740,7 @@
 
   /// Multiply [this] by [arg].
   void multiply(Matrix4 arg) {
+    final double m33 = _m4storage[15];
     final double m00 = _m4storage[0];
     final double m01 = _m4storage[4];
     final double m02 = _m4storage[8];
@@ -748,8 +756,8 @@
     final double m30 = _m4storage[3];
     final double m31 = _m4storage[7];
     final double m32 = _m4storage[11];
-    final double m33 = _m4storage[15];
     final Float32List argStorage = arg._m4storage;
+    final double n33 = argStorage[15];
     final double n00 = argStorage[0];
     final double n01 = argStorage[4];
     final double n02 = argStorage[8];
@@ -765,7 +773,6 @@
     final double n30 = argStorage[3];
     final double n31 = argStorage[7];
     final double n32 = argStorage[11];
-    final double n33 = argStorage[15];
     _m4storage[0] = (m00 * n00) + (m01 * n10) + (m02 * n20) + (m03 * n30);
     _m4storage[4] = (m00 * n01) + (m01 * n11) + (m02 * n21) + (m03 * n31);
     _m4storage[8] = (m00 * n02) + (m01 * n12) + (m02 * n22) + (m03 * n32);
@@ -789,6 +796,7 @@
 
   /// Multiply a transposed [this] with [arg].
   void transposeMultiply(Matrix4 arg) {
+    final double m33 = _m4storage[15];
     final double m00 = _m4storage[0];
     final double m01 = _m4storage[1];
     final double m02 = _m4storage[2];
@@ -804,7 +812,7 @@
     final double m30 = _m4storage[12];
     final double m31 = _m4storage[13];
     final double m32 = _m4storage[14];
-    final double m33 = _m4storage[15];
+
     final Float32List argStorage = arg._m4storage;
     _m4storage[0] = (m00 * argStorage[0]) +
         (m01 * argStorage[1]) +