您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
158 行
6.5 KiB
158 行
6.5 KiB
using NUnit.Framework;
|
|
using System.Collections.Generic;
|
|
using Unity.Entities;
|
|
using UnityEngine.TestTools;
|
|
using UnityEngine.Experimental.LowLevel;
|
|
using UnityEngine;
|
|
|
|
namespace Unity.Entities.Tests
|
|
{
|
|
public class UpdateOrderOptimizerTests : ECSTestsFixture
|
|
{
|
|
PlayerLoopSystem m_fakePlayerLoop;
|
|
public UpdateOrderOptimizerTests()
|
|
{
|
|
m_fakePlayerLoop.subSystemList = new PlayerLoopSystem[3];
|
|
m_fakePlayerLoop.subSystemList[0].type = typeof(UnityEngine.Experimental.PlayerLoop.Initialization);
|
|
m_fakePlayerLoop.subSystemList[0].subSystemList = new PlayerLoopSystem[0];
|
|
m_fakePlayerLoop.subSystemList[1].type = typeof(UnityEngine.Experimental.PlayerLoop.Update);
|
|
m_fakePlayerLoop.subSystemList[1].subSystemList = new PlayerLoopSystem[2];
|
|
m_fakePlayerLoop.subSystemList[1].subSystemList[0].type = typeof(UnityEngine.Experimental.PlayerLoop.Update.ScriptRunBehaviourUpdate);
|
|
m_fakePlayerLoop.subSystemList[1].subSystemList[1].type = typeof(UnityEngine.Experimental.PlayerLoop.Update.ScriptRunDelayedDynamicFrameRate);
|
|
m_fakePlayerLoop.subSystemList[2].type = typeof(UnityEngine.Experimental.PlayerLoop.PostLateUpdate);
|
|
m_fakePlayerLoop.subSystemList[2].subSystemList = new PlayerLoopSystem[0];
|
|
}
|
|
|
|
[UpdateInGroup(typeof(RecursiveGroup3))]
|
|
class RecursiveGroup1
|
|
{}
|
|
[UpdateInGroup(typeof(RecursiveGroup1))]
|
|
class RecursiveGroup2
|
|
{}
|
|
[UpdateInGroup(typeof(RecursiveGroup2))]
|
|
class RecursiveGroup3
|
|
{}
|
|
|
|
[UpdateInGroup(typeof(RecursiveGroup3))]
|
|
[DisableAutoCreation]
|
|
class RecursiveSystem : ComponentSystem
|
|
{
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
|
|
[UpdateAfter(typeof(SimpleCircularSystem3))]
|
|
[DisableAutoCreation]
|
|
class SimpleCircularSystem1 : ComponentSystem
|
|
{
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
[UpdateAfter(typeof(SimpleCircularSystem1))]
|
|
[DisableAutoCreation]
|
|
class SimpleCircularSystem2 : ComponentSystem
|
|
{
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
[UpdateAfter(typeof(SimpleCircularSystem2))]
|
|
[DisableAutoCreation]
|
|
class SimpleCircularSystem3 : ComponentSystem
|
|
{
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
[UpdateAfter(typeof(UnityEngine.Experimental.PlayerLoop.Update))]
|
|
[UpdateAfter(typeof(UnityEngine.Experimental.PlayerLoop.Initialization))]
|
|
[DisableAutoCreation]
|
|
class SimpleOverconstrainedSystem : ComponentSystem
|
|
{
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
[UpdateAfter(typeof(UnityEngine.Experimental.PlayerLoop.Update))]
|
|
[DisableAutoCreation]
|
|
class OverconstrainedSystem1 : ComponentSystem
|
|
{
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
[UpdateAfter(typeof(OverconstrainedSystem1))]
|
|
[UpdateBefore(typeof(OverconstrainedSystem3))]
|
|
[DisableAutoCreation]
|
|
class OverconstrainedSystem2 : ComponentSystem
|
|
{
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
[UpdateAfter(typeof(UnityEngine.Experimental.PlayerLoop.Initialization))]
|
|
[DisableAutoCreation]
|
|
class OverconstrainedSystem3 : ComponentSystem
|
|
{
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
|
|
// UpdatePlayerLoop handles nulls so that users of the API don't have to deal with setting the default loop
|
|
[Test]
|
|
public void NullWorldsDontThrow()
|
|
{
|
|
Assert.DoesNotThrow(() => ScriptBehaviourUpdateOrder.UpdatePlayerLoop(null));
|
|
Assert.DoesNotThrow(() => ScriptBehaviourUpdateOrder.UpdatePlayerLoop(new World[] {World.Active, null}));
|
|
}
|
|
|
|
[Test]
|
|
public void RecursiveGroupIsError()
|
|
{
|
|
LogAssert.Expect(LogType.Error, new System.Text.RegularExpressions.Regex("Found circular chain in update groups involving:"));
|
|
|
|
var systems = new HashSet<ScriptBehaviourManager>();
|
|
systems.Add(new RecursiveSystem());
|
|
ScriptBehaviourUpdateOrder.InsertManagersInPlayerLoop(systems, m_fakePlayerLoop);
|
|
}
|
|
[Test]
|
|
public void CircularDependencyIsError()
|
|
{
|
|
// The error is triggered for each system in a chain, not for each chain - so there will be three errors
|
|
LogAssert.Expect(LogType.Error, new System.Text.RegularExpressions.Regex("is in a chain of circular dependencies"));
|
|
LogAssert.Expect(LogType.Error, new System.Text.RegularExpressions.Regex("is in a chain of circular dependencies"));
|
|
LogAssert.Expect(LogType.Error, new System.Text.RegularExpressions.Regex("is in a chain of circular dependencies"));
|
|
|
|
var systems = new HashSet<ScriptBehaviourManager>();
|
|
systems.Add(new SimpleCircularSystem1());
|
|
systems.Add(new SimpleCircularSystem2());
|
|
systems.Add(new SimpleCircularSystem3());
|
|
ScriptBehaviourUpdateOrder.InsertManagersInPlayerLoop(systems, m_fakePlayerLoop);
|
|
}
|
|
[Test]
|
|
public void OverConstrainedEngineIsError()
|
|
{
|
|
// The error is triggered for each system in a chain, not for each chain - so there will be three errors
|
|
LogAssert.Expect(LogType.Error, new System.Text.RegularExpressions.Regex("is over constrained with engine containts"));
|
|
|
|
var systems = new HashSet<ScriptBehaviourManager>();
|
|
systems.Add(new SimpleOverconstrainedSystem());
|
|
ScriptBehaviourUpdateOrder.InsertManagersInPlayerLoop(systems, m_fakePlayerLoop);
|
|
}
|
|
[Test]
|
|
public void OverConstrainedEngineAndSystemIsError()
|
|
{
|
|
// The error is triggered for each system in a chain, not for each chain - so there will be three errors
|
|
LogAssert.Expect(LogType.Error, new System.Text.RegularExpressions.Regex("is over constrained with engine and system containts"));
|
|
|
|
var systems = new HashSet<ScriptBehaviourManager>();
|
|
systems.Add(new OverconstrainedSystem1());
|
|
systems.Add(new OverconstrainedSystem2());
|
|
systems.Add(new OverconstrainedSystem3());
|
|
ScriptBehaviourUpdateOrder.InsertManagersInPlayerLoop(systems, m_fakePlayerLoop);
|
|
}
|
|
}
|
|
}
|