diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/data/IDhApiTerrainDataCache.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/data/IDhApiTerrainDataCache.java
index 2ec043a10..cb8b50422 100644
--- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/data/IDhApiTerrainDataCache.java
+++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/data/IDhApiTerrainDataCache.java
@@ -1,15 +1,18 @@
package com.seibel.distanthorizons.api.interfaces.data;
/**
- * Can be used to drastically speed up repeat read operations in {@link IDhApiTerrainDataRepo}.
- *
+ * Can be used to drastically speed up repeat read operations in {@link IDhApiTerrainDataRepo}.
+ *
+ * Once you are done with this cache, closing it will free up any objects
+ * the cache is holding. This can reduce Garbage Collector overhead and reduce stuttering.
+ *
* @see IDhApiTerrainDataRepo
*
* @author James Seibel
- * @version 2024-7-14
+ * @version 2026-1-29
* @since API 3.0.0
*/
-public interface IDhApiTerrainDataCache // TODO should this be AutoClosable?
+public interface IDhApiTerrainDataCache extends AutoCloseable
{
/**
* Removes any data that's currently stored in this cache.
diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/data/IDhApiTerrainDataRepo.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/data/IDhApiTerrainDataRepo.java
index 10e9cb361..336f880da 100644
--- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/data/IDhApiTerrainDataRepo.java
+++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/data/IDhApiTerrainDataRepo.java
@@ -42,6 +42,8 @@ public interface IDhApiTerrainDataRepo
// getters //
//=========//
+ // TODO should we force users to pass in a cache, even if null?
+
/** @see IDhApiTerrainDataRepo#getSingleDataPointAtBlockPos(IDhApiLevelWrapper, int, int, int, IDhApiTerrainDataCache) */
default DhApiResult getSingleDataPointAtBlockPos(IDhApiLevelWrapper levelWrapper, int blockPosX, int blockPosY, int blockPosZ) { return this.getSingleDataPointAtBlockPos(levelWrapper, blockPosX, blockPosY, blockPosZ, null); }
/**
diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/events/IDhApiEventInjector.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/events/IDhApiEventInjector.java
index ba9bdb336..d2aa07fdf 100644
--- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/events/IDhApiEventInjector.java
+++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/events/IDhApiEventInjector.java
@@ -40,8 +40,7 @@ public interface IDhApiEventInjector extends IDependencyInjector
* @return true if the handler was unbound, false if the handler wasn't bound.
* @throws IllegalArgumentException if the implementation object doesn't implement the interface
*/
- // Note to self: Don't try adding a generic type to IDhApiEvent, the constructor won't accept it
- // TODO why are we removing the class instead of an instance?
+ // Note to DH Devs: Don't try adding a generic type to IDhApiEvent, the constructor won't accept it
boolean unbind(Class extends IDhApiEvent> dependencyInterface, Class extends IDhApiEvent> dependencyClassToRemove) throws IllegalArgumentException;
diff --git a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderableBoxGroup.java b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderableBoxGroup.java
index 399ba1571..2587bd0fe 100644
--- a/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderableBoxGroup.java
+++ b/api/src/main/java/com/seibel/distanthorizons/api/interfaces/render/IDhApiRenderableBoxGroup.java
@@ -73,7 +73,7 @@ public interface IDhApiRenderableBoxGroup extends List
* This is a good place to change the origin or notify of any box changes.
*/
void setPreRenderFunc(Consumer renderEventParam);
- void setPostRenderFunc(Consumer renderEventParam); // TODO name?
+ void setPostRenderFunc(Consumer renderEventParam);
/**
* If a cube's color, position, or other property is changed this method
diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/data/DhApiTerrainDataCache.java b/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/data/DhApiTerrainDataCache.java
index 5b647bd98..c1ac4b4dc 100644
--- a/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/data/DhApiTerrainDataCache.java
+++ b/core/src/main/java/com/seibel/distanthorizons/core/api/external/methods/data/DhApiTerrainDataCache.java
@@ -13,7 +13,7 @@ import java.lang.ref.SoftReference;
public class DhApiTerrainDataCache implements IDhApiTerrainDataCache
{
private final Object modificationLock = new Object();
- private Long2ReferenceOpenHashMap> posToFullDataRef = new Long2ReferenceOpenHashMap<>();
+ private final Long2ReferenceOpenHashMap> posToFullDataRef = new Long2ReferenceOpenHashMap<>();
private static final DhLogger LOGGER = new DhLoggerBuilder().build();
@@ -22,6 +22,7 @@ public class DhApiTerrainDataCache implements IDhApiTerrainDataCache
//==================//
// internal methods //
//==================//
+ //region
public void add(long pos, FullDataSourceV2 dataSource)
{
@@ -48,11 +49,14 @@ public class DhApiTerrainDataCache implements IDhApiTerrainDataCache
}
}
+ //endregion
+
//=============//
// API methods //
//=============//
+ //region
@Override
public void clear()
@@ -82,6 +86,23 @@ public class DhApiTerrainDataCache implements IDhApiTerrainDataCache
}
}
+ //endregion
+
+
+
+ //================//
+ // base overrides //
+ //================//
+ //region
+
+ @Override
+ public void close() { this.clear(); }
+
+ @Override
+ public String toString() { return "Size: " + this.posToFullDataRef.size(); }
+
+ //endregion
+
}