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
|
fileFormatVersion: 2
|
||||||
guid: db9ced8ef8f2e9545a2a749dcb909f3f
|
guid: 454f6287cca1ad140aa09757624c67f6
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
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
|
fileFormatVersion: 2
|
||||||
guid: 4506f7a0cebc42043b734e5824a21f76
|
guid: 886c48d92cb0ea4419c8131cf0b2f865
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
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
|
fileFormatVersion: 2
|
||||||
guid: 302145da5b949d148965c386a09371c0
|
guid: 1b33a27a75114b7488254dac4703efad
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
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