mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
[+] 接入ET8服务端
[+] 接入ET8服务端
This commit is contained in:
153
Assets/GameScripts/DotNet/Core/Fiber/Fiber.cs
Normal file
153
Assets/GameScripts/DotNet/Core/Fiber/Fiber.cs
Normal file
@@ -0,0 +1,153 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
|
||||
namespace ET
|
||||
{
|
||||
public static class FiberHelper
|
||||
{
|
||||
public static ActorId GetActorId(this Entity self)
|
||||
{
|
||||
Fiber root = self.Fiber();
|
||||
return new ActorId(root.Process, root.Id, self.InstanceId);
|
||||
}
|
||||
}
|
||||
|
||||
public class Fiber: IDisposable
|
||||
{
|
||||
public bool IsDisposed;
|
||||
|
||||
public int Id;
|
||||
|
||||
public int Zone;
|
||||
|
||||
public Scene Root { get; }
|
||||
|
||||
public Address Address
|
||||
{
|
||||
get
|
||||
{
|
||||
return new Address(this.Process, this.Id);
|
||||
}
|
||||
}
|
||||
|
||||
public int Process { get; }
|
||||
|
||||
public EntitySystem EntitySystem { get; }
|
||||
public TimeInfo TimeInfo { get; }
|
||||
public IdGenerater IdGenerater { get; private set; }
|
||||
public Mailboxes Mailboxes { get; private set; }
|
||||
public ThreadSynchronizationContext ThreadSynchronizationContext { get; }
|
||||
|
||||
private EntityRef<TimerComponent> timerCompnent;
|
||||
public TimerComponent TimerComponent
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.timerCompnent;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.timerCompnent = value;
|
||||
}
|
||||
}
|
||||
|
||||
private EntityRef<CoroutineLockComponent> coroutineLockComponent;
|
||||
public CoroutineLockComponent CoroutineLockComponent
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.coroutineLockComponent;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.coroutineLockComponent = value;
|
||||
}
|
||||
}
|
||||
|
||||
private EntityRef<ActorInnerComponent> actorInnerComponent;
|
||||
public ActorInnerComponent ActorInnerComponent
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.actorInnerComponent;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.actorInnerComponent = value;
|
||||
}
|
||||
}
|
||||
|
||||
private readonly Queue<ETTask> frameFinishTasks = new();
|
||||
|
||||
internal Fiber(int id, int process, int zone, SceneType sceneType, string name)
|
||||
{
|
||||
this.Id = id;
|
||||
this.Process = process;
|
||||
this.Zone = zone;
|
||||
this.EntitySystem = new EntitySystem();
|
||||
this.TimeInfo = new TimeInfo();
|
||||
this.IdGenerater = new IdGenerater(process, this.TimeInfo);
|
||||
this.Mailboxes = new Mailboxes();
|
||||
this.ThreadSynchronizationContext = new ThreadSynchronizationContext();
|
||||
this.Root = new Scene(this, id, 1, sceneType, name);
|
||||
}
|
||||
|
||||
internal void Update()
|
||||
{
|
||||
try
|
||||
{
|
||||
this.TimeInfo.Update();
|
||||
this.EntitySystem.Update();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
internal void LateUpdate()
|
||||
{
|
||||
try
|
||||
{
|
||||
this.EntitySystem.LateUpdate();
|
||||
FrameFinishUpdate();
|
||||
|
||||
this.ThreadSynchronizationContext.Update();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
public async ETTask WaitFrameFinish()
|
||||
{
|
||||
ETTask task = ETTask.Create(true);
|
||||
this.frameFinishTasks.Enqueue(task);
|
||||
await task;
|
||||
}
|
||||
|
||||
private void FrameFinishUpdate()
|
||||
{
|
||||
while (this.frameFinishTasks.Count > 0)
|
||||
{
|
||||
ETTask task = this.frameFinishTasks.Dequeue();
|
||||
task.SetResult();
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (this.IsDisposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
this.IsDisposed = true;
|
||||
|
||||
FiberManager.Instance.RemoveReal(this.Id);
|
||||
|
||||
this.Root.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user