Bug Reports

  • No off-topic posts
  • Don't report more than 1 issue at once
  • For isolated issues or customer support visit help.vrchat.com
Thanks for your bug report!
Local-only avatar contacts vanishing after changing avatars in populated instances
Enter a popular instance with any avatar with lots of local-only contacts (the one I was testing is avatar ID: [avtr_c701d721-8543-4f4e-a524-d34c52eb545b]. If you do use this, be sure to enter the expressions menu, enable the "Combat" setting, and choose the Guardian Sword/Shield weapon option to most easily see the contacts. That is what the pictures attached are of). Enable your debug overlay so you can see contacts (the avatar above, if you have the Guardian Sword/Shield equipped, should have a receiver on the hilt of the sword on your left hip). Swap to any other avatar (I swapped into both [avtr_afa9d203-c185-4eb1-8933-b37eb75ae711] and [avtr_3a96e532-d5bd-4925-a92b-ab55a1d0b45e], both avatars with high local-only contact counts due to a cross-interactive health system. Both were afflicted by the bug). Swap back into the avatar with lots of local-only contacts. Repeat steps 3 and 4 until you can no longer see local-only contacts. The more people with contact-heavy avatars, the faster the bug seems to happen (a friend testing with duplicates of the avatar ID in step 1 had only 4 people in the instance and the bug happened immediately). Sometimes only some of the local contacts vanish, not all of them. Strangely all nonlocal contacts remain present. This only affects local contacts. Rejoining the instance will return the local contacts, but only while you are in the avatar. They begin vanishing when you start swapping avatars again. First image is alone in a home world. The second image is of the same avatar after swapping out of and then back into it while in a populated Black Cat instance. This bug seemed to be happening in the previous build as well, but much less consistently. I was unable to reproduce it then and only encountered it a couple of times until the current build 1553. On a personal note: My whole gimmick as a creator is touch and motion-based avatars that have high amounts of cross-interaction using lots of local contacts, so having the very backbone of my entire creation style become completely unusable after swapping avatars is infuriating, to say the least. I hope this is resolved soon.
9
·

tracked

[1553] OnDeserialization not guaranteed to fire for late joiners
I created a texture synchronization system, but faced a situation where OnDeserialization was not running randomly. This was a random event where the result could change each time the same person rejoins, but it could tend to happen if the number of people who have joined or currently exist in the instance is large, or if there is a lot of data to be synchronized. However, this can also happen in instances where there are only two people, or instances with a small number of data (although a larger number than usual, since two or three 512x512x2bytes of data are synchronized). The following code was used for testing. (It is a bit complicated because it is the code of an actual application.) [1] https://github.com/Narazaka/SyncTexture/blob/b0a209acfbcf334fb04ef861312bb6c6f341271c/SyncTextureData.cs In the normal flow, when OnDeserialized is called, ApplyReceiveData() is called, and the [SyncTexture] ... ApplyReceiveColorsPartial() [ReceiveEnabled=True] is logged. This is indicated by the following data restore and apply logs that follow after join and before OnPlayerJoined in normal.txt. [2] 2024.12.11 01:46:07 Log - [Behaviour] All 8 bunches for SyncTextureData0 collected, now restoring. 2024.12.11 01:46:07 Log - [SyncTexture] ApplyReceiveColorsPartial() [ReceiveEnabled=True] 2024.12.11 01:46:07 Log - [SyncTextureShaderDXT] SyncTextureShaderDXTCamera.OnReceiveApplied 2024.12.11 01:46:07 Log - [Behaviour] All 8 bunches for SyncTextureData1 collected, now restoring. 2024.12.11 01:46:07 Log - [SyncTexture] ApplyReceiveColorsPartial() [ReceiveEnabled=True] However, in the abnormal case, OnDeserialized is not called after data restoration. To solve this, the callback TryApplyReceiveDataFromStart() , which is called 3 seconds after Start(), calls the same process if data is found and writes logs like [SyncTexture] ... Trying to get data and found non null data! [3] https://github.com/Narazaka/SyncTexture/blob/b0a209acfbcf334fb04ef861312bb6c6f341271c/SyncTextureData.cs#L64 The not-fired.txt is the log when this situation occurred, and the following data restore log is flowing before OnPlayerJoined, but [SyncTexture] ... ApplyReceiveColorsPartial() [ReceiveEnabled=True] that should flow when OnDeserialized is called is not flowing. [4] 2024.12.11 03:09:07 Log - [Behaviour] All 8 bunches for SyncTextureData2 collected, now restoring. 2024.12.11 03:09:07 Log - [Behaviour] All 8 bunches for SyncTextureData3 collected, now restoring. 2024.12.11 03:09:07 Log - [Behaviour] All 8 bunches for SyncTextureData4 collected, now restoring. After OnPlayerJoined, there is a log that flows during the countermeasure callback, and the data application log is also flowing. [5] 2024.12.11 03:09:10 Log - [SyncTextureData] (SyncTextureData36) Trying to get data but not received. 2024.12.11 03:09:10 Warning - [SyncTextureData] (SyncTextureData52) Trying to get data and found non null data! 2024.12.11 03:09:10 Log - [SyncTexture] (-1210292) ApplyReceiveColorsPartial() [ReceiveEnabled=True] 2024.12.11 03:09:10 Log - [SyncTextureShaderDXT] SyncTextureShaderDXTCamera.OnReceiveApplied 2024.12.11 03:09:10 Warning - [SyncTextureData] (SyncTextureData25) Trying to get data and found non null data! 2024.12.11 03:09:10 Log - [SyncTexture] (-892658) ApplyReceiveColorsPartial() [ReceiveEnabled=True] From this it can be said that there are cases where OnDeserialized is not called even when data is restored. This problem has happened in the past and VRChat is aware that it has been resolved, but it still seems to be happening. [6] https://feedback.vrchat.com/bug-reports/p/1537-ondeserialization-fires-without-any-networked-data-changes-for-late-joiners -------------------- 私はテクスチャ同期システムを作りましたが、OnDeserializationがランダムに実行されない状況に直面しました。 これは同じ人でもrejoinの度に結果が変わりうるランダムな事象でしたが、インスタンスにこれまでjoinした人数、または現在存在する人数が多いか、あるいは同期されるデータが多いと起こりやすくなる傾向がある可能性があります。しかしたった2人だけしかいないインスタンスや、データ数のすくない(とはいっても512x512x2byteのデータが2、3個同期されているので通常よりは大量ですが)インスタンスでも起こりえます。 テストに使ったのは以下のコードです。(実際のアプリケーションのコードなので少し煩雑ですが) [1] 通常のフローではOnDeserializedが呼ばれると ApplyReceiveData() が呼ばれ、この先でデータを描画する時に出る [SyncTexture] ... ApplyReceiveColorsPartial() [ReceiveEnabled=True] というログが流れます。 これはnormal.txtでjoin後OnPlayerJoinedより前に以下のようにデータリストアと適用のログが続いていることに示されています。 [2] しかし異常ケースだとOnDeserializedがデータリストア後に呼ばれません。この対策のためStart()のあと3秒後に呼ばれるコールバック TryApplyReceiveDataFromStart() が、もしデータが見付かった場合同様の処理を呼び、 [SyncTexture] ... Trying to get data and found non null data! といったログを書くようにしました。 [3] not-fired.txtはこの状況になった時のログで、OnPlayerJoinedの前に以下のデータリストアのログが流れていますがOnDeserializedが呼ばれると流れるはずの [SyncTexture] ... ApplyReceiveColorsPartial() [ReceiveEnabled=True] が流れていません。 [4] OnPlayerJoinedの後になってから対策コールバック時に流れるログが出て、データの適用ログも流れています。 [5] このことから、データがリストアされてもOnDeserializedが呼ばれないケースが存在することが言えます。 この問題は過去にもあって、VRChatは解決済みと認識していますが、相変わらず起きているようです。 [6]]
2
·

tracked

Load More