message JIT preload
parent
67ac748a29
commit
d8a5cd6493
|
@ -1,12 +1,7 @@
|
|||
namespace Encompass
|
||||
namespace Encompass
|
||||
{
|
||||
internal class ComponentEmitter<TComponent> : Engine where TComponent : struct, IComponent
|
||||
{
|
||||
public ComponentEmitter()
|
||||
{
|
||||
sendTypes.Add(typeof(TComponent));
|
||||
}
|
||||
|
||||
public override void Update(double dt)
|
||||
{
|
||||
foreach (var (component, entity) in InternalRead<TComponent>())
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Encompass
|
||||
|
@ -7,13 +8,17 @@ namespace Encompass
|
|||
internal class UberEngine : Engine
|
||||
{
|
||||
private IEnumerable<Type> _componentTypes;
|
||||
private IEnumerable<Type> _messageTypes;
|
||||
private Entity _entity;
|
||||
|
||||
public UberEngine(Entity entity, IEnumerable<Type> componentTypes)
|
||||
public UberEngine(Entity entity, IEnumerable<Type> componentTypes, IEnumerable<Type> messageTypes)
|
||||
{
|
||||
_componentTypes = componentTypes;
|
||||
_messageTypes = messageTypes;
|
||||
readTypes.UnionWith(componentTypes);
|
||||
writeTypes.UnionWith(componentTypes);
|
||||
sendTypes.UnionWith(messageTypes);
|
||||
receiveTypes.UnionWith(messageTypes);
|
||||
_entity = entity;
|
||||
}
|
||||
|
||||
|
@ -43,6 +48,16 @@ namespace Encompass
|
|||
CallGenericMethod(type, "DestroyWith", null);
|
||||
CallGenericMethod(type, "DestroyAllWith", null);
|
||||
}
|
||||
|
||||
foreach (var type in _messageTypes)
|
||||
{
|
||||
CallGenericMethod(type, "SendMessageIgnoringTimeDilation", new object[] { Activator.CreateInstance(type), 1 });
|
||||
CallGenericMethod(type, "SendMessage", 1, new object[] { Activator.CreateInstance(type) });
|
||||
CallGenericMethod(type, "SendMessage", 2, new object[] { Activator.CreateInstance(type), 1 });
|
||||
CallGenericMethod(type, "ReadMessage", null);
|
||||
CallGenericMethod(type, "ReadMessages", null);
|
||||
CallGenericMethod(type, "SomeMessage", null);
|
||||
}
|
||||
}
|
||||
|
||||
private void CallGenericMethod(Type type, string methodName, object[] parameters)
|
||||
|
@ -58,5 +73,12 @@ namespace Encompass
|
|||
var genericReadComponentMethod = readComponentMethod.MakeGenericMethod(type);
|
||||
genericReadComponentMethod.Invoke(this, parameters);
|
||||
}
|
||||
|
||||
private void CallGenericMethod(Type type, string methodName, int argumentNum, object[] parameters)
|
||||
{
|
||||
var method = typeof(Engine).GetRuntimeMethods().Where(m => m.Name == methodName && m.GetParameters().Length == argumentNum).First();
|
||||
var genericMethod = method.MakeGenericMethod(type);
|
||||
genericMethod.Invoke(this, parameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Linq;
|
||||
|
@ -37,6 +37,8 @@ namespace Encompass
|
|||
|
||||
private readonly HashSet<Type> componentTypesToRegister = new HashSet<Type>();
|
||||
|
||||
private readonly HashSet<Type> messageTypes = new HashSet<Type>();
|
||||
|
||||
public WorldBuilder()
|
||||
{
|
||||
drawLayerManager = new DrawLayerManager();
|
||||
|
@ -98,6 +100,11 @@ namespace Encompass
|
|||
startingComponentStoreForComponentUpdateManager.RegisterComponentType<TComponent>();
|
||||
}
|
||||
|
||||
internal void RegisterMessageTypes(IEnumerable<Type> types)
|
||||
{
|
||||
messageTypes.UnionWith(types);
|
||||
}
|
||||
|
||||
internal void AddComponentTypeToRegister(Type componentType)
|
||||
{
|
||||
componentTypesToRegister.Add(componentType);
|
||||
|
@ -121,6 +128,8 @@ namespace Encompass
|
|||
var messageReceiveTypes = engine.receiveTypes;
|
||||
var messageSendTypes = engine.sendTypes;
|
||||
|
||||
RegisterMessageTypes(engine.receiveTypes.Union(engine.sendTypes));
|
||||
|
||||
foreach (var writePendingType in engine.writePendingTypes.Intersect(engine.readPendingTypes))
|
||||
{
|
||||
throw new EngineSelfCycleException("Engine {0} both writes and reads pending Component {1}", engine.GetType().Name, writePendingType.Name);
|
||||
|
@ -352,7 +361,7 @@ namespace Encompass
|
|||
engineOrder.Add(emitterEngine);
|
||||
}
|
||||
|
||||
PreloadJIT(componentTypesToRegister);
|
||||
PreloadJIT(componentTypesToRegister, messageTypes);
|
||||
|
||||
foreach (var engine in engineGraph.TopologicalSort())
|
||||
{
|
||||
|
@ -379,7 +388,7 @@ namespace Encompass
|
|||
/// This is necessary because Encompass heavily uses generic methods with value types,
|
||||
/// so the first time any code path runs the JIT gets smashed. This method warms up the runtime.
|
||||
/// </summary>
|
||||
private void PreloadJIT(IEnumerable<Type> componentTypes)
|
||||
private void PreloadJIT(IEnumerable<Type> componentTypes, IEnumerable<Type> messageTypes)
|
||||
{
|
||||
var dummyTimeManager = new TimeManager();
|
||||
var dummyMessageManager = new MessageManager(dummyTimeManager);
|
||||
|
@ -390,7 +399,7 @@ namespace Encompass
|
|||
var dummyRenderManager = new RenderManager(dummyDrawLayerManager);
|
||||
|
||||
var prepEngineOrder = new List<Engine>();
|
||||
var uberEngine = new UberEngine(dummyEntityManager.CreateEntity(), componentTypes);
|
||||
var uberEngine = new UberEngine(dummyEntityManager.CreateEntity(), componentTypes, messageTypes);
|
||||
|
||||
uberEngine.AssignEntityManager(dummyEntityManager);
|
||||
uberEngine.AssignComponentManager(dummyComponentManager);
|
||||
|
|
Loading…
Reference in New Issue