mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
[+] TEngineServer
[+] TEngineServer
This commit is contained in:
55
Assets/GameScripts/DotNet/Core/IdFactory/EntityIdStruct.cs
Normal file
55
Assets/GameScripts/DotNet/Core/IdFactory/EntityIdStruct.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ca0fd54b2e368d246a01a2e34420a11a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
69
Assets/GameScripts/DotNet/Core/IdFactory/IdFactory.cs
Normal file
69
Assets/GameScripts/DotNet/Core/IdFactory/IdFactory.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
11
Assets/GameScripts/DotNet/Core/IdFactory/IdFactory.cs.meta
Normal file
11
Assets/GameScripts/DotNet/Core/IdFactory/IdFactory.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bcd505cdcef612546b9501632e9f56e8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
44
Assets/GameScripts/DotNet/Core/IdFactory/RouteIdStruct.cs
Normal file
44
Assets/GameScripts/DotNet/Core/IdFactory/RouteIdStruct.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e4db9bed6b0052e409bb43d36c146fd0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
40
Assets/GameScripts/DotNet/Core/IdFactory/RuntimeIdStruct.cs
Normal file
40
Assets/GameScripts/DotNet/Core/IdFactory/RuntimeIdStruct.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e67b19c4b87042949acec08063708f54
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Reference in New Issue
Block a user