예제 #1
0
        public static void Release(BlobAssetBatch *batch)
        {
            int newRefCount = Interlocked.Decrement(ref batch->RefCount);

            if (newRefCount <= 0)
            {
                // Debug.Log("Freeing blob");

#if ENABLE_UNITY_COLLECTIONS_CHECKS
                if (newRefCount < 0)
                {
                    throw new InvalidOperationException("BlobAssetBatch refcount is less than zero. It has been corrupted.");
                }

                if (batch->TotalDataSize == 0)
                {
                    throw new InvalidOperationException("BlobAssetBatch has been corrupted. Likely it has already been unloaded or released.");
                }

                var header = (BlobAssetHeader *)(batch + 1);
                for (int i = 0; i != batch->BlobAssetHeaderCount; i++)
                {
                    if (header->ValidationPtr != (header + 1))
                    {
                        throw new InvalidOperationException("The BlobAssetReference has been corrupted. Likely it has already been unloaded or released.");
                    }

                    header->Invalidate();
                    header = (BlobAssetHeader *)(((byte *)(header + 1)) + header->Length);
                }
                header--;

                if (header == (byte *)batch + batch->TotalDataSize)
                {
                    throw new InvalidOperationException("BlobAssetBatch has been corrupted. Likely it has already been unloaded or released.");
                }

                batch->TotalDataSize        = 0;
                batch->BlobAssetHeaderCount = 0;
#endif

                UnsafeUtility.Free(batch, Allocator.Persistent);
            }
        }
예제 #2
0
 public BlobAssetOwner(void *buffer, int expectedTotalDataSize)
 {
     BlobAssetBatchPtr = BlobAssetBatch.CreateFromMemory(buffer, expectedTotalDataSize);
 }
예제 #3
0
 public static void Retain(BlobAssetBatch *batch)
 {
     Interlocked.Increment(ref batch->RefCount);
 }