Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

同期データが非常に多い場合にManual Object Syncがlate joinerに対して初回同期しない #19

Open
Narazaka opened this issue Dec 21, 2024 · 6 comments
Labels
bug Something isn't working

Comments

@Narazaka
Copy link

Narazaka commented Dec 21, 2024

以下ワールド等で発生します

おっぱいマウスパッドのある家
https://vrchat.com/home/world/wrld_1b9acdd9-9999-45bb-b249-8909306558c2/info
ゆとるーむBeta
https://vrchat.com/home/world/wrld_d21541bb-999b-4257-96d4-c9655553371e/info

late joinerへの画像同期で大量のデータを保持している場合、確率的に同期せず初期位置のままになります。Pickupしたりすると同期します。
ゆとるーむだと写真4個+抱き枕1個くらい
マウスパッドだととりあえず全部撮ると

@Narazaka
Copy link
Author

VRCObjectSyncのほうかもしれないと言う気もしてきた
一旦閉じる

@Narazaka
Copy link
Author

Narazaka commented Dec 21, 2024

VRCObjectSyncではなかった
これ案件ぽい気がする
https://feedback.vrchat.com/bug-reports/p/1553-ondeserialization-not-guaranteed-to-fire-for-late-joiners

@Narazaka Narazaka reopened this Dec 21, 2024
@Narazaka
Copy link
Author

Narazaka commented Dec 21, 2024

同期データを書き込んだときから時間がたつと落ち着きがち?

@Narazaka
Copy link
Author

ワークアラウンドとしてOnDeserializationが呼ばれない場合でもフォールバックして欲しい要望かもしれないです(

@mimyquality
Copy link
Owner

状況的に OnDeserialization() のドロップが起きているのが主因と思います。

インスタンスが立ってから一度も動いていない Manual ObjectSync では(同期するものが無いため) OnDeserialization() は発火しませんが、これと通信過多によるドロップとを見分ける手段がOwnerにもlater-joinerに無いため、自動で再同期するのはだいぶ厳しいですね。
再同期要求するにしても、
現状Ownerからの無差別送信しかできないので、誰かが入ってくる度に無差別に同期送信する初期の標準later-joiner同期機構と同じ問題を抱えることになる事、
later-joinerにとってはサーバーからの OnDeserialization() とOwnerからの OnDeserialization() が二重に送られてくることになる事から、
Manual ObjectSyncとしては対応しません。

定期的 or 誰かが入ってきてから数秒後 とかに、初期位置から少しでも変動があったら Manual ObjectSync にRequestSerialization() を飛ばす追加コンポーネントを用意する…?

@Narazaka
Copy link
Author

うちのワールドでは「OnDeserializationは呼ばれないがデータだけは同期している状態」を観測したため、非Ownerにおいて「Startから数秒後に同期変数をチェックして初期値では無い場合OnDeserializationに当たる処理を走らせる」で回避しました。
同期変数の初期値が区別付くならこういう方式でも良いかもと思います。

@mimyquality mimyquality added the bug Something isn't working label Dec 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants