[+] TEngineServer

[+] TEngineServer
This commit is contained in:
ALEXTANG
2023-07-13 17:17:26 +08:00
parent a69f53592e
commit 0c8f3a5f92
790 changed files with 52737 additions and 2533 deletions

View File

@@ -0,0 +1,55 @@
using System.Runtime.InteropServices;
namespace TEngine.Core
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct EntityIdStruct
{
// +-------------------+----------------------+-------------------------+----------------------------------+
// | time(30) 最大34年 | AppId(8) 最多255个进程 | WordId(10) 最多1023个世界 | sequence(16) 每毫秒每个进程能生产65535个
// +-------------------+----------------------+-------------------------+----------------------------------+
// 这样算下来、每个世界都有255个进程、就算WOW的游戏一个区也用不到255个进程
// 计算下每个世界255个进程也就是1023 * 255 = 260865个进程、完全够用了
// 但有一个问题是游戏最大只能有1023个区了、但可以通过战区手段来解决这个问题
public uint Time{ get; private set; }
public uint Sequence{ get; private set; }
public uint RouteId { get; private set; }
public ushort AppId => (ushort)(RouteId >> 10 & RouteIdStruct.MaskAppId);
public ushort WordId=> (ushort)(RouteId & RouteIdStruct.MaskWordId);
public const int MaskRouteId = 0x3FFFF;
public const int MaskSequence = 0xFFFF;
public EntityIdStruct(uint routeId, uint time, uint sequence)
{
Time = time;
Sequence = sequence;
RouteId = routeId;
}
public static implicit operator long(EntityIdStruct entityIdStruct)
{
ulong result = 0;
result |= entityIdStruct.Sequence;
result |= (ulong)entityIdStruct.RouteId << 16;
result |= (ulong)entityIdStruct.Time << 34;
return (long)result;
}
public static implicit operator EntityIdStruct(long id)
{
var result = (ulong) id;
var idStruct = new EntityIdStruct()
{
Sequence = (uint) (result & MaskSequence)
};
result >>= 16;
idStruct.RouteId = (uint) (result & 0x3FFFF);
result >>= 18;
idStruct.Time = (uint) result;
return idStruct;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ca0fd54b2e368d246a01a2e34420a11a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,69 @@
using System;
namespace TEngine.Core
{
public static class IdFactory
{
private static readonly long Epoch1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks / 10000;
private static readonly long Epoch2023 = new DateTime(2023, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks / 10000 - Epoch1970;
private static readonly long EpochThisYear = new DateTime(DateTime.Now.Year, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks / 10000 - Epoch1970;
private static uint _lastRunTimeIdTime;
private static uint _lastRunTimeIdSequence;
private static uint _lastEntityIdTime;
private static uint _lastEntityIdSequence;
public static long NextRunTimeId()
{
var time = (uint) ((TimeHelper.Now - EpochThisYear) / 1000);
if (time > _lastRunTimeIdTime)
{
_lastRunTimeIdTime = time;
_lastRunTimeIdSequence = 0;
}
else if (++_lastRunTimeIdSequence > uint.MaxValue - 1)
{
++_lastRunTimeIdTime;
_lastRunTimeIdSequence = 0;
}
return new RuntimeIdStruct(_lastRunTimeIdTime, _lastRunTimeIdSequence);
}
public static long NextEntityId(uint routeId)
{
var time = (uint)((TimeHelper.Now - Epoch2023) / 1000);
if (time > _lastEntityIdTime)
{
_lastEntityIdTime = time;
_lastEntityIdSequence = 0;
}
else if (++_lastEntityIdSequence > EntityIdStruct.MaskSequence - 1)
{
++_lastEntityIdTime;
_lastEntityIdSequence = 0;
}
return new EntityIdStruct(routeId, _lastEntityIdTime, _lastEntityIdSequence);
}
public static uint GetRouteId(long entityId)
{
return (ushort)(entityId >> 16 & EntityIdStruct.MaskRouteId);
}
public static ushort GetAppId(long entityId)
{
return (ushort)(entityId >> 26 & RouteIdStruct.MaskAppId);
}
public static int GetWordId(long entityId)
{
return (ushort)(entityId >> 16 & RouteIdStruct.MaskWordId);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bcd505cdcef612546b9501632e9f56e8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,44 @@
using System.Runtime.InteropServices;
namespace TEngine.Core
{
// +----------------------+---------------------------+
// | AppId(8) 最多255个进程 | WordId(10) 最多1023个世界
// +----------------------+---------------------------+
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct RouteIdStruct
{
public ushort AppId;
public ushort WordId;
public const int MaskAppId = 0xFF;
public const int MaskWordId = 0x3FF;
public RouteIdStruct(ushort appId, ushort wordId)
{
AppId = appId;
WordId = wordId;
}
public static implicit operator uint(RouteIdStruct routeId)
{
uint result = 0;
result |= routeId.WordId;
result |= (uint)routeId.AppId << 10;
return result;
}
public static implicit operator RouteIdStruct(uint routeId)
{
var idStruct = new RouteIdStruct()
{
WordId = (ushort)(routeId & MaskWordId)
};
routeId >>= 10;
idStruct.AppId = (ushort)(routeId & MaskAppId);
return idStruct;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e4db9bed6b0052e409bb43d36c146fd0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,40 @@
using System.Runtime.InteropServices;
namespace TEngine.Core
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct RuntimeIdStruct
{
// +----------+------------+
// | time(32) | sequence(32)
// +----------+------------+
private uint Time;
private uint Sequence;
public RuntimeIdStruct(uint time, uint sequence)
{
Time = time;
Sequence = sequence;
}
public static implicit operator long(RuntimeIdStruct runtimeId)
{
ulong result = 0;
result |= runtimeId.Sequence;
result |= (ulong) runtimeId.Time << 32;
return (long) result;
}
public static implicit operator RuntimeIdStruct(long id)
{
var result = (ulong) id;
var idStruct = new RuntimeIdStruct()
{
Time = (uint) (result >> 32),
Sequence = (uint) (result & 0xFFFFFFFF)
};
return idStruct;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e67b19c4b87042949acec08063708f54
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: