いつもお世話になっております。
マルチプレイにおいてある程度大きいサイズの変数配列(想定として数Mバイト程度)のレプリケートを、多少時間がかかっても良いので行いたいと考えています。
具体的には最近話題のWebカメラ画像の共有をUE4で試してみようかなと思い、
ひとまずWebカメラから取得したメディアテクスチャをFColorの配列に変換して、それを再びテクスチャにする所まで作成したのですが、配列(下画像赤枠)を他のクライアントにレプリケートする方法で詰まっております。
現状試した中では、単純に配列のままレプリケートしようとするとReplicationの最大配列サイズに引っかかり、構造体にTArrayを宣言してレプリケートをしようとするとエンジンがクラッシュするといった状態です。
解決策の一つとして配列をいくつかに分割して順番にレプリケートしていけばやってやれない事は無いとは思うのですが、制御がやや複雑になりそうなのでもう少しシンプルに実装できないかと考えております。
Blueprint、C++どちらの実装でも構わないので何か配列をまとめてレプリケートする方法があればお教えいただきたいです。よろしくお願いします。
Replicationから離れることをおすすめします
Replicationにそのように巨大なデータを載せようとすると、たとえ目的のデータを優先して載せられたとして、他のデータがまず間違いなく載らなくなります
ということは、本来必要なデータ(PlayerController、PawnのTransformなど)の共有が阻害されます
ですので、どうしても直接通信で解決したいのであれば、Replicationとは別の独自の通信ラインを持つべきでしょう
(そうなれば次はCPUか回線の問題になりますが)
生の画像を一切の圧縮もなしに送信しようとするのも問題があると思っています
Webカメラ画像の共有 とあるのでおそらく最終目標は動画だと思いますが、30fpsと仮定して、1920*1080の非圧縮32bitカラーの動画を送信するとなると、伝送速度は少なくとも2Gbpsは必要です
現代の通常回線では流石に不可能かと思います
単にWebカメラのストリーミング再生を行いたいだけであれば、録画・配信部分はUE4外に持つほうが早く目的が達成できると思います
下記の動画は上記の方針で実装しているので、参考になるかと思います
参考ドキュメント:
素早い回答本当にありがとうございます。
確かに無圧縮で画像データを送るのは私自身現実的では無いなと考えていたのですが、質問の本質からズレてしまうなと思い画像データの圧縮やfpsに関しては意図的に記述を避けていました。申し訳ありません。
今回は要素技術の調査もかねて作成していた物で、データの圧縮自体はFColorの構造体を取得出来た段階でどうにでも出来そうですし、動画というよりも単純に操作があった特定のタイミングのWebカメラの画像を他クライアントに送信して、1~2秒程度で送信が完了したら御の字だな程度に考えていました。
意図としましては、画像データだけでなく純粋に重めのデータを他クライアントに送信する必要が出てきた場合どの道ボトルネックになりそうな要素であり、私自身ネットワーク周りの知識がほぼ無いため質問させていただいたという次第になります。
ただ動画のストリーミング部分に関しても後々調べていこうと思っていた要素だったので、ドキュメント自体はとても参考になりました。ありがとうございます。
それで追加の質問になってしまうのですが、
独自の通信ラインと言うことは、UE4のフレームワーク内で接続中のクライアントに対して通信ラインを別途生成する方法が別途用意されているのでしょうか?
それとも各OSごとのAPIを直接叩いて通信する形になってしまうのでしょうか?
質問ばかりで申し訳ないのですが、今後の設計の参考にさせて頂きたいのでお教えいただけると助かります。
各OSや通信形態に応じたAPIを叩いて通信することになります
その代わり、データ設計に関しては自由になるため、Replicationではやりづらいこともできるようになります
OSの違いを吸収するWrapperがUE4の中に組み込まれていたかどうかまでは覚えてはいませんが、MarketplaceにもTCPやUDPで通信する機能を提供するPluginがそこそこあるため、それらを用いるか参考にすれば、実装は容易かと思います
なるほど、Marketplaceは盲点でした。
流石に自力で一からAPIをいじるのは辛いなと思っていたので、Marketplaceで色々探してみることにします。
回答ありがとうございました。