From d9d5b7b5c58a7b044b78ee7993f0a15e5b79f689 Mon Sep 17 00:00:00 2001
From: miepzerino <o.skotnik@gmail.com>
Date: Thu, 03 Apr 2025 18:28:15 +0000
Subject: [PATCH] #42 started performance fixes for chunk generation
---
Assets/Scripts/CustomRuleTile.cs | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 50 insertions(+), 10 deletions(-)
diff --git a/Assets/Scripts/CustomRuleTile.cs b/Assets/Scripts/CustomRuleTile.cs
index e80cac2..1043714 100644
--- a/Assets/Scripts/CustomRuleTile.cs
+++ b/Assets/Scripts/CustomRuleTile.cs
@@ -10,25 +10,65 @@
{
public List<TileBase> siblings = new List<TileBase>();
+ private Dictionary<int, bool> ruleMatchCache = new Dictionary<int, bool>();
public class Neighbor : RuleTile.TilingRule.Neighbor
{
public const int Sibling = 3;
}
public override bool RuleMatch(int neighbor, TileBase tile)
{
+ // Create a unique key for caching based on neighbor and tile
+ int cacheKey = neighbor;
+ if (tile != null)
+ {
+ cacheKey = cacheKey * 23 + tile.GetInstanceID(); // Use prime number to reduce collisions
+ }
+
+ // Check if we have a cached result
+ if (ruleMatchCache.TryGetValue(cacheKey, out bool cachedResult))
+ {
+ return cachedResult;
+ }
+
+ // If not cached, compute the result
+ bool result;
+
// Handle null tiles
if (tile == null)
- return neighbor == RuleTile.TilingRule.Neighbor.NotThis;
-
- // Always allow connections to siblings or self, regardless of surrounding tiles
- if (tile == this || siblings.Contains(tile))
- return neighbor == RuleTile.TilingRule.Neighbor.This;
-
+ {
+ result = neighbor == RuleTile.TilingRule.Neighbor.NotThis;
+ }
+ // Always allow connections to siblings or self
+ else if (tile == this || siblings.Contains(tile))
+ {
+ result = neighbor == RuleTile.TilingRule.Neighbor.This;
+ }
// For Sibling type explicitly
- if (neighbor == Neighbor.Sibling)
- return siblings.Contains(tile);
-
+ else if (neighbor == Neighbor.Sibling)
+ {
+ result = siblings.Contains(tile);
+ }
// For any other case, use base behavior
- return base.RuleMatch(neighbor, tile);
+ else
+ {
+ result = base.RuleMatch(neighbor, tile);
+ }
+
+ // Cache the result
+ ruleMatchCache[cacheKey] = result;
+ return result;
+ }
+
+ // Add method to clear cache when needed (e.g., when rules change or on chunk unload)
+ public void ClearRuleCache()
+ {
+ ruleMatchCache.Clear();
+ }
+
+ // Override RefreshTile to clear cache for that specific tile position
+ public override void RefreshTile(Vector3Int position, ITilemap tilemap)
+ {
+ ClearRuleCache(); // Clear cache before refresh to ensure proper updates
+ base.RefreshTile(position, tilemap);
}
}
\ No newline at end of file
--
Gitblit v1.10.0