diff --git a/Runtime/VectorTile.cs b/Runtime/VectorTile.cs
index 35f49bc137f77a3f0ae08ccb64491857dc9b209c..ad10d351f9b039b448856b5b1ef9ae5a4b84200e 100644
--- a/Runtime/VectorTile.cs
+++ b/Runtime/VectorTile.cs
@@ -183,8 +183,6 @@ namespace Wander
         // vector tile provider. 
         public void IdentifyLayers( Func<VectorTileLayer, List<KeyValuePair<string, object>>, int> selectionCallback )
         {
-            Debug.Assert( triangulated, "First call Triangulate." );
-
             for (int l = 0;l < layers.Count;l++)
             {
                 var layer  = layers[l];
@@ -196,16 +194,10 @@ namespace Wander
                     int uniqueId = selectionCallback( layer, feature.Attributes );
                     if (uniqueId > -1)
                     {
-                        if ( uniqueId == 8 )
-                        {
-                            int jt = 0;
-                        }
                         feature.SelectedLayerIdx = uniqueId;
-                        break; // Done with this feature.
                     }
                 }
             }
-
             layersIdentified = true;
         }
 
@@ -229,21 +221,25 @@ namespace Wander
             failedPixels = new List<Vector3Int>();
             remappedLayerIndices = new Dictionary<byte, byte>();
             byte cachedPixel = 0;
+            float oneOverRes = 1.0f / resolution;
+
+            TriangulatedPolygon cachedPoly = default;
+            int cachedVtxIdx  = -1;
+            int cachedTriIdx  = -1;
 
-            // For each layer, for each pixel, check triangle intersections.
-            for (int l = 0;l < layers.Count && !cancelToken.Value;l++)
+            // For each pixel.
+            for (int y = 0;y < resolution ;y++)
             {
-                var layer = layers[l];
-                float fx  = (float)layer.Extent / resolution;
-                TriangulatedPolygon cachedPoly = default;
-                int cachedVtxIdx  = -1;
-                int cachedTriIdx  = -1;
-                for (int y = 0;y < resolution && !cancelToken.Value;y++)
+                for (int x = 0;x < resolution && !cancelToken.Value ;x++)
                 {
-                    for (int x = 0; x < resolution; x++)
+                    bool hit  = false;
+
+                    // For each layer, check triangle intersections.
+                    for (int l = 0;l < layers.Count && !cancelToken.Value;l++)
                     {
+                        var layer = layers[l];
+                        float fx  = layer.Extent * oneOverRes;
                         Vector2 p = new Vector2(fx*x+0.5f*fx, fx*y+0.5f*fx);
-                        bool hit  = false;
 
                         // First try cache, quite often adjacent pixels will hit the same triangle.
                         if (cachedVtxIdx!=-1)
@@ -259,7 +255,7 @@ namespace Wander
                                 if (hit)
                                 {
                                     texture[(resolution - y -1)*resolution+x] = cachedPixel;
-                                    continue; // Pass from cache, continue to next pixel.
+                                    break; // Pass from cache, continue to next pixel.
                                 }
                             }
                         }
@@ -279,23 +275,19 @@ namespace Wander
                             cachedVtxIdx = -1;
                             cachedPoly   = polygonLayers[l][f];
                             var mins     = cachedPoly.mins;
-                            var maxs     = cachedPoly.maxs; 
+                            var maxs     = cachedPoly.maxs;
                             var denoms   = cachedPoly.denoms;
                             var vertices = cachedPoly.vertices;
-                            for (int vIdx = 0, triIdx = 0; vIdx < vertices.Count; vIdx += 3, triIdx++)
+                            for (int vIdx = 0, triIdx = 0;vIdx < vertices.Count;vIdx += 3, triIdx++)
                             {
-                                if ( p.x < mins[triIdx].x || p.x > maxs[triIdx].x ) continue;
-                                if ( p.y < mins[triIdx].y || p.y > maxs[triIdx].y ) continue;
+                                if (p.x < mins[triIdx].x || p.x > maxs[triIdx].x) continue;
+                                if (p.y < mins[triIdx].y || p.y > maxs[triIdx].y) continue;
                                 hit = GeomUtil.PointIsInsideTriangle2( p, vertices[vIdx], vertices[vIdx+1], vertices[vIdx+2], denoms[triIdx] );
                                 if (hit)
                                 {
                                     cachedTriIdx = triIdx;
                                     cachedVtxIdx = vIdx;
                                     cachedPixel  = (byte)feature.SelectedLayerIdx;
-                                    if ( cachedPixel == 8 )
-                                    {
-                                        int jt = 0;
-                                    }
                                     texture[(resolution - y -1)*resolution+x] = cachedPixel;
                                     break;
                                 }
@@ -304,11 +296,13 @@ namespace Wander
                             if (hit) break;
                         }
 
-                        if ( !hit )
-                        {
-                         //   texture[(resolution - y -1)*resolution+x] = 255;
-                            failedPixels.Add( new Vector3Int( x, y, 255 ) );
-                        }
+                        if (hit) break;
+                    }
+
+                    if (!hit)
+                    {
+                        texture[(resolution - y -1)*resolution+x] = 255;
+                        failedPixels.Add( new Vector3Int( x, y, 255 ) );
                     }
                 }
             }
@@ -324,11 +318,7 @@ namespace Wander
                 for (int x = 0;x < resolution;x++)
                 {
                     byte pixel = texture[addr];
-                    if  (pixel == 8 )
-                    {
-                        int jt = 0;
-                    }
-                    if ( pixel != cachedPixel && pixel != 254 /*used for not matched layer*/ )
+                    if ( pixel != cachedPixel && pixel < 254  /*used for not matched layer*/ )
                     {
                         if (!remappedLayerIndices.TryGetValue( pixel, out remappedPixel ))
                         {