mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
Kcp 最佳实践
Kcp 最佳实践
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: db9ced8ef8f2e9545a2a749dcb909f3f
|
||||
guid: 454f6287cca1ad140aa09757624c67f6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
1200
Assets/TEngine/Runtime/Net/Kcp/Kcp1/ByteBuffer.cs
Normal file
1200
Assets/TEngine/Runtime/Net/Kcp/Kcp1/ByteBuffer.cs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4506f7a0cebc42043b734e5824a21f76
|
||||
guid: 886c48d92cb0ea4419c8131cf0b2f865
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
1151
Assets/TEngine/Runtime/Net/Kcp/Kcp1/KCP.cs
Normal file
1151
Assets/TEngine/Runtime/Net/Kcp/Kcp1/KCP.cs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 302145da5b949d148965c386a09371c0
|
||||
guid: 1b33a27a75114b7488254dac4703efad
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
158
Assets/TEngine/Runtime/Net/Kcp/Kcp1/KCPSession.cs
Normal file
158
Assets/TEngine/Runtime/Net/Kcp/Kcp1/KCPSession.cs
Normal file
@@ -0,0 +1,158 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
|
||||
namespace KcpProject
|
||||
{
|
||||
class KCPSession
|
||||
{
|
||||
private Socket mSocket = null;
|
||||
private KCP mKCP = null;
|
||||
|
||||
private ByteBuffer mRecvBuffer = ByteBuffer.Allocate(1024 * 32);
|
||||
private UInt32 mNextUpdateTime = 0;
|
||||
|
||||
public bool IsConnected { get { return mSocket != null && mSocket.Connected; } }
|
||||
public bool WriteDelay { get; set; }
|
||||
public bool AckNoDelay { get; set; }
|
||||
|
||||
public IPEndPoint RemoteAddress { get; private set; }
|
||||
public IPEndPoint LocalAddress { get; private set; }
|
||||
|
||||
public void Connect(string host, int port)
|
||||
{
|
||||
IPHostEntry hostEntry = Dns.GetHostEntry(host);
|
||||
if (hostEntry.AddressList.Length == 0)
|
||||
{
|
||||
throw new Exception("Unable to resolve host: " + host);
|
||||
}
|
||||
var endpoint = hostEntry.AddressList[0];
|
||||
mSocket = new Socket(endpoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
|
||||
mSocket.Connect(endpoint, port);
|
||||
RemoteAddress = (IPEndPoint)mSocket.RemoteEndPoint;
|
||||
LocalAddress = (IPEndPoint)mSocket.LocalEndPoint;
|
||||
mKCP = new KCP((uint)(new Random().Next(1, Int32.MaxValue)), rawSend);
|
||||
// normal: 0, 40, 2, 1
|
||||
// fast: 0, 30, 2, 1
|
||||
// fast2: 1, 20, 2, 1
|
||||
// fast3: 1, 10, 2, 1
|
||||
mKCP.NoDelay(1, 20, 2, 1);
|
||||
mKCP.SetStreamMode(true);
|
||||
mRecvBuffer.Clear();
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
if (mSocket != null) {
|
||||
mSocket.Close();
|
||||
mSocket = null;
|
||||
mRecvBuffer.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
private void rawSend(byte[] data, int length)
|
||||
{
|
||||
if (mSocket != null) {
|
||||
mSocket.Send(data, length, SocketFlags.None);
|
||||
}
|
||||
}
|
||||
|
||||
public int Send(byte[] data, int index, int length)
|
||||
{
|
||||
if (mSocket == null)
|
||||
return -1;
|
||||
|
||||
var waitsnd = mKCP.WaitSnd;
|
||||
if (waitsnd < mKCP.SndWnd && waitsnd < mKCP.RmtWnd) {
|
||||
|
||||
var sendBytes = 0;
|
||||
do {
|
||||
var n = Math.Min((int)mKCP.Mss, length - sendBytes);
|
||||
mKCP.Send(data, index + sendBytes, n);
|
||||
sendBytes += n;
|
||||
} while (sendBytes < length);
|
||||
|
||||
waitsnd = mKCP.WaitSnd;
|
||||
if (waitsnd >= mKCP.SndWnd || waitsnd >= mKCP.RmtWnd || !WriteDelay) {
|
||||
mKCP.Flush(false);
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int Recv(byte[] data, int index, int length)
|
||||
{
|
||||
// 上次剩下的部分
|
||||
if (mRecvBuffer.ReadableBytes > 0) {
|
||||
var recvBytes = Math.Min(mRecvBuffer.ReadableBytes, length);
|
||||
Buffer.BlockCopy(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, data, index, recvBytes);
|
||||
mRecvBuffer.ReaderIndex += recvBytes;
|
||||
// 读完重置读写指针
|
||||
if (mRecvBuffer.ReaderIndex == mRecvBuffer.WriterIndex) {
|
||||
mRecvBuffer.Clear();
|
||||
}
|
||||
return recvBytes;
|
||||
}
|
||||
|
||||
if (mSocket == null)
|
||||
return -1;
|
||||
|
||||
if (!mSocket.Poll(0, SelectMode.SelectRead)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
var rn = 0;
|
||||
try {
|
||||
rn = mSocket.Receive(mRecvBuffer.RawBuffer, mRecvBuffer.WriterIndex, mRecvBuffer.WritableBytes, SocketFlags.None);
|
||||
} catch(Exception ex) {
|
||||
UnityEngine.Debug.LogError(ex);
|
||||
rn = -1;
|
||||
}
|
||||
|
||||
if (rn <= 0) {
|
||||
return rn;
|
||||
}
|
||||
mRecvBuffer.WriterIndex += rn;
|
||||
|
||||
var inputN = mKCP.Input(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, mRecvBuffer.ReadableBytes, true, AckNoDelay);
|
||||
if (inputN < 0) {
|
||||
mRecvBuffer.Clear();
|
||||
return inputN;
|
||||
}
|
||||
mRecvBuffer.Clear();
|
||||
|
||||
// 读完所有完整的消息
|
||||
for (;;) {
|
||||
var size = mKCP.PeekSize();
|
||||
if (size <= 0) break;
|
||||
|
||||
mRecvBuffer.EnsureWritableBytes(size);
|
||||
|
||||
var n = mKCP.Recv(mRecvBuffer.RawBuffer, mRecvBuffer.WriterIndex, size);
|
||||
if (n > 0) mRecvBuffer.WriterIndex += n;
|
||||
}
|
||||
|
||||
// 有数据待接收
|
||||
if (mRecvBuffer.ReadableBytes > 0) {
|
||||
return Recv(data, index, length);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void Update()
|
||||
{
|
||||
if (mSocket == null)
|
||||
return;
|
||||
|
||||
if (0 == mNextUpdateTime || mKCP.CurrentMS >= mNextUpdateTime)
|
||||
{
|
||||
mKCP.Update();
|
||||
mNextUpdateTime = mKCP.Check();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
11
Assets/TEngine/Runtime/Net/Kcp/Kcp1/KCPSession.cs.meta
Normal file
11
Assets/TEngine/Runtime/Net/Kcp/Kcp1/KCPSession.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ae3b5d0742eaa4440b71c417a13d8a6f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
341
Assets/TEngine/Runtime/Net/Kcp/Kcp1/Kcp.unity
Normal file
341
Assets/TEngine/Runtime/Net/Kcp/Kcp1/Kcp.unity
Normal file
@@ -0,0 +1,341 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!29 &1
|
||||
OcclusionCullingSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_OcclusionBakeSettings:
|
||||
smallestOccluder: 5
|
||||
smallestHole: 0.25
|
||||
backfaceThreshold: 100
|
||||
m_SceneGUID: 00000000000000000000000000000000
|
||||
m_OcclusionCullingData: {fileID: 0}
|
||||
--- !u!104 &2
|
||||
RenderSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 9
|
||||
m_Fog: 0
|
||||
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||
m_FogMode: 3
|
||||
m_FogDensity: 0.01
|
||||
m_LinearFogStart: 0
|
||||
m_LinearFogEnd: 300
|
||||
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
|
||||
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
|
||||
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
|
||||
m_AmbientIntensity: 1
|
||||
m_AmbientMode: 0
|
||||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
|
||||
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_HaloStrength: 0.5
|
||||
m_FlareStrength: 1
|
||||
m_FlareFadeSpeed: 3
|
||||
m_HaloTexture: {fileID: 0}
|
||||
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_DefaultReflectionMode: 0
|
||||
m_DefaultReflectionResolution: 128
|
||||
m_ReflectionBounces: 1
|
||||
m_ReflectionIntensity: 1
|
||||
m_CustomReflection: {fileID: 0}
|
||||
m_Sun: {fileID: 0}
|
||||
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_UseRadianceAmbientProbe: 0
|
||||
--- !u!157 &3
|
||||
LightmapSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 11
|
||||
m_GIWorkflowMode: 1
|
||||
m_GISettings:
|
||||
serializedVersion: 2
|
||||
m_BounceScale: 1
|
||||
m_IndirectOutputScale: 1
|
||||
m_AlbedoBoost: 1
|
||||
m_EnvironmentLightingMode: 0
|
||||
m_EnableBakedLightmaps: 1
|
||||
m_EnableRealtimeLightmaps: 0
|
||||
m_LightmapEditorSettings:
|
||||
serializedVersion: 12
|
||||
m_Resolution: 2
|
||||
m_BakeResolution: 40
|
||||
m_AtlasSize: 1024
|
||||
m_AO: 0
|
||||
m_AOMaxDistance: 1
|
||||
m_CompAOExponent: 1
|
||||
m_CompAOExponentDirect: 0
|
||||
m_ExtractAmbientOcclusion: 0
|
||||
m_Padding: 2
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_LightmapsBakeMode: 1
|
||||
m_TextureCompression: 1
|
||||
m_FinalGather: 0
|
||||
m_FinalGatherFiltering: 1
|
||||
m_FinalGatherRayCount: 256
|
||||
m_ReflectionCompression: 2
|
||||
m_MixedBakeMode: 2
|
||||
m_BakeBackend: 1
|
||||
m_PVRSampling: 1
|
||||
m_PVRDirectSampleCount: 32
|
||||
m_PVRSampleCount: 512
|
||||
m_PVRBounces: 2
|
||||
m_PVREnvironmentSampleCount: 256
|
||||
m_PVREnvironmentReferencePointCount: 2048
|
||||
m_PVRFilteringMode: 1
|
||||
m_PVRDenoiserTypeDirect: 1
|
||||
m_PVRDenoiserTypeIndirect: 1
|
||||
m_PVRDenoiserTypeAO: 1
|
||||
m_PVRFilterTypeDirect: 0
|
||||
m_PVRFilterTypeIndirect: 0
|
||||
m_PVRFilterTypeAO: 0
|
||||
m_PVREnvironmentMIS: 1
|
||||
m_PVRCulling: 1
|
||||
m_PVRFilteringGaussRadiusDirect: 1
|
||||
m_PVRFilteringGaussRadiusIndirect: 5
|
||||
m_PVRFilteringGaussRadiusAO: 2
|
||||
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
|
||||
m_PVRFilteringAtrousPositionSigmaIndirect: 2
|
||||
m_PVRFilteringAtrousPositionSigmaAO: 1
|
||||
m_ExportTrainingData: 0
|
||||
m_TrainingDataDestination: TrainingData
|
||||
m_LightProbeSampleCountMultiplier: 4
|
||||
m_LightingDataAsset: {fileID: 0}
|
||||
m_UseShadowmask: 1
|
||||
--- !u!196 &4
|
||||
NavMeshSettings:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_BuildSettings:
|
||||
serializedVersion: 2
|
||||
agentTypeID: 0
|
||||
agentRadius: 0.5
|
||||
agentHeight: 2
|
||||
agentSlope: 45
|
||||
agentClimb: 0.4
|
||||
ledgeDropHeight: 0
|
||||
maxJumpAcrossDistance: 0
|
||||
minRegionArea: 2
|
||||
manualCellSize: 0
|
||||
cellSize: 0.16666667
|
||||
manualTileSize: 0
|
||||
tileSize: 256
|
||||
accuratePlacement: 0
|
||||
debug:
|
||||
m_Flags: 0
|
||||
m_NavMeshData: {fileID: 0}
|
||||
--- !u!1 &495368858
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 495368861}
|
||||
- component: {fileID: 495368860}
|
||||
- component: {fileID: 495368859}
|
||||
m_Layer: 0
|
||||
m_Name: Main Camera
|
||||
m_TagString: MainCamera
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!81 &495368859
|
||||
AudioListener:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 495368858}
|
||||
m_Enabled: 1
|
||||
--- !u!20 &495368860
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 495368858}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 1
|
||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||
m_projectionMatrixMode: 1
|
||||
m_GateFitMode: 2
|
||||
m_FOVAxisMode: 0
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_FocalLength: 50
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
near clip plane: 0.3
|
||||
far clip plane: 1000
|
||||
field of view: 60
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: -1
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingPath: -1
|
||||
m_TargetTexture: {fileID: 0}
|
||||
m_TargetDisplay: 0
|
||||
m_TargetEye: 3
|
||||
m_HDR: 1
|
||||
m_AllowMSAA: 1
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 1
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!4 &495368861
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 495368858}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 1, z: -10}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &1154372134
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1154372135}
|
||||
- component: {fileID: 1154372136}
|
||||
m_Layer: 0
|
||||
m_Name: GameObject
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &1154372135
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1154372134}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 2
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1154372136
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1154372134}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b251dc2e3e09685448a5f448f611731e, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!1 &1547899605
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1547899607}
|
||||
- component: {fileID: 1547899606}
|
||||
m_Layer: 0
|
||||
m_Name: Directional Light
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!108 &1547899606
|
||||
Light:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1547899605}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 10
|
||||
m_Type: 1
|
||||
m_Shape: 0
|
||||
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
|
||||
m_Intensity: 1
|
||||
m_Range: 10
|
||||
m_SpotAngle: 30
|
||||
m_InnerSpotAngle: 21.80208
|
||||
m_CookieSize: 10
|
||||
m_Shadows:
|
||||
m_Type: 2
|
||||
m_Resolution: -1
|
||||
m_CustomResolution: -1
|
||||
m_Strength: 1
|
||||
m_Bias: 0.05
|
||||
m_NormalBias: 0.4
|
||||
m_NearPlane: 0.2
|
||||
m_CullingMatrixOverride:
|
||||
e00: 1
|
||||
e01: 0
|
||||
e02: 0
|
||||
e03: 0
|
||||
e10: 0
|
||||
e11: 1
|
||||
e12: 0
|
||||
e13: 0
|
||||
e20: 0
|
||||
e21: 0
|
||||
e22: 1
|
||||
e23: 0
|
||||
e30: 0
|
||||
e31: 0
|
||||
e32: 0
|
||||
e33: 1
|
||||
m_UseCullingMatrixOverride: 0
|
||||
m_Cookie: {fileID: 0}
|
||||
m_DrawHalo: 0
|
||||
m_Flare: {fileID: 0}
|
||||
m_RenderMode: 0
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingLayerMask: 1
|
||||
m_Lightmapping: 4
|
||||
m_LightShadowCasterMode: 0
|
||||
m_AreaSize: {x: 1, y: 1}
|
||||
m_BounceIntensity: 1
|
||||
m_ColorTemperature: 6570
|
||||
m_UseColorTemperature: 0
|
||||
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_UseBoundingSphereOverride: 0
|
||||
m_ShadowRadius: 0
|
||||
m_ShadowAngle: 0
|
||||
--- !u!4 &1547899607
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1547899605}
|
||||
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
|
||||
m_LocalPosition: {x: 0, y: 3, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
|
7
Assets/TEngine/Runtime/Net/Kcp/Kcp1/Kcp.unity.meta
Normal file
7
Assets/TEngine/Runtime/Net/Kcp/Kcp1/Kcp.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8211cbb6cf3d03d479184d2a4d5eec0c
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
67
Assets/TEngine/Runtime/Net/Kcp/Kcp1/KcpTest.cs
Normal file
67
Assets/TEngine/Runtime/Net/Kcp/Kcp1/KcpTest.cs
Normal file
@@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
using KcpProject;
|
||||
using TEngine;
|
||||
using UnityEngine;
|
||||
|
||||
public class KcpTest : MonoBehaviour
|
||||
{
|
||||
private KCPSession connection;
|
||||
byte[] buffer = new byte[1500];
|
||||
int counter = 0;
|
||||
int sendBytes = 0;
|
||||
int recvBytes = 0;
|
||||
|
||||
void Start()
|
||||
{
|
||||
connection = new KCPSession();
|
||||
connection.AckNoDelay = true;
|
||||
connection.WriteDelay = false;
|
||||
|
||||
connection.Connect("127.0.0.1", 4444);
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
if (connection == null || !connection.IsConnected)
|
||||
{
|
||||
return;
|
||||
}
|
||||
connection.Update();
|
||||
|
||||
//firstSend = false;
|
||||
// Console.WriteLine("Write Message...");
|
||||
//var text = Encoding.UTF8.GetBytes(string.Format("Hello KCP: {0}", ++counter));
|
||||
var sent = connection.Send(buffer, 0, buffer.Length);
|
||||
if (sent < 0)
|
||||
{
|
||||
TLogger.LogError("Write message failed.");
|
||||
}
|
||||
|
||||
if (sent > 0)
|
||||
{
|
||||
counter++;
|
||||
sendBytes += buffer.Length;
|
||||
if (counter >= 500)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
var n = connection.Recv(buffer, 0, buffer.Length);
|
||||
if (n == 0)
|
||||
{
|
||||
Thread.Sleep(10);
|
||||
}
|
||||
else if (n < 0)
|
||||
{
|
||||
TLogger.LogError("Receive Message failed.");
|
||||
}
|
||||
else
|
||||
{
|
||||
recvBytes += n;
|
||||
TLogger.LogError($"{recvBytes} / {sendBytes}");
|
||||
}
|
||||
}
|
||||
}
|
11
Assets/TEngine/Runtime/Net/Kcp/Kcp1/KcpTest.cs.meta
Normal file
11
Assets/TEngine/Runtime/Net/Kcp/Kcp1/KcpTest.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b251dc2e3e09685448a5f448f611731e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
Assets/TEngine/Runtime/Net/Kcp/Kcp2.meta
Normal file
8
Assets/TEngine/Runtime/Net/Kcp/Kcp2.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6ba3d5fa738b00f448f8e0d610c54564
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
71
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpClient.cs
Normal file
71
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpClient.cs
Normal file
@@ -0,0 +1,71 @@
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.Sockets.Kcp;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Kcp
|
||||
{
|
||||
public class KcpClient : IKcpCallback
|
||||
{
|
||||
UdpClient client;
|
||||
|
||||
public KcpClient(int port)
|
||||
: this(port, null)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public KcpClient(int port, IPEndPoint endPoint)
|
||||
{
|
||||
client = new UdpClient(port);
|
||||
kcp = new System.Net.Sockets.Kcp.Kcp(2001, this);
|
||||
this.EndPoint = endPoint;
|
||||
BeginRecv();
|
||||
}
|
||||
|
||||
public System.Net.Sockets.Kcp.Kcp kcp { get; }
|
||||
public IPEndPoint EndPoint { get; set; }
|
||||
|
||||
public void Output(IMemoryOwner<byte> buffer, int avalidLength)
|
||||
{
|
||||
var s = buffer.Memory.Span.Slice(0, avalidLength).ToArray();
|
||||
client.SendAsync(s, s.Length, EndPoint);
|
||||
buffer.Dispose();
|
||||
}
|
||||
|
||||
public async void SendAsync(byte[] datagram, int bytes)
|
||||
{
|
||||
kcp.Send(datagram.AsSpan().Slice(0, bytes));
|
||||
}
|
||||
|
||||
public async Task<byte[]> ReceiveAsync()
|
||||
{
|
||||
var (buffer, avalidLength) = kcp.TryRecv();
|
||||
if (buffer == null)
|
||||
{
|
||||
await Task.Delay(10);
|
||||
return await ReceiveAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
var s = buffer.Memory.Span.Slice(0, avalidLength).ToArray();
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
private async void BeginRecv()
|
||||
{
|
||||
var res = await client.ReceiveAsync();
|
||||
EndPoint = res.RemoteEndPoint;
|
||||
kcp.Input(res.Buffer);
|
||||
BeginRecv();
|
||||
}
|
||||
|
||||
public IMemoryOwner<byte> RentBuffer(int length)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
11
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpClient.cs.meta
Normal file
11
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpClient.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d42aa219010afaf4584ebc1b0ce71c35
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp.meta
Normal file
8
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d62fe636d4b136647a9fb837609f35a8
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/Kcp.dll
Normal file
BIN
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/Kcp.dll
Normal file
Binary file not shown.
32
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/Kcp.dll.meta
Normal file
32
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/Kcp.dll.meta
Normal file
@@ -0,0 +1,32 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 46160d30013b98c4ba33d5b915fe37a7
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
331
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/Kcp.xml
Normal file
331
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/Kcp.xml
Normal file
@@ -0,0 +1,331 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>Kcp</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:System.Net.Sockets.Kcp.IKcpCallback">
|
||||
<summary>
|
||||
Kcp回调
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.IKcpCallback.Output(System.Buffers.IMemoryOwner{System.Byte},System.Int32)">
|
||||
<summary>
|
||||
kcp 发送方向输出
|
||||
</summary>
|
||||
<param name="buffer">kcp 交出发送缓冲区控制权,缓冲区来自<see cref="M:System.Net.Sockets.Kcp.IKcpCallback.RentBuffer(System.Int32)"/></param>
|
||||
<param name="avalidLength">数据的有效长度</param>
|
||||
<returns>不需要返回值</returns>
|
||||
<remarks>通过增加 avalidLength 能够在协议栈中有效的减少数据拷贝</remarks>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.IKcpCallback.RentBuffer(System.Int32)">
|
||||
<summary>
|
||||
外部提供缓冲区,可以在外部链接一个内存池
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:System.Net.Sockets.Kcp.Kcp">
|
||||
<summary>
|
||||
https://github.com/skywind3000/kcp/wiki/Network-Layer
|
||||
<para>外部buffer ----拆分拷贝----等待列表 -----移动----发送列表----拷贝----发送buffer---output</para>
|
||||
https://github.com/skywind3000/kcp/issues/118#issuecomment-338133930
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.#ctor(System.UInt32,System.Net.Sockets.Kcp.IKcpCallback)">
|
||||
<summary>
|
||||
create a new kcp control object, 'conv' must equal in two endpoint
|
||||
from the same connection.
|
||||
</summary>
|
||||
<param name="conv_"></param>
|
||||
<param name="output_"></param>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.Kcp.conv">
|
||||
<summary>
|
||||
频道号
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.Kcp.mtu">
|
||||
<summary>
|
||||
最大传输单元(Maximum Transmission Unit,MTU)
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.Kcp.BufferNeedSize">
|
||||
<summary>
|
||||
缓冲区最小大小
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.Kcp.mss">
|
||||
<summary>
|
||||
最大报文段长度
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.Kcp.rcv_nxt">
|
||||
<summary>
|
||||
下一个等待接收消息ID
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.Kcp.IsLittleEndian">
|
||||
<summary>
|
||||
<para>https://github.com/skywind3000/kcp/issues/53</para>
|
||||
按照 C版 设计,使用小端字节序
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.Kcp.acklist">
|
||||
<summary>
|
||||
发送 ack 队列
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.Kcp.snd_queue">
|
||||
<summary>
|
||||
发送等待队列
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.Kcp.snd_buf">
|
||||
<summary>
|
||||
正在发送列表
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.Kcp.rcv_queue">
|
||||
<summary>
|
||||
正在等待触发接收回调函数消息列表
|
||||
<para>需要执行的操作 添加 遍历 删除</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.Kcp.rcv_buf">
|
||||
<summary>
|
||||
正在等待重组消息列表
|
||||
<para>需要执行的操作 添加 插入 遍历 删除</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.Kcp.m_disposing">
|
||||
<summary>
|
||||
是否正在释放
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.Dispose">
|
||||
<summary>
|
||||
释放不是严格线程安全的,尽量使用和Update相同的线程调用,
|
||||
或者等待析构时自动释放。
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.CreateBuffer(System.Int32)">
|
||||
<summary>
|
||||
如果外部能够提供缓冲区则使用外部缓冲区,否则new byte[]
|
||||
</summary>
|
||||
<param name="needSize"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.Recv(System.Span{System.Byte})">
|
||||
<summary>
|
||||
user/upper level recv: returns size, returns below zero for EAGAIN
|
||||
</summary>
|
||||
<param name="buffer"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.UncheckRecv(System.Span{System.Byte})">
|
||||
<summary>
|
||||
这个函数不检查任何参数
|
||||
</summary>
|
||||
<param name="buffer"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.Move_Rcv_buf_2_Rcv_queue">
|
||||
<summary>
|
||||
move available data from rcv_buf -> rcv_queue
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.PeekSize">
|
||||
<summary>
|
||||
check the size of next message in the recv queue
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.Send(System.Span{System.Byte})">
|
||||
<summary>
|
||||
user/upper level send, returns below zero for error
|
||||
</summary>
|
||||
<param name="buffer"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.Update_ack(System.Int32)">
|
||||
<summary>
|
||||
update ack.
|
||||
</summary>
|
||||
<param name="rtt"></param>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.Input(System.Span{System.Byte})">
|
||||
<summary>
|
||||
when you received a low level packet (eg. UDP packet), call it
|
||||
</summary>
|
||||
<param name="data"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.Flush">
|
||||
<summary>
|
||||
flush pending data
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.Update(System.DateTime@)">
|
||||
<summary>
|
||||
update state (call it repeatedly, every 10ms-100ms), or you can ask
|
||||
ikcp_check when to call it again (without ikcp_input/_send calling).
|
||||
</summary>
|
||||
<param name="time">DateTime.UtcNow</param>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.Check(System.DateTime)">
|
||||
<summary>
|
||||
Determine when should you invoke ikcp_update:
|
||||
returns when you should invoke ikcp_update in millisec, if there
|
||||
is no ikcp_input/_send calling. you can call ikcp_update in that
|
||||
time, instead of call update repeatly.
|
||||
<para></para>
|
||||
Important to reduce unnacessary ikcp_update invoking. use it to
|
||||
schedule ikcp_update (eg. implementing an epoll-like mechanism,
|
||||
or optimize ikcp_update when handling massive kcp connections)
|
||||
<para></para>
|
||||
</summary>
|
||||
<param name="time"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.SetMtu(System.Int32)">
|
||||
<summary>
|
||||
change MTU size, default is 1400
|
||||
<para>** 这个方法不是线程安全的。请在没有发送和接收时调用 。</para>
|
||||
</summary>
|
||||
<param name="mtu"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.Interval(System.Int32)">
|
||||
<summary>
|
||||
|
||||
</summary>
|
||||
<param name="interval_"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.NoDelay(System.Int32,System.Int32,System.Int32,System.Int32)">
|
||||
<summary>
|
||||
fastest: ikcp_nodelay(kcp, 1, 20, 2, 1)
|
||||
</summary>
|
||||
<param name="nodelay_">0:disable(default), 1:enable</param>
|
||||
<param name="interval_">internal update timer interval in millisec, default is 100ms</param>
|
||||
<param name="resend_">0:disable fast resend(default), 1:enable fast resend</param>
|
||||
<param name="nc_">0:normal congestion control(default), 1:disable congestion control</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.Kcp.WndSize(System.Int32,System.Int32)">
|
||||
<summary>
|
||||
set maximum window size: sndwnd=32, rcvwnd=32 by default
|
||||
</summary>
|
||||
<param name="sndwnd"></param>
|
||||
<param name="rcvwnd"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.Kcp.WaitSnd">
|
||||
<summary>
|
||||
get how many packet is waiting to be sent
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:System.Net.Sockets.Kcp.KcpSegment">
|
||||
<summary>
|
||||
调整了没存布局,直接拷贝块提升性能。
|
||||
<para>结构体保存内容只有一个指针,不用担心参数传递过程中的性能</para>
|
||||
https://github.com/skywind3000/kcp/issues/118#issuecomment-338133930
|
||||
<para>不要对没有初始化的KcpSegment(内部指针为0,所有属性都将指向位置区域) 进行任何赋值操作,可能导致内存损坏。
|
||||
出于性能考虑,没有对此项进行安全检查。</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.KcpSegment.AllocHGlobal(System.Int32)">
|
||||
<summary>
|
||||
使用完必须显示释放,否则内存泄漏
|
||||
</summary>
|
||||
<param name="appendDateSize"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.KcpSegment.FreeHGlobal(System.Net.Sockets.Kcp.KcpSegment)">
|
||||
<summary>
|
||||
释放非托管内存
|
||||
</summary>
|
||||
<param name="seg"></param>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.resendts">
|
||||
以下为本机使用的参数
|
||||
<summary>
|
||||
offset = 0
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.rto">
|
||||
<summary>
|
||||
offset = 4
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.fastack">
|
||||
<summary>
|
||||
offset = 8
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.xmit">
|
||||
<summary>
|
||||
offset = 12
|
||||
</summary>
|
||||
</member>
|
||||
<member name="F:System.Net.Sockets.Kcp.KcpSegment.LocalOffset">
|
||||
以下为需要网络传输的参数
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.conv">
|
||||
<summary>
|
||||
offset = <see cref="F:System.Net.Sockets.Kcp.KcpSegment.LocalOffset"/>
|
||||
</summary>
|
||||
https://github.com/skywind3000/kcp/issues/134
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.cmd">
|
||||
<summary>
|
||||
offset = <see cref="F:System.Net.Sockets.Kcp.KcpSegment.LocalOffset"/> + 4
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.frg">
|
||||
<summary>
|
||||
offset = <see cref="F:System.Net.Sockets.Kcp.KcpSegment.LocalOffset"/> + 5
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.wnd">
|
||||
<summary>
|
||||
offset = <see cref="F:System.Net.Sockets.Kcp.KcpSegment.LocalOffset"/> + 6
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.ts">
|
||||
<summary>
|
||||
offset = <see cref="F:System.Net.Sockets.Kcp.KcpSegment.LocalOffset"/> + 8
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.sn">
|
||||
<summary>
|
||||
<para> SendNumber? </para>
|
||||
offset = <see cref="F:System.Net.Sockets.Kcp.KcpSegment.LocalOffset"/> + 12
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.una">
|
||||
<summary>
|
||||
offset = <see cref="F:System.Net.Sockets.Kcp.KcpSegment.LocalOffset"/> + 16
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.len">
|
||||
<summary>
|
||||
<para> AppendDateSize </para>
|
||||
offset = <see cref="F:System.Net.Sockets.Kcp.KcpSegment.LocalOffset"/> + 20
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:System.Net.Sockets.Kcp.KcpSegment.data">
|
||||
<summary>
|
||||
|
||||
</summary>
|
||||
https://github.com/skywind3000/kcp/issues/35#issuecomment-263770736
|
||||
</member>
|
||||
<member name="M:System.Net.Sockets.Kcp.KcpSegment.Encode(System.Span{System.Byte})">
|
||||
<summary>
|
||||
将片段中的要发送的数据拷贝到指定缓冲区
|
||||
</summary>
|
||||
<param name="buffer"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
7
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/Kcp.xml.meta
Normal file
7
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/Kcp.xml.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 63423a3fccdee0649a1b108ff1c8fb27
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/System.Buffers.dll
Normal file
BIN
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/System.Buffers.dll
Normal file
Binary file not shown.
@@ -0,0 +1,32 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6adb9236ae2345f4e9c263bc7e4a5f6e
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><doc>
|
||||
<assembly>
|
||||
<name>System.Buffers</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:System.Buffers.ArrayPool`1">
|
||||
<summary>Provides a resource pool that enables reusing instances of type <see cref="T[]"></see>.</summary>
|
||||
<typeparam name="T">The type of the objects that are in the resource pool.</typeparam>
|
||||
</member>
|
||||
<member name="M:System.Buffers.ArrayPool`1.#ctor">
|
||||
<summary>Initializes a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class.</summary>
|
||||
</member>
|
||||
<member name="M:System.Buffers.ArrayPool`1.Create">
|
||||
<summary>Creates a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class.</summary>
|
||||
<returns>A new instance of the <see cref="System.Buffers.ArrayPool`1"></see> class.</returns>
|
||||
</member>
|
||||
<member name="M:System.Buffers.ArrayPool`1.Create(System.Int32,System.Int32)">
|
||||
<summary>Creates a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class using the specifed configuration.</summary>
|
||||
<param name="maxArrayLength">The maximum length of an array instance that may be stored in the pool.</param>
|
||||
<param name="maxArraysPerBucket">The maximum number of array instances that may be stored in each bucket in the pool. The pool groups arrays of similar lengths into buckets for faster access.</param>
|
||||
<returns>A new instance of the <see cref="System.Buffers.ArrayPool`1"></see> class with the specified configuration.</returns>
|
||||
</member>
|
||||
<member name="M:System.Buffers.ArrayPool`1.Rent(System.Int32)">
|
||||
<summary>Retrieves a buffer that is at least the requested length.</summary>
|
||||
<param name="minimumLength">The minimum length of the array.</param>
|
||||
<returns>An array of type <see cref="T[]"></see> that is at least <paramref name="minimumLength">minimumLength</paramref> in length.</returns>
|
||||
</member>
|
||||
<member name="M:System.Buffers.ArrayPool`1.Return(`0[],System.Boolean)">
|
||||
<summary>Returns an array to the pool that was previously obtained using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method on the same <see cref="T:System.Buffers.ArrayPool`1"></see> instance.</summary>
|
||||
<param name="array">A buffer to return to the pool that was previously obtained using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method.</param>
|
||||
<param name="clearArray">Indicates whether the contents of the buffer should be cleared before reuse. If <paramref name="clearArray">clearArray</paramref> is set to true, and if the pool will store the buffer to enable subsequent reuse, the <see cref="M:System.Buffers.ArrayPool`1.Return(`0[],System.Boolean)"></see> method will clear the <paramref name="array">array</paramref> of its contents so that a subsequent caller using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method will not see the content of the previous caller. If <paramref name="clearArray">clearArray</paramref> is set to false or if the pool will release the buffer, the array&#39;s contents are left unchanged.</param>
|
||||
</member>
|
||||
<member name="P:System.Buffers.ArrayPool`1.Shared">
|
||||
<summary>Gets a shared <see cref="T:System.Buffers.ArrayPool`1"></see> instance.</summary>
|
||||
<returns>A shared <see cref="System.Buffers.ArrayPool`1"></see> instance.</returns>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 28cf99f49856cc445826675c24598a57
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
BIN
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/System.Memory.dll
Normal file
BIN
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/System.Memory.dll
Normal file
Binary file not shown.
@@ -0,0 +1,32 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4533b86b9dd0e1d4daa22c442238c69e
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
355
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/System.Memory.xml
Normal file
355
Assets/TEngine/Runtime/Net/Kcp/Kcp2/KcpImp/System.Memory.xml
Normal file
@@ -0,0 +1,355 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><doc>
|
||||
<assembly>
|
||||
<name>System.Memory</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:System.Span`1">
|
||||
<typeparam name="T"></typeparam>
|
||||
</member>
|
||||
<member name="M:System.Span`1.#ctor(`0[])">
|
||||
<param name="array"></param>
|
||||
</member>
|
||||
<member name="M:System.Span`1.#ctor(System.Void*,System.Int32)">
|
||||
<param name="pointer"></param>
|
||||
<param name="length"></param>
|
||||
</member>
|
||||
<member name="M:System.Span`1.#ctor(`0[],System.Int32)">
|
||||
<param name="array"></param>
|
||||
<param name="start"></param>
|
||||
</member>
|
||||
<member name="M:System.Span`1.#ctor(`0[],System.Int32,System.Int32)">
|
||||
<param name="array"></param>
|
||||
<param name="start"></param>
|
||||
<param name="length"></param>
|
||||
</member>
|
||||
<member name="M:System.Span`1.Clear">
|
||||
|
||||
</member>
|
||||
<member name="M:System.Span`1.CopyTo(System.Span{`0})">
|
||||
<param name="destination"></param>
|
||||
</member>
|
||||
<member name="M:System.Span`1.DangerousCreate(System.Object,`0@,System.Int32)">
|
||||
<param name="obj"></param>
|
||||
<param name="objectData"></param>
|
||||
<param name="length"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.DangerousGetPinnableReference">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:System.Span`1.Empty">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.Equals(System.Object)">
|
||||
<param name="obj"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.Fill(`0)">
|
||||
<param name="value"></param>
|
||||
</member>
|
||||
<member name="M:System.Span`1.GetHashCode">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:System.Span`1.IsEmpty">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:System.Span`1.Item(System.Int32)">
|
||||
<param name="index"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:System.Span`1.Length">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.op_Equality(System.Span{`0},System.Span{`0})">
|
||||
<param name="left"></param>
|
||||
<param name="right"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.op_Implicit(System.ArraySegment{T})~System.Span{T}">
|
||||
<param name="arraySegment"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.op_Implicit(System.Span{T})~System.ReadOnlySpan{T}">
|
||||
<param name="span"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.op_Implicit(T[])~System.Span{T}">
|
||||
<param name="array"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.op_Inequality(System.Span{`0},System.Span{`0})">
|
||||
<param name="left"></param>
|
||||
<param name="right"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.Slice(System.Int32)">
|
||||
<param name="start"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.Slice(System.Int32,System.Int32)">
|
||||
<param name="start"></param>
|
||||
<param name="length"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.ToArray">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.Span`1.TryCopyTo(System.Span{`0})">
|
||||
<param name="destination"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:System.SpanExtensions">
|
||||
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.AsBytes``1(System.ReadOnlySpan{``0})">
|
||||
<param name="source"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.AsBytes``1(System.Span{``0})">
|
||||
<param name="source"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.AsSpan(System.String)">
|
||||
<param name="text"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.AsSpan``1(System.ArraySegment{``0})">
|
||||
<param name="arraySegment"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.AsSpan``1(``0[])">
|
||||
<param name="array"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.CopyTo``1(``0[],System.Span{``0})">
|
||||
<param name="array"></param>
|
||||
<param name="destination"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOf(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOf(System.Span{System.Byte},System.Byte)">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOf(System.ReadOnlySpan{System.Byte},System.Byte)">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOf(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOf``1(System.ReadOnlySpan{``0},System.ReadOnlySpan{``0})">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOf``1(System.ReadOnlySpan{``0},``0)">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOf``1(System.Span{``0},System.ReadOnlySpan{``0})">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOf``1(System.Span{``0},``0)">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOfAny(System.ReadOnlySpan{System.Byte},System.Byte,System.Byte,System.Byte)">
|
||||
<param name="span"></param>
|
||||
<param name="value0"></param>
|
||||
<param name="value1"></param>
|
||||
<param name="value2"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOfAny(System.Span{System.Byte},System.Byte,System.Byte,System.Byte)">
|
||||
<param name="span"></param>
|
||||
<param name="value0"></param>
|
||||
<param name="value1"></param>
|
||||
<param name="value2"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOfAny(System.Span{System.Byte},System.Byte,System.Byte)">
|
||||
<param name="span"></param>
|
||||
<param name="value0"></param>
|
||||
<param name="value1"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOfAny(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
|
||||
<param name="span"></param>
|
||||
<param name="values"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOfAny(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
|
||||
<param name="span"></param>
|
||||
<param name="values"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.IndexOfAny(System.ReadOnlySpan{System.Byte},System.Byte,System.Byte)">
|
||||
<param name="span"></param>
|
||||
<param name="value0"></param>
|
||||
<param name="value1"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.NonPortableCast``2(System.ReadOnlySpan{``0})">
|
||||
<param name="source"></param>
|
||||
<typeparam name="TFrom"></typeparam>
|
||||
<typeparam name="TTo"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.NonPortableCast``2(System.Span{``0})">
|
||||
<param name="source"></param>
|
||||
<typeparam name="TFrom"></typeparam>
|
||||
<typeparam name="TTo"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.SequenceEqual(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
|
||||
<param name="first"></param>
|
||||
<param name="second"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.SequenceEqual(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
|
||||
<param name="first"></param>
|
||||
<param name="second"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.SequenceEqual``1(System.ReadOnlySpan{``0},System.ReadOnlySpan{``0})">
|
||||
<param name="first"></param>
|
||||
<param name="second"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.SequenceEqual``1(System.Span{``0},System.ReadOnlySpan{``0})">
|
||||
<param name="first"></param>
|
||||
<param name="second"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.StartsWith(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.StartsWith(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.StartsWith``1(System.ReadOnlySpan{``0},System.ReadOnlySpan{``0})">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.SpanExtensions.StartsWith``1(System.Span{``0},System.ReadOnlySpan{``0})">
|
||||
<param name="span"></param>
|
||||
<param name="value"></param>
|
||||
<typeparam name="T"></typeparam>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:System.ReadOnlySpan`1">
|
||||
<typeparam name="T"></typeparam>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.#ctor(`0[])">
|
||||
<param name="array"></param>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.#ctor(System.Void*,System.Int32)">
|
||||
<param name="pointer"></param>
|
||||
<param name="length"></param>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.#ctor(`0[],System.Int32)">
|
||||
<param name="array"></param>
|
||||
<param name="start"></param>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.#ctor(`0[],System.Int32,System.Int32)">
|
||||
<param name="array"></param>
|
||||
<param name="start"></param>
|
||||
<param name="length"></param>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.CopyTo(System.Span{`0})">
|
||||
<param name="destination"></param>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.DangerousCreate(System.Object,`0@,System.Int32)">
|
||||
<param name="obj"></param>
|
||||
<param name="objectData"></param>
|
||||
<param name="length"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.DangerousGetPinnableReference">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:System.ReadOnlySpan`1.Empty">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.Equals(System.Object)">
|
||||
<param name="obj"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.GetHashCode">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:System.ReadOnlySpan`1.IsEmpty">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:System.ReadOnlySpan`1.Item(System.Int32)">
|
||||
<param name="index"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:System.ReadOnlySpan`1.Length">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.op_Equality(System.ReadOnlySpan{`0},System.ReadOnlySpan{`0})">
|
||||
<param name="left"></param>
|
||||
<param name="right"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.op_Implicit(System.ArraySegment{T})~System.ReadOnlySpan{T}">
|
||||
<param name="arraySegment"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.op_Implicit(T[])~System.ReadOnlySpan{T}">
|
||||
<param name="array"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.op_Inequality(System.ReadOnlySpan{`0},System.ReadOnlySpan{`0})">
|
||||
<param name="left"></param>
|
||||
<param name="right"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.Slice(System.Int32)">
|
||||
<param name="start"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.Slice(System.Int32,System.Int32)">
|
||||
<param name="start"></param>
|
||||
<param name="length"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.ToArray">
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:System.ReadOnlySpan`1.TryCopyTo(System.Span{`0})">
|
||||
<param name="destination"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b54c1784b3e803c45a1d68bfaafbb283
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Binary file not shown.
@@ -0,0 +1,32 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6e8ded56d8468f749a68256f26df209c
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 1
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,200 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><doc>
|
||||
<assembly>
|
||||
<name>System.Runtime.CompilerServices.Unsafe</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:System.Runtime.CompilerServices.Unsafe">
|
||||
<summary>Contains generic, low-level functionality for manipulating pointers.</summary>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.Add``1(``0@,System.Int32)">
|
||||
<summary>Adds an element offset to the given reference.</summary>
|
||||
<param name="source">The reference to add the offset to.</param>
|
||||
<param name="elementOffset">The offset to add.</param>
|
||||
<typeparam name="T">The type of reference.</typeparam>
|
||||
<returns>A new reference that reflects the addition of offset to pointer.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.Add``1(``0@,System.IntPtr)">
|
||||
<summary>Adds an element offset to the given reference.</summary>
|
||||
<param name="source">The reference to add the offset to.</param>
|
||||
<param name="elementOffset">The offset to add.</param>
|
||||
<typeparam name="T">The type of reference.</typeparam>
|
||||
<returns>A new reference that reflects the addition of offset to pointer.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.AddByteOffset``1(``0@,System.IntPtr)">
|
||||
<summary>Adds a byte offset to the given reference.</summary>
|
||||
<param name="source">The reference to add the offset to.</param>
|
||||
<param name="byteOffset">The offset to add.</param>
|
||||
<typeparam name="T">The type of reference.</typeparam>
|
||||
<returns>A new reference that reflects the addition of byte offset to pointer.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.AreSame``1(``0@,``0@)">
|
||||
<summary>Determines whether the specified references point to the same location.</summary>
|
||||
<param name="left">The first reference to compare.</param>
|
||||
<param name="right">The second reference to compare.</param>
|
||||
<typeparam name="T">The type of reference.</typeparam>
|
||||
<returns>true if <paramref name="left">left</paramref> and <paramref name="right">right</paramref> point to the same location; otherwise, false.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.As``1(System.Object)">
|
||||
<summary>Casts the given object to the specified type.</summary>
|
||||
<param name="o">The object to cast.</param>
|
||||
<typeparam name="T">The type which the object will be cast to.</typeparam>
|
||||
<returns>The original object, casted to the given type.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.As``2(``0@)">
|
||||
<summary>Reinterprets the given reference as a reference to a value of type <typeparamref name="TTo">TTo</typeparamref>.</summary>
|
||||
<param name="source">The reference to reinterpret.</param>
|
||||
<typeparam name="TFrom">The type of reference to reinterpret..</typeparam>
|
||||
<typeparam name="TTo">The desired type of the reference.</typeparam>
|
||||
<returns>A reference to a value of type <typeparamref name="TTo">TTo</typeparamref>.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.AsPointer``1(``0@)">
|
||||
<summary>Returns a pointer to the given by-ref parameter.</summary>
|
||||
<param name="value">The object whose pointer is obtained.</param>
|
||||
<typeparam name="T">The type of object.</typeparam>
|
||||
<returns>A pointer to the given value.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.AsRef``1(System.Void*)">
|
||||
<summary>Reinterprets the given location as a reference to a value of type <typeparamref name="T">T</typeparamref>.</summary>
|
||||
<param name="source">The location of the value to reference.</param>
|
||||
<typeparam name="T">The type of the interpreted location.</typeparam>
|
||||
<returns>A reference to a value of type <typeparamref name="T">T</typeparamref>.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.ByteOffset``1(``0@,``0@)">
|
||||
<summary>Determines the byte offset from origin to target from the given references.</summary>
|
||||
<param name="origin">The reference to origin.</param>
|
||||
<param name="target">The reference to target.</param>
|
||||
<typeparam name="T">The type of reference.</typeparam>
|
||||
<returns>Byte offset from origin to target i.e. <paramref name="target">target</paramref> - <paramref name="origin">origin</paramref>.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.Copy``1(System.Void*,``0@)">
|
||||
<summary>Copies a value of type <typeparamref name="T">T</typeparamref> to the given location.</summary>
|
||||
<param name="destination">The location to copy to.</param>
|
||||
<param name="source">A reference to the value to copy.</param>
|
||||
<typeparam name="T">The type of value to copy.</typeparam>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.Copy``1(``0@,System.Void*)">
|
||||
<summary>Copies a value of type <typeparamref name="T">T</typeparamref> to the given location.</summary>
|
||||
<param name="destination">The location to copy to.</param>
|
||||
<param name="source">A pointer to the value to copy.</param>
|
||||
<typeparam name="T">The type of value to copy.</typeparam>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlock(System.Byte@,System.Byte@,System.UInt32)">
|
||||
<summary>Copies bytes from the source address to the destination address.</summary>
|
||||
<param name="destination">The destination address to copy to.</param>
|
||||
<param name="source">The source address to copy from.</param>
|
||||
<param name="byteCount">The number of bytes to copy.</param>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlock(System.Void*,System.Void*,System.UInt32)">
|
||||
<summary>Copies bytes from the source address to the destination address.</summary>
|
||||
<param name="destination">The destination address to copy to.</param>
|
||||
<param name="source">The source address to copy from.</param>
|
||||
<param name="byteCount">The number of bytes to copy.</param>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlockUnaligned(System.Void*,System.Void*,System.UInt32)">
|
||||
<summary>Copies bytes from the source address to the destination address
|
||||
without assuming architecture dependent alignment of the addresses.</summary>
|
||||
<param name="destination">The destination address to copy to.</param>
|
||||
<param name="source">The source address to copy from.</param>
|
||||
<param name="byteCount">The number of bytes to copy.</param>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlockUnaligned(System.Byte@,System.Byte@,System.UInt32)">
|
||||
<summary>Copies bytes from the source address to the destination address
|
||||
without assuming architecture dependent alignment of the addresses.</summary>
|
||||
<param name="destination">The destination address to copy to.</param>
|
||||
<param name="source">The source address to copy from.</param>
|
||||
<param name="byteCount">The number of bytes to copy.</param>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlock(System.Byte@,System.Byte,System.UInt32)">
|
||||
<summary>Initializes a block of memory at the given location with a given initial value.</summary>
|
||||
<param name="startAddress">The address of the start of the memory block to initialize.</param>
|
||||
<param name="value">The value to initialize the block to.</param>
|
||||
<param name="byteCount">The number of bytes to initialize.</param>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlock(System.Void*,System.Byte,System.UInt32)">
|
||||
<summary>Initializes a block of memory at the given location with a given initial value.</summary>
|
||||
<param name="startAddress">The address of the start of the memory block to initialize.</param>
|
||||
<param name="value">The value to initialize the block to.</param>
|
||||
<param name="byteCount">The number of bytes to initialize.</param>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlockUnaligned(System.Byte@,System.Byte,System.UInt32)">
|
||||
<summary>Initializes a block of memory at the given location with a given initial value
|
||||
without assuming architecture dependent alignment of the address.</summary>
|
||||
<param name="startAddress">The address of the start of the memory block to initialize.</param>
|
||||
<param name="value">The value to initialize the block to.</param>
|
||||
<param name="byteCount">The number of bytes to initialize.</param>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlockUnaligned(System.Void*,System.Byte,System.UInt32)">
|
||||
<summary>Initializes a block of memory at the given location with a given initial value
|
||||
without assuming architecture dependent alignment of the address.</summary>
|
||||
<param name="startAddress">The address of the start of the memory block to initialize.</param>
|
||||
<param name="value">The value to initialize the block to.</param>
|
||||
<param name="byteCount">The number of bytes to initialize.</param>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.Read``1(System.Void*)">
|
||||
<summary>Reads a value of type <typeparamref name="T">T</typeparamref> from the given location.</summary>
|
||||
<param name="source">The location to read from.</param>
|
||||
<typeparam name="T">The type to read.</typeparam>
|
||||
<returns>An object of type <typeparamref name="T">T</typeparamref> read from the given location.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.ReadUnaligned``1(System.Byte@)">
|
||||
<summary>Reads a value of type <typeparamref name="T">T</typeparamref> from the given location
|
||||
without assuming architecture dependent alignment of the addresses.</summary>
|
||||
<param name="source">The location to read from.</param>
|
||||
<typeparam name="T">The type to read.</typeparam>
|
||||
<returns>An object of type <typeparamref name="T">T</typeparamref> read from the given location.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.ReadUnaligned``1(System.Void*)">
|
||||
<summary>Reads a value of type <typeparamref name="T">T</typeparamref> from the given location
|
||||
without assuming architecture dependent alignment of the addresses.</summary>
|
||||
<param name="source">The location to read from.</param>
|
||||
<typeparam name="T">The type to read.</typeparam>
|
||||
<returns>An object of type <typeparamref name="T">T</typeparamref> read from the given location.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.SizeOf``1">
|
||||
<summary>Returns the size of an object of the given type parameter.</summary>
|
||||
<typeparam name="T">The type of object whose size is retrieved.</typeparam>
|
||||
<returns>The size of an object of type <typeparamref name="T">T</typeparamref>.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.Subtract``1(``0@,System.Int32)">
|
||||
<summary>Subtracts an element offset from the given reference.</summary>
|
||||
<param name="source">The reference to subtract the offset from.</param>
|
||||
<param name="elementOffset">The offset to subtract.</param>
|
||||
<typeparam name="T">The type of reference.</typeparam>
|
||||
<returns>A new reference that reflects the subraction of offset from pointer.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.Subtract``1(``0@,System.IntPtr)">
|
||||
<summary>Subtracts an element offset from the given reference.</summary>
|
||||
<param name="source">The reference to subtract the offset from.</param>
|
||||
<param name="elementOffset">The offset to subtract.</param>
|
||||
<typeparam name="T">The type of reference.</typeparam>
|
||||
<returns>A new reference that reflects the subraction of offset from pointer.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.SubtractByteOffset``1(``0@,System.IntPtr)">
|
||||
<summary>Subtracts a byte offset from the given reference.</summary>
|
||||
<param name="source">The reference to subtract the offset from.</param>
|
||||
<param name="byteOffset"></param>
|
||||
<typeparam name="T">The type of reference.</typeparam>
|
||||
<returns>A new reference that reflects the subraction of byte offset from pointer.</returns>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.Write``1(System.Void*,``0)">
|
||||
<summary>Writes a value of type <typeparamref name="T">T</typeparamref> to the given location.</summary>
|
||||
<param name="destination">The location to write to.</param>
|
||||
<param name="value">The value to write.</param>
|
||||
<typeparam name="T">The type of value to write.</typeparam>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.WriteUnaligned``1(System.Byte@,``0)">
|
||||
<summary>Writes a value of type <typeparamref name="T">T</typeparamref> to the given location
|
||||
without assuming architecture dependent alignment of the addresses.</summary>
|
||||
<param name="destination">The location to write to.</param>
|
||||
<param name="value">The value to write.</param>
|
||||
<typeparam name="T">The type of value to write.</typeparam>
|
||||
</member>
|
||||
<member name="M:System.Runtime.CompilerServices.Unsafe.WriteUnaligned``1(System.Void*,``0)">
|
||||
<summary>Writes a value of type <typeparamref name="T">T</typeparamref> to the given location
|
||||
without assuming architecture dependent alignment of the addresses.</summary>
|
||||
<param name="destination">The location to write to.</param>
|
||||
<param name="value">The value to write.</param>
|
||||
<typeparam name="T">The type of value to write.</typeparam>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4550353da13e98b4d8fa8a94c97a4067
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
384
Assets/TEngine/Runtime/Net/Kcp/Kcp2/Test.unity
Normal file
384
Assets/TEngine/Runtime/Net/Kcp/Kcp2/Test.unity
Normal file
@@ -0,0 +1,384 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!29 &1
|
||||
OcclusionCullingSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_OcclusionBakeSettings:
|
||||
smallestOccluder: 5
|
||||
smallestHole: 0.25
|
||||
backfaceThreshold: 100
|
||||
m_SceneGUID: 00000000000000000000000000000000
|
||||
m_OcclusionCullingData: {fileID: 0}
|
||||
--- !u!104 &2
|
||||
RenderSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 9
|
||||
m_Fog: 0
|
||||
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||
m_FogMode: 3
|
||||
m_FogDensity: 0.01
|
||||
m_LinearFogStart: 0
|
||||
m_LinearFogEnd: 300
|
||||
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
|
||||
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
|
||||
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
|
||||
m_AmbientIntensity: 1
|
||||
m_AmbientMode: 0
|
||||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
|
||||
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_HaloStrength: 0.5
|
||||
m_FlareStrength: 1
|
||||
m_FlareFadeSpeed: 3
|
||||
m_HaloTexture: {fileID: 0}
|
||||
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_DefaultReflectionMode: 0
|
||||
m_DefaultReflectionResolution: 128
|
||||
m_ReflectionBounces: 1
|
||||
m_ReflectionIntensity: 1
|
||||
m_CustomReflection: {fileID: 0}
|
||||
m_Sun: {fileID: 0}
|
||||
m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_UseRadianceAmbientProbe: 0
|
||||
--- !u!157 &3
|
||||
LightmapSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 11
|
||||
m_GIWorkflowMode: 1
|
||||
m_GISettings:
|
||||
serializedVersion: 2
|
||||
m_BounceScale: 1
|
||||
m_IndirectOutputScale: 1
|
||||
m_AlbedoBoost: 1
|
||||
m_EnvironmentLightingMode: 0
|
||||
m_EnableBakedLightmaps: 1
|
||||
m_EnableRealtimeLightmaps: 0
|
||||
m_LightmapEditorSettings:
|
||||
serializedVersion: 12
|
||||
m_Resolution: 2
|
||||
m_BakeResolution: 40
|
||||
m_AtlasSize: 1024
|
||||
m_AO: 0
|
||||
m_AOMaxDistance: 1
|
||||
m_CompAOExponent: 1
|
||||
m_CompAOExponentDirect: 0
|
||||
m_ExtractAmbientOcclusion: 0
|
||||
m_Padding: 2
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_LightmapsBakeMode: 1
|
||||
m_TextureCompression: 1
|
||||
m_FinalGather: 0
|
||||
m_FinalGatherFiltering: 1
|
||||
m_FinalGatherRayCount: 256
|
||||
m_ReflectionCompression: 2
|
||||
m_MixedBakeMode: 2
|
||||
m_BakeBackend: 1
|
||||
m_PVRSampling: 1
|
||||
m_PVRDirectSampleCount: 32
|
||||
m_PVRSampleCount: 512
|
||||
m_PVRBounces: 2
|
||||
m_PVREnvironmentSampleCount: 256
|
||||
m_PVREnvironmentReferencePointCount: 2048
|
||||
m_PVRFilteringMode: 1
|
||||
m_PVRDenoiserTypeDirect: 1
|
||||
m_PVRDenoiserTypeIndirect: 1
|
||||
m_PVRDenoiserTypeAO: 1
|
||||
m_PVRFilterTypeDirect: 0
|
||||
m_PVRFilterTypeIndirect: 0
|
||||
m_PVRFilterTypeAO: 0
|
||||
m_PVREnvironmentMIS: 1
|
||||
m_PVRCulling: 1
|
||||
m_PVRFilteringGaussRadiusDirect: 1
|
||||
m_PVRFilteringGaussRadiusIndirect: 5
|
||||
m_PVRFilteringGaussRadiusAO: 2
|
||||
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
|
||||
m_PVRFilteringAtrousPositionSigmaIndirect: 2
|
||||
m_PVRFilteringAtrousPositionSigmaAO: 1
|
||||
m_ExportTrainingData: 0
|
||||
m_TrainingDataDestination: TrainingData
|
||||
m_LightProbeSampleCountMultiplier: 4
|
||||
m_LightingDataAsset: {fileID: 0}
|
||||
m_UseShadowmask: 1
|
||||
--- !u!196 &4
|
||||
NavMeshSettings:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_BuildSettings:
|
||||
serializedVersion: 2
|
||||
agentTypeID: 0
|
||||
agentRadius: 0.5
|
||||
agentHeight: 2
|
||||
agentSlope: 45
|
||||
agentClimb: 0.4
|
||||
ledgeDropHeight: 0
|
||||
maxJumpAcrossDistance: 0
|
||||
minRegionArea: 2
|
||||
manualCellSize: 0
|
||||
cellSize: 0.16666667
|
||||
manualTileSize: 0
|
||||
tileSize: 256
|
||||
accuratePlacement: 0
|
||||
debug:
|
||||
m_Flags: 0
|
||||
m_NavMeshData: {fileID: 0}
|
||||
--- !u!1 &722190521
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 722190523}
|
||||
- component: {fileID: 722190522}
|
||||
m_Layer: 0
|
||||
m_Name: Directional Light
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!108 &722190522
|
||||
Light:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 722190521}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 10
|
||||
m_Type: 1
|
||||
m_Shape: 0
|
||||
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
|
||||
m_Intensity: 1
|
||||
m_Range: 10
|
||||
m_SpotAngle: 30
|
||||
m_InnerSpotAngle: 21.80208
|
||||
m_CookieSize: 10
|
||||
m_Shadows:
|
||||
m_Type: 2
|
||||
m_Resolution: -1
|
||||
m_CustomResolution: -1
|
||||
m_Strength: 1
|
||||
m_Bias: 0.05
|
||||
m_NormalBias: 0.4
|
||||
m_NearPlane: 0.2
|
||||
m_CullingMatrixOverride:
|
||||
e00: 1
|
||||
e01: 0
|
||||
e02: 0
|
||||
e03: 0
|
||||
e10: 0
|
||||
e11: 1
|
||||
e12: 0
|
||||
e13: 0
|
||||
e20: 0
|
||||
e21: 0
|
||||
e22: 1
|
||||
e23: 0
|
||||
e30: 0
|
||||
e31: 0
|
||||
e32: 0
|
||||
e33: 1
|
||||
m_UseCullingMatrixOverride: 0
|
||||
m_Cookie: {fileID: 0}
|
||||
m_DrawHalo: 0
|
||||
m_Flare: {fileID: 0}
|
||||
m_RenderMode: 0
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingLayerMask: 1
|
||||
m_Lightmapping: 4
|
||||
m_LightShadowCasterMode: 0
|
||||
m_AreaSize: {x: 1, y: 1}
|
||||
m_BounceIntensity: 1
|
||||
m_ColorTemperature: 6570
|
||||
m_UseColorTemperature: 0
|
||||
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_UseBoundingSphereOverride: 0
|
||||
m_ShadowRadius: 0
|
||||
m_ShadowAngle: 0
|
||||
--- !u!4 &722190523
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 722190521}
|
||||
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
|
||||
m_LocalPosition: {x: 0, y: 3, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 1
|
||||
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
|
||||
--- !u!1 &929006872
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 929006873}
|
||||
- component: {fileID: 929006874}
|
||||
m_Layer: 0
|
||||
m_Name: GameObject
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &929006873
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 929006872}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 2
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &929006874
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 929006872}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 9cd86f429bda8b54491fe8ca650b4efa, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!1 &1140885832
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1140885835}
|
||||
- component: {fileID: 1140885834}
|
||||
- component: {fileID: 1140885833}
|
||||
m_Layer: 0
|
||||
m_Name: Main Camera
|
||||
m_TagString: MainCamera
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!81 &1140885833
|
||||
AudioListener:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1140885832}
|
||||
m_Enabled: 1
|
||||
--- !u!20 &1140885834
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1140885832}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 1
|
||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||
m_projectionMatrixMode: 1
|
||||
m_GateFitMode: 2
|
||||
m_FOVAxisMode: 0
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
m_FocalLength: 50
|
||||
m_NormalizedViewPortRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 1
|
||||
height: 1
|
||||
near clip plane: 0.3
|
||||
far clip plane: 1000
|
||||
field of view: 60
|
||||
orthographic: 0
|
||||
orthographic size: 5
|
||||
m_Depth: -1
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingPath: -1
|
||||
m_TargetTexture: {fileID: 0}
|
||||
m_TargetDisplay: 0
|
||||
m_TargetEye: 3
|
||||
m_HDR: 1
|
||||
m_AllowMSAA: 1
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 1
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!4 &1140885835
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1140885832}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 1, z: -10}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &1321805467
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1321805468}
|
||||
- component: {fileID: 1321805469}
|
||||
m_Layer: 0
|
||||
m_Name: GameObject (1)
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &1321805468
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1321805467}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 3
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1321805469
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1321805467}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 704cf15a4f065de46ac4a78fcc39b500, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
7
Assets/TEngine/Runtime/Net/Kcp/Kcp2/Test.unity.meta
Normal file
7
Assets/TEngine/Runtime/Net/Kcp/Kcp2/Test.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 71fb536dfa2527442a9a70ae0a41e861
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
43
Assets/TEngine/Runtime/Net/Kcp/Kcp2/TestClient.cs
Normal file
43
Assets/TEngine/Runtime/Net/Kcp/Kcp2/TestClient.cs
Normal file
@@ -0,0 +1,43 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Threading.Tasks;
|
||||
using Kcp;
|
||||
using TEngine;
|
||||
using UnityEngine;
|
||||
|
||||
public class TestClient : MonoBehaviour
|
||||
{
|
||||
static IPEndPoint end = new System.Net.IPEndPoint(System.Net.IPAddress.Loopback, 40001);
|
||||
private KcpClient kcpClient;
|
||||
private Task task;
|
||||
void Start()
|
||||
{
|
||||
kcpClient = new KcpClient(50001, end);
|
||||
task = Task.Run(async () =>
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
kcpClient.kcp.Update(DateTime.UtcNow);
|
||||
await Task.Delay(10);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
static async void Send(KcpClient client, string v)
|
||||
{
|
||||
var buffer = System.Text.Encoding.UTF8.GetBytes(v);
|
||||
client.SendAsync(buffer, buffer.Length);
|
||||
var resp = await client.ReceiveAsync();
|
||||
var respstr = System.Text.Encoding.UTF8.GetString(resp);
|
||||
TLogger.LogError($"收到服务器回复: {respstr}");
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.Space))
|
||||
{
|
||||
TLogger.LogError($"发送一条消息");
|
||||
Send(kcpClient, "发送一条消息");
|
||||
}
|
||||
}
|
||||
}
|
11
Assets/TEngine/Runtime/Net/Kcp/Kcp2/TestClient.cs.meta
Normal file
11
Assets/TEngine/Runtime/Net/Kcp/Kcp2/TestClient.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 704cf15a4f065de46ac4a78fcc39b500
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
38
Assets/TEngine/Runtime/Net/Kcp/Kcp2/TestServer.cs
Normal file
38
Assets/TEngine/Runtime/Net/Kcp/Kcp2/TestServer.cs
Normal file
@@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Kcp;
|
||||
using UnityEngine;
|
||||
|
||||
public class TestServer : MonoBehaviour
|
||||
{
|
||||
void Start()
|
||||
{
|
||||
KcpClient kcpClient = new KcpClient(40001);
|
||||
Task.Run(async () =>
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
kcpClient.kcp.Update(DateTime.UtcNow);
|
||||
await Task.Delay(10);
|
||||
}
|
||||
});
|
||||
|
||||
StartRecv(kcpClient);
|
||||
}
|
||||
|
||||
static async void StartRecv(KcpClient client)
|
||||
{
|
||||
var res = await client.ReceiveAsync();
|
||||
StartRecv(client);
|
||||
|
||||
await Task.Delay(1);
|
||||
var str = System.Text.Encoding.UTF8.GetString(res);
|
||||
if ("发送一条消息" == str)
|
||||
{
|
||||
Console.WriteLine(str);
|
||||
|
||||
var buffer = System.Text.Encoding.UTF8.GetBytes("回复一条消息");
|
||||
client.SendAsync(buffer, buffer.Length);
|
||||
}
|
||||
}
|
||||
}
|
11
Assets/TEngine/Runtime/Net/Kcp/Kcp2/TestServer.cs.meta
Normal file
11
Assets/TEngine/Runtime/Net/Kcp/Kcp2/TestServer.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9cd86f429bda8b54491fe8ca650b4efa
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -1,111 +0,0 @@
|
||||
namespace TEngine.Net
|
||||
{
|
||||
public class Buffer
|
||||
{
|
||||
private int _size;
|
||||
private int _offset;
|
||||
private byte[] _data;
|
||||
|
||||
public bool IsEmpty => _size == 0;
|
||||
|
||||
public byte[] Data => _data;
|
||||
|
||||
public int Capacity => _data.Length;
|
||||
|
||||
public int Size => _size;
|
||||
|
||||
public int Offset => _offset;
|
||||
|
||||
public byte this[int index] => _data[index];
|
||||
|
||||
public Buffer() : this(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Buffer(long capacity)
|
||||
{
|
||||
_size = 0;
|
||||
_offset = 0;
|
||||
_data = new byte[capacity];
|
||||
}
|
||||
|
||||
public void Reserve(int capacity)
|
||||
{
|
||||
if (capacity < 0)
|
||||
{
|
||||
throw new System.ArgumentException("Invalid reserve capacity!", nameof(capacity));
|
||||
}
|
||||
|
||||
if (capacity > Capacity)
|
||||
{
|
||||
byte[] data = new byte[System.Math.Max(capacity, 2 * Capacity)];
|
||||
System.Buffer.BlockCopy(_data, 0, data, 0, _size);
|
||||
_data = data;
|
||||
}
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
_size = 0;
|
||||
_offset = 0;
|
||||
}
|
||||
|
||||
public void Rewind() { _offset = 0; }
|
||||
|
||||
public void Shift(int offset) { _offset += offset; }
|
||||
|
||||
public void Unshift(int offset) { _offset -= offset; }
|
||||
|
||||
public void AddSize(int size)
|
||||
{
|
||||
_size += size;
|
||||
_data[_size] = 0;
|
||||
}
|
||||
|
||||
public int Append(byte[] src)
|
||||
{
|
||||
Reserve(_size + src.Length);
|
||||
System.Buffer.BlockCopy(src, 0, _data, _size, src.Length);
|
||||
_size += src.Length;
|
||||
return src.Length;
|
||||
}
|
||||
|
||||
public int Append(byte src)
|
||||
{
|
||||
Reserve(_size + 1);
|
||||
_data[_size++] = src;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
public int Append(byte[] src, int offset, int count)
|
||||
{
|
||||
Reserve(_size + count);
|
||||
System.Buffer.BlockCopy(src, offset, _data, _size, count);
|
||||
_size += count;
|
||||
return count;
|
||||
}
|
||||
|
||||
public int Append(string text)
|
||||
{
|
||||
Reserve(_size + System.Text.Encoding.UTF8.GetMaxByteCount(text.Length));
|
||||
int result = System.Text.Encoding.UTF8.GetBytes(text, 0, text.Length, _data, (int)_size);
|
||||
_size += result;
|
||||
return result;
|
||||
}
|
||||
|
||||
public string ExtractString(long offset, long size)
|
||||
{
|
||||
if ((offset + size) > Size)
|
||||
throw new System.ArgumentException("Invalid offset & size!", nameof(offset));
|
||||
|
||||
return System.Text.Encoding.UTF8.GetString(_data, (int)offset, (int)size);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return ExtractString(0, _size);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,223 +0,0 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace TEngine.Net
|
||||
{
|
||||
public class LoopBuffer
|
||||
{
|
||||
private int _size;
|
||||
private int _head;
|
||||
private int _tail;
|
||||
private byte[] _data;
|
||||
|
||||
public bool IsEmpty => (_data == null) || (_size == 0);
|
||||
|
||||
public int Size => _size;
|
||||
|
||||
public int Capacity => _data != null ? _data.Length : 0;
|
||||
|
||||
public int Remain => Capacity - _size;
|
||||
|
||||
public LoopBuffer() : this(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public LoopBuffer(int capacity)
|
||||
{
|
||||
if (capacity < 0)
|
||||
{
|
||||
throw new System.ArgumentException("The buffer capacity must be greater than or equal to zero.");
|
||||
}
|
||||
|
||||
_size = 0;
|
||||
_head = 0;
|
||||
_tail = 0;
|
||||
_data = new byte[capacity];
|
||||
}
|
||||
|
||||
public void Reserve(long capacity)
|
||||
{
|
||||
if (capacity < 0)
|
||||
{
|
||||
throw new System.ArgumentException("Invalid reserve capacity!", nameof(capacity));
|
||||
}
|
||||
if (capacity > Capacity)
|
||||
{
|
||||
byte[] data = new byte[System.Math.Max(capacity, 2 * Capacity)];
|
||||
if (_size > 0)
|
||||
{
|
||||
if (_head < _tail)
|
||||
{
|
||||
System.Buffer.BlockCopy(_data, _head, data, 0, _size);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.Buffer.BlockCopy(_data, _head, data, 0, Capacity - _head);
|
||||
System.Buffer.BlockCopy(_data, 0, data, Capacity - _head, _tail);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
_head = 0;
|
||||
_tail = _size;
|
||||
_data = data;
|
||||
}
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
_size = 0;
|
||||
_head = 0;
|
||||
_tail = 0;
|
||||
}
|
||||
|
||||
public int Put(byte[] src)
|
||||
{
|
||||
return Put(src, 0, src.Length);
|
||||
}
|
||||
|
||||
public int Put(byte[] src, int offset, int count)
|
||||
{
|
||||
if (count > Remain)
|
||||
{
|
||||
Reserve(_size + count);
|
||||
}
|
||||
|
||||
if (count > 0)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
if (_head < _tail)
|
||||
{
|
||||
int right = Capacity - _tail;
|
||||
|
||||
if (right >= count)
|
||||
{
|
||||
System.Buffer.BlockCopy(src, offset, _data, _tail, count);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.Buffer.BlockCopy(src, offset, _data, _tail, right);
|
||||
System.Buffer.BlockCopy(src, offset + right, _data, 0, count - right);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
System.Buffer.BlockCopy(src, offset, _data, _tail, count);
|
||||
}
|
||||
|
||||
_tail = (_tail + count) % Capacity;
|
||||
_size += count;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
public void Skip(int count)
|
||||
{
|
||||
_head += count;
|
||||
if (_head >= Capacity)
|
||||
{
|
||||
_head -= Capacity;
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] Get(int count)
|
||||
{
|
||||
var dst = new byte[count];
|
||||
Get(dst);
|
||||
return dst;
|
||||
}
|
||||
|
||||
public int Get(byte[] dst)
|
||||
{
|
||||
return Get(dst, 0, dst.Length);
|
||||
}
|
||||
|
||||
public int Get(Buffer buffer, int count)
|
||||
{
|
||||
int rc = Get(buffer.Data, buffer.Offset, count);
|
||||
buffer.AddSize(rc);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
public int Get(byte[] dst, int offset, int count)
|
||||
{
|
||||
count = System.Math.Min(count, _size);
|
||||
|
||||
if (count > 0)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
if (_head < _tail)
|
||||
{
|
||||
System.Buffer.BlockCopy(_data, _head, dst, offset, count);
|
||||
}
|
||||
else
|
||||
{
|
||||
int right = Capacity - _head;
|
||||
|
||||
if (right >= count)
|
||||
{
|
||||
System.Buffer.BlockCopy(_data, _head, dst, offset, count);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.Buffer.BlockCopy(_data, _head, dst, offset, right);
|
||||
System.Buffer.BlockCopy(_data, 0, dst, offset + right, count - right);
|
||||
}
|
||||
}
|
||||
|
||||
_head = (_head + count) % Capacity;
|
||||
_size -= count;
|
||||
|
||||
if (_size == 0)
|
||||
{
|
||||
_head = 0;
|
||||
_tail = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
public bool Peek(byte[] dst, int offset, int count)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
if (offset + count < _size)
|
||||
{
|
||||
if (_head < _tail)
|
||||
{
|
||||
System.Buffer.BlockCopy(_data, _head, dst, offset, count);
|
||||
}
|
||||
else
|
||||
{
|
||||
int right = Capacity - _head;
|
||||
|
||||
if (right >= count)
|
||||
{
|
||||
System.Buffer.BlockCopy(_data, _head, dst, offset, count);
|
||||
}
|
||||
else
|
||||
{
|
||||
System.Buffer.BlockCopy(_data, _head, dst, offset, right);
|
||||
System.Buffer.BlockCopy(_data, 0, dst, offset + right, count - right);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user