お世話になっております。
専用サーバーをつかったクライアント同士の対戦ゲームで、自機が敵にキルされたときに
そのキルリプレイを自機クライアント側で再生したあとにゲーム再開という実装を行いたいと考えています。
自機クライアント側でリプレイを撮影すると、レプリケーションの観点から情報が欠落してしまう可能性があるため、
ゲームサーバーでリプレイを撮影して、キルリプレイが必要なクライアントに配信するという形がいいのかなと
私は考えているのですが、この機能を実現するための方法はございますでしょうか。
よろしくお願いします。
UE4にはそのような機能はないのでぜひ作ってみてください、が回答になります
以下、提案された手法に対する個人的な考察です
まず、サーバからクライアントにリアルタイムでリプレイを送る、というのは現実的ではないと考えています
撮影、とあるので動画形式で保存・配信するつもりであると捉えました
動画というのはかなりサイズが大きいのです
僕らが普段Youtube等で見ている動画は、配信のためにそれなりのCPUパワーと時間をかけてエンコードしています
生放送でもリアルタイムでエンコーディングしているので、実際は30秒程度の配信ラグがあります
ですので、キルされて数秒以内にリプレイを送信、というのはまず間に合わないでしょう
それに、サーバ側で撮影するということは、ゲームの参加者全員分の動画を同時に取る必要があります
誰がいつキルされるかわかりませんので…
ゲームサーバにそれをリアルタイムで行う余裕はありません
そんなことをしてる暇があるならもっとゲーム内容の改善に回したいです
ついでにいうとDedicatedServerは基本ヘッドレスであり、レンダリング機能は持ちません
ですので、動画を取ることそのものができないでしょう
自機クライアント側でリプレイを撮影すると、レプリケーションの観点から情報が欠落してしまう可能性がある
これについてですが、当然サーバ側でも同じことが言えます
古典的なチート手法ですが、回線を細くすることでサーバに送信する情報を欠落させ、ワープさせる手法があったりします
わざと起こしたものでなくとも、通信経路次第では似たようなことが起こりえます
そういうことが起こった場合に、サーバの情報が常に正しい、と言えるでしょうか?
そもそもそこに疑問を持ってしまうと、リプレイより本筋のゲーム部分のほうが大きな問題になると思うのですが、どうでしょう?
上記の理由から、個人的にはインスタントなリプレイをわざわざサーバにさせる、というのはメリットがないんじゃないかなーと思います
ReplaySystem:
ご返答ありがとうございます。
まず、サーバからクライアントにリアルタイムでリプレイを送る、というのは現実的ではないと考えています
撮影、とあるので動画形式で保存・配信するつもりであると捉えました
動画というのはかなりサイズが大きいのです
僕らが普段Youtube等で見ている動画は、配信のためにそれなりのCPUパワーと時間をかけてエンコ
ードしています
生放送でもリアルタイムでエンコーディングしているので、実際は30秒程度の配信ラグがあります
ですので、キルされて数秒以内にリプレイを送信、というのはまず間に合わないでしょうそれに、サーバ側で撮影するということは、ゲームの参加者全員分の動画を同時に取る必要があります
誰がいつキルされるかわかりませんので…ゲームサーバにそれをリアルタイムで行う余裕はありません
そんなことをしてる暇があるならもっとゲーム内容の改善に回したいですついでにいうとDedicatedServerは基本ヘッドレスであり、レンダリング機能は持ちません
ですので、動画を取ることそのものができないでしょう
説明が足りなくて申し訳ありません。
専用サーバーでMemory Streamerなどでリプレイをとっておいて、
プレイヤー死亡時に何かしらの方法でクライアントでそのリプレイの特定期間を再生させる簡単な方法を模索しています。
これについてですが、当然サーバ側でも同じことが言えます
古典的なチート手法ですが、回線を細くすることでサーバに送信する情報を欠落させ、ワープさせる>手法があったりします
わざと起こしたものでなくとも、通信経路次第では似たようなことが起こりえます
そういうことが起こった場合に、サーバの情報が常に正しい、と言えるでしょうか?
そもそもそこに疑問を持ってしまうと、リプレイより本筋のゲーム部分のほうが大きな問題になると
思うのですが、どうでしょう?
おっしゃるとおり、仮にクライアントと専用サーバーのデータでレンダリングを行った場合みために齟齬がでますが、そのへんは
わりきって撮影者側の世界を是とします。
専用サーバーでMemory Streamerなどでリプレイをとっておいて、 プレイヤー死亡時に何かしらの方法でクライアントでそのリプレイの特定期間を再生させる
それだと結局ほぼ同じものを2回送ることになるので、単に欠落する可能性が倍になるだけだと思うのですが…
むしろ送り方によっては更に欠落する可能性が高まるような気がしますね
あとキルが集中するとそれなりの負荷になりませんかね?
考えておられる内容だとクライアントごとに個別で送る必要がある分サーバ側の瞬間的な負荷や通信量が倍増するように思います
サーバやインフラの予算が潤沢であればよいのですが
いずれにしろ個人的にはメリットよりデメリットのほうが大きいように思いますね
僕ならドキュメントで推奨されているとおり、クライアント側でのMemoryStreamerを使います
できるだけサーバ側の仕事は減らしたいですから