uPacketDivision
v1.0.0 Released
これは、入力順序に関係なく、指定されたデータ ( System.IntPtr
または配列) を指定されたサイズに分割して復元するネイティブ プラグインです。これは、UDP 経由で大規模なデータを送信するなどのユースケースを目的としています。
https://github.com/hecomi/uPacketDivision.git#upm
をパッケージ マネージャーに追加します。https://registry.npmjs.com
com.hecomi
現時点では、Windows 向けにのみ構築されています。
Divider
を作成し、配列を入力としてDivide<T>(T[])
を呼び出します (またはDivide(System.IntPtr, int size)
)。これにより、パケットが内部で分割されます。
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 ;
}