{"record":{"id":"93e43c3340081cb5","repo":"EllanJiang/GameFramework","slug":"resource-target-0-dependency-asset-reference-count-is","errorCode":null,"errorMessage":"Resource target '{0}' dependency asset reference count is invalid.","messagePattern":"Resource target '(.+?)' dependency asset reference count is invalid\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Resource/ResourceManager.ResourceLoader.ResourceObject.cs","lineNumber":114,"sourceCode":"                {\n                    if (!isShutdown)\n                    {\n                        int targetReferenceCount = 0;\n                        if (m_ResourceLoader.m_ResourceDependencyCount.TryGetValue(Target, out targetReferenceCount) && targetReferenceCount > 0)\n                        {\n                            throw new GameFrameworkException(Utility.Text.Format(\"Resource target '{0}' reference count is '{1}' larger than 0.\", Name, targetReferenceCount));\n                        }\n\n                        foreach (object dependencyResource in m_DependencyResources)\n                        {\n                            int referenceCount = 0;\n                            if (m_ResourceLoader.m_ResourceDependencyCount.TryGetValue(dependencyResource, out referenceCount))\n                            {\n                                m_ResourceLoader.m_ResourceDependencyCount[dependencyResource] = referenceCount - 1;\n                            }\n                            else\n                            {\n                                throw new GameFrameworkException(Utility.Text.Format(\"Resource target '{0}' dependency asset reference count is invalid.\", Name));\n                            }\n                        }\n                    }\n\n                    m_ResourceLoader.m_ResourceDependencyCount.Remove(Target);\n                    m_ResourceHelper.Release(Target);\n                }\n            }\n        }\n    }\n}\n","sourceCodeStart":96,"sourceCodeEnd":126,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Resource/ResourceManager.ResourceLoader.ResourceObject.cs#L96-L126","documentation":"Thrown by ResourceObject.Release when decrementing a dependency asset's reference count finds no entry in m_ResourceDependencyCount. It indicates the resource object's dependency bookkeeping is inconsistent: the dependency was never registered or was already removed, so releasing it would corrupt counts.","triggerScenarios":"Calling Unspawn/Release on a resource object whose dependency assets were removed from m_ResourceDependencyCount beforehand — e.g. double-releasing the same asset, releasing an asset whose load was partially completed/failed, or mixing load results from different ResourceLoader lifetimes.","commonSituations":"Double-free of an asset handle (release called twice by different systems), releasing assets after the resource manager's pools were rebuilt, or bugs in dependent-asset load failure cleanup leaving partial counts.","solutions":["Ensure each asset is released exactly once — pair every LoadAsset result with a single Unspawn/Release call.","Do not release assets that failed to load or that were never returned as a handle.","Avoid mixing asset handles across resource manager (or ResourceLoader) instances.","Catch GameFrameworkException here and log the asset Name to identify the leaking/double-released object."],"exampleFix":"// before (double release in two systems)\nresourceComponent.Unspawn(asset);\nentityLogic.OnDestroy(); // internally calls Unspawn(asset) again\n// after\nif (!released) { resourceComponent.Unspawn(asset); released = true; }","handlingStrategy":"try-catch","validationCode":"// Track your own handle set to detect double release\nif (!releasedHandles.Add(asset)) throw new InvalidOperationException(\"Asset released twice\");","typeGuard":"bool CanRelease(ResourceObject obj) => obj != null && obj.Target != null;","tryCatchPattern":"try { resourceComponent.Unspawn(asset); }\ncatch (GameFrameworkException ex) { Log.Error(\"Refcount invalid, likely double release: \" + ex.Message); }","preventionTips":["Pair every load with exactly one release/unspawn","Never release assets that failed to load","Do not share handles across ResourceLoader instances","Centralize release logic in one owner"],"tags":["gameframework","resource-management","reference-counting","release","internal-state"],"backgroundTag":"internal-invariant-violation","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}