{"record":{"id":"7f9abe23c0858d25","repo":"EllanJiang/GameFramework","slug":"asset-target-0-dependency-asset-reference-count-is-invalid","errorCode":null,"errorMessage":"Asset target '{0}' dependency asset reference count is invalid.","messagePattern":"Asset target '(.+?)' dependency asset reference count is invalid\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Resource/ResourceManager.ResourceLoader.AssetObject.cs","lineNumber":127,"sourceCode":"                {\n                    if (!isShutdown)\n                    {\n                        int targetReferenceCount = 0;\n                        if (m_ResourceLoader.m_AssetDependencyCount.TryGetValue(Target, out targetReferenceCount) && targetReferenceCount > 0)\n                        {\n                            throw new GameFrameworkException(Utility.Text.Format(\"Asset target '{0}' reference count is '{1}' larger than 0.\", Name, targetReferenceCount));\n                        }\n\n                        foreach (object dependencyAsset in m_DependencyAssets)\n                        {\n                            int referenceCount = 0;\n                            if (m_ResourceLoader.m_AssetDependencyCount.TryGetValue(dependencyAsset, out referenceCount))\n                            {\n                                m_ResourceLoader.m_AssetDependencyCount[dependencyAsset] = referenceCount - 1;\n                            }\n                            else\n                            {\n                                throw new GameFrameworkException(Utility.Text.Format(\"Asset target '{0}' dependency asset reference count is invalid.\", Name));\n                            }\n                        }\n\n                        m_ResourceLoader.m_ResourcePool.Unspawn(m_Resource);\n                    }\n\n                    m_ResourceLoader.m_AssetDependencyCount.Remove(Target);\n                    m_ResourceLoader.m_AssetToResourceMap.Remove(Target);\n                    m_ResourceHelper.Release(Target);\n                }\n            }\n        }\n    }\n}\n","sourceCodeStart":109,"sourceCodeEnd":142,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Resource/ResourceManager.ResourceLoader.AssetObject.cs#L109-L142","documentation":"During AssetObject.Release, the loader decrements the dependency reference count for each dependency asset. If a dependency asset has no entry in m_AssetDependencyCount at all, the counts are out of sync with what was recorded at load time, so the framework throws. This indicates the dependency bookkeeping was corrupted or the asset object state diverged from the loader's dictionaries.","triggerScenarios":"Releasing an AssetObject whose m_DependencyAssets contains entries never registered in m_AssetDependencyCount (e.g. counts already removed by a prior release, or dependency list mutated after Create).","commonSituations":"Calling UnloadAsset twice on the same asset; mixing manual AssetObject manipulation with the loader's ref counting; loader state reset (dictionary cleared) while AssetObjects still held.","solutions":["Ensure each asset is unloaded exactly once — guard against double UnloadAsset calls.","Keep all AssetObject creation/release through ResourceLoader so dependency counts are incremented/decremented symmetrically.","If you clear or reset loader dictionaries, release all live AssetObjects first.","Log Name and the dependency list at release time to find which dependency lost its count entry."],"exampleFix":"// before\nif (m_Loaded) { loader.UnloadAsset(asset); } // flag not reset, second call throws\n// after\nif (m_Loaded) { loader.UnloadAsset(asset); m_Loaded = false; }","handlingStrategy":"validation","validationCode":"bool CanUnload(object asset) => m_UnloadedAssets.Add(asset); // returns false on duplicate unload\nif (!CanUnload(asset)) return;","typeGuard":null,"tryCatchPattern":"try { loader.UnloadAsset(asset); }\ncatch (GameFrameworkException ex) { Log.Error(\"Dependency count out of sync for {0}: {1}\", assetName, ex.Message); }","preventionTips":["Guard every UnloadAsset with an is-loaded flag.","Route all create/release through ResourceLoader only.","Never clear loader dictionaries while assets are live."],"tags":["reference-counting","resource","lifecycle","gameframework"],"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-15T23:17:13.987Z"}