您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

200 行
5.5 KiB

using System;
using System.IO;
using System.Text;
using Unity.Collections;
using NUnit.Framework;
using Unity.Entities;
using UnityEngine;
using System.Collections.Generic;
using UnityEditor.VersionControl;
namespace Unity.Entities.Tests
{
public struct Issue149Data : IComponentData
{
public int a;
public int b;
}
public class Bug149 : ECSTestsFixture
{
private EntityArchetype m_Archetype;
private const int kBatchCount = 512;
private class EntityBag
{
public NativeArray<Entity> Entities;
public int ValidVersion;
}
private EntityBag[] Bags = new EntityBag[3];
[Test]
public void TestIssue149()
{
m_Archetype = m_Manager.CreateArchetype(typeof(Issue149Data));
for (int i = 0; i < Bags.Length; ++i)
{
Bags[i] = new EntityBag();
}
var a = Bags[0];
var b = Bags[1];
var c = Bags[2];
try
{
RecycleEntities(a);
RecycleEntities(b);
RecycleEntities(c);
RecycleEntities(a);
RecycleEntities(b);
RecycleEntities(a);
RecycleEntities(c);
RecycleEntities(a);
RecycleEntities(a);
RecycleEntities(b);
RecycleEntities(a);
RecycleEntities(c);
RecycleEntities(a);
}
finally
{
// To get rid of leak errors in the log when the test fails.
a.Entities.Dispose();
b.Entities.Dispose();
c.Entities.Dispose();
}
}
private void RecycleEntities(EntityBag bag)
{
if (bag.Entities.Length > 0)
{
m_Manager.DestroyEntity(bag.Entities);
bag.Entities.Dispose();
}
bag.ValidVersion++;
// Sanity check all arrays.
SanityCheckVersions();
bag.Entities = new NativeArray<Entity>(kBatchCount, Allocator.Persistent);
for (int i = 0; i < bag.Entities.Length; ++i)
{
bag.Entities[i] = m_Manager.CreateEntity(m_Archetype);
}
}
private static readonly ComponentType[] s_OurTypes = new ComponentType[] {
typeof(Issue149Data)
};
// Walk all accessible entity data and check that the versions match what we
// believe the generation numbers should be.
private void SanityCheckVersions()
{
var query = new EntityArchetypeQuery
{
Any = Array.Empty<ComponentType>(),
None = Array.Empty<ComponentType>(),
All = s_OurTypes,
};
var chunks = m_Manager.CreateArchetypeChunkArray(query, Allocator.TempJob);
ArchetypeChunkEntityType entityType = m_Manager.GetArchetypeChunkEntityType();
for (int i = 0; i < chunks.Length; ++i)
{
ArchetypeChunk chunk = chunks[i];
var entitiesInChunk = chunk.GetNativeArray(entityType);
for (int k = 0; k < chunk.Count; ++k)
{
Entity e = entitiesInChunk[k];
int index = e.Index;
int version = e.Version;
int ourArray = index / kBatchCount;
int ourVersion = Bags[ourArray].ValidVersion;
Assert.IsTrue(ourVersion == version);
}
}
chunks.Dispose();
}
}
public class Bug148
{
[Test]
public void Test1()
{
World w = new World("TestWorld");
World.Active = w;
EntityManager em = World.Active.GetOrCreateManager<EntityManager>();
List<Entity> remember = new List<Entity>();
for (int i = 0; i < 5; i++)
{
remember.Add(em.CreateEntity());
}
var allEnt = em.GetAllEntities(Allocator.Temp);
allEnt.Dispose();
foreach (Entity e in remember)
{
Assert.IsTrue(em.Exists(e));
}
foreach (Entity e in remember)
{
em.DestroyEntity(e);
}
}
[Test]
public void Test2()
{
World w = new World("TestWorld");
World.Active = w;
EntityManager em = World.Active.GetOrCreateManager<EntityManager>();
List<Entity> remember = new List<Entity>();
for (int i = 0; i < 5; i++)
{
remember.Add(em.CreateEntity());
}
w = null;
World.DisposeAllWorlds();
w = new World("TestWorld2");
World.Active = w;
em = World.Active.GetOrCreateManager<EntityManager>();
var allEnt = em.GetAllEntities(Allocator.Temp);
Assert.AreEqual(0, allEnt.Length);
allEnt.Dispose();
foreach (Entity e in remember)
{
bool exists = em.Exists(e);
Assert.IsFalse(exists);
}
foreach (Entity e in remember)
{
if (em.Exists(e))
{
em.DestroyEntity(e);
}
}
World.DisposeAllWorlds();
}
}
}