uPacketDivision
v1.0.0 Released
주어진 데이터( System.IntPtr
또는 배열)를 지정된 크기로 나누어 입력 순서에 관계없이 복원하는 네이티브 플러그인입니다. UDP를 통해 대용량 데이터를 전송하는 등의 사용 사례를 위한 것입니다.
https://github.com/hecomi/uPacketDivision.git#upm
을 추가합니다.https://registry.npmjs.com
com.hecomi
현재는 Windows용으로만 제작되었습니다.
Divider
만들고 배열을 입력(또는 Divide(System.IntPtr, int size)
)으로 사용하여 Divide<T>(T[])
호출합니다. 이렇게 하면 패킷이 내부적으로 분할됩니다.
Divider divider = new Divider ( ) ;
void Divide ( )
{
Texture2D image ;
var pixels = image . GetPixels32 ( ) ;
divider . maxPacketSize = packetSize ;
divider . Divide ( pixels ) ;
}
그런 다음 분할된 데이터를 어떤 방식으로든 리모콘으로 보냅니다. 다음 기능을 사용할 수 있습니다.
GetChunkCount()
.GetChunk()
byte[]
배열GetChunkSize(int index)
.GetChunkData(int index)
. uOSC . uOscClient client ;
void Send ( int width , int height )
{
client . Send ( "/Size" , width , height ) ;
for ( uint i = 0 ; i < divider . GetChunkCount ( ) ; ++ i )
{
client . Send ( "/Data" , divider . GetChunk ( i ) ) ;
}
}
포인터와 크기를 직접 사용하려면 대신 GetChunkSize()
및 GetChunkData()
사용하세요.
Assembler
사용하여 전송된 데이터를 어셈블합니다. uOSC를 이용한 수신 부분의 예는 다음과 같습니다.
Assembler assembler = new Assembler ( ) ;
Texture2D texture ;
public void OnDataReceived ( uOSC . Message message )
{
if ( message . address == "/Size" )
{
var w = ( int ) message . values [ 0 ] ;
var h = ( int ) message . values [ 1 ] ;
OnSize ( w , h ) ;
}
else if ( message . address == "/Data" )
{
var data = ( byte [ ] ) message . values [ 0 ] ;
OnData ( data ) ;
CheckEvent ( ) ;
}
}
void OnSize ( int w , int h )
{
texture = new Texture2D ( w , h ) ;
}
void OnData ( byte [ ] data )
{
assembler . timeout = timeout ;
assembler . Add ( data ) ;
}
데이터를 추가할 때마다 다음과 같이 완료 또는 손실을 확인합니다.
void CheckEvent ( )
{
switch ( assembler . GetEventType ( ) )
{
case EventType . FrameCompleted :
{
OnDataAssembled ( assembler . GetAssembledData < Color32 > ( ) ) ;
break ;
}
case EventType . PacketLoss :
{
var type = assembler . GetLossType ( ) ;
Debug . LogWarning ( "Loss: " + type ) ;
break ;
}
default :
{
break ;
}
}
}
배열 대신 포인터와 그 크기를 얻으려면 다음 API를 사용할 수 있습니다.
var index = assembler . GetAssembledFrameIndex ( ) ;
var data = assembler . GetFrameData ( index ) ;
var size = assembler . GetFrameSize ( index ) ;
OnDataAssembled ( data , ( int ) size ) ;
assembler . RemoveFrame ( index ) ;
그러면 다음과 같이 데이터 재구성이 완료됩니다.
void OnDataAssembled ( Color32 [ ] pixels )
{
texture . SetPixels32 ( pixels ) ;
texture . Apply ( ) ;
GetComponent < Renderer > ( ) . material . mainTexture = texture ;
}