SDK Bug & Feature Requests

Please check out the following rules and use the provided template when posting a bug report! Off-topic posts will be deleted.http://bit.ly/vrchat-bug-reports
[SDK 3.8.1+] Excessive SDK console log spam due to undefined log category
In VRCSDK 3.8.1 and later several log invokations ( VRC.Core.Logger.Log() ) in internal SDK assemblies (e.g. VRCSDKBase-Editor.dll and VRCCore-Editor.dll ) as well as VRC.SDKBase.Editor.EnvConfig.cs do not define the log category anymore, resulting in excessive console logging with no real added value to the end user. In 3.7.5 and earlier SDKs with old logger, DebugLevel.All enum was passed as a parameter every time these messages would be logged, resulting in nothing being visible to the end user. From 3.7.6 up to 3.8.0 after SDK logger rewrite, "All" string was passed as a parameter due to the DebugLevel enum getting replaced by a generic category string parameter, still resulting in all messages being hidden. In previous versions of the SDK not a single log entry would appear in the editor's console unless something important was actually happening and the end user should be informed about it. In 3.8.1 many of the category parameters were mysteriously removed, resulting in 14 entries appearing in the console on every assembly reload (see attachments). The increased logging takes up third of the console window's footprint on every assembly reload and makes it very difficult to spot actually important log entries. Below I have listed the different messages originating from DLLs in the SDK with their stack traces. (The rest are primarily from VRC.Editor.EnvConfig:ConfigurePlayerSettings() located in the VRC.SDKBase.Editor assembly) Reloading Assemblies UnityEngine.Debug:Log (object,UnityEngine.Object) VRC.Core.Logger:Log (string,string,UnityEngine.Object) VRC.SDK3.Editor.EditorAssemblies:OnCompileScripts () No local config found at 'C:/Users/[REDACTED]/AppData/LocalLow/[REDACTED]/[REDACTED]\config.json' UnityEngine.Debug:Log (object,UnityEngine.Object) VRC.Core.Logger:Log (string,string,UnityEngine.Object) VRC.Core.LocalConfig:FetchConfig (System.Action,System.Action) VRC.Core.LocalConfig:.ctor (string,bool,bool) VRC.Core.ConfigManager:.cctor () VRC.Editor.EnvConfig:ConfigureSettings () (at ./Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/EnvConfig.cs:125) VRC.Editor.EnvConfig:EditorUpdate () (at ./Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/EnvConfig.cs:91) UnityEditor.EditorApplication:Internal_CallUpdateFunctions () No local config found at 'C:/Users/[REDACTED]/AppData/LocalLow/[REDACTED]/[REDACTED]\null' UnityEngine.Debug:Log (object,UnityEngine.Object) VRC.Core.Logger:Log (string,string,UnityEngine.Object) VRC.Core.LocalConfig:FetchConfig (System.Action,System.Action) VRC.Core.LocalConfig:.ctor (string,bool,bool) VRC.Core.ConfigManager:.cctor () VRC.Editor.EnvConfig:ConfigureSettings () (at ./Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/EnvConfig.cs:125) VRC.Editor.EnvConfig:EditorUpdate () (at ./Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/EnvConfig.cs:91) UnityEditor.EditorApplication:Internal_CallUpdateFunctions () FetchConfig UnityEngine.Debug:Log (object,UnityEngine.Object) VRC.Core.Logger:Log (string,string,UnityEngine.Object) VRC.Core.RemoteConfig:FetchConfig (System.Action,System.Action) VRC.Core.BaseConfig:Init (System.Action,System.Action,bool) VRC.Editor.EnvConfig:ConfigureSettings () (at ./Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/EnvConfig.cs:128) VRC.Editor.EnvConfig:EditorUpdate () (at ./Packages/com.vrchat.base/Editor/VRCSDK/Dependencies/VRChat/EnvConfig.cs:91) UnityEditor.EditorApplication:Internal_CallUpdateFunctions () finshed fetching and set config UnityEngine.Debug:Log (object,UnityEngine.Object) VRC.Core.Logger:Log (string,string,UnityEngine.Object) VRC.Core.RemoteConfig/<>c__DisplayClass1_0:<FetchConfig>b__0 (VRC.Core.ApiContainer) VRC.Core.APIResponseHandler/<HandleResponse>d__5:MoveNext () Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskVoid`1<VRC.Core.APIResponseHandler/<HandleResponse>d__5>:Run () (at ./Packages/com.vrchat.base/Runtime/VRCSDK/Plugins/UniTask/Runtime/CompilerServices/StateMachineRunner.cs:104) Cysharp.Threading.Tasks.Internal.ContinuationQueue:RunCore () (at ./Packages/com.vrchat.base/Runtime/VRCSDK/Plugins/UniTask/Runtime/Internal/ContinuationQueue.cs:194) Cysharp.Threading.Tasks.Internal.ContinuationQueue:Update () (at ./Packages/com.vrchat.base/Runtime/VRCSDK/Plugins/UniTask/Runtime/Internal/ContinuationQueue.cs:159) Cysharp.Threading.Tasks.Internal.ContinuationQueue:Run () (at ./Packages/com.vrchat.base/Runtime/VRCSDK/Plugins/UniTask/Runtime/Internal/ContinuationQueue.cs:118)
2
·

tracked

VRC Object Sync - MAJOR Performance Issues With a Real Solution
VRC Object Sync by default is a continuously operating script that pings locations to all players even when objects are at rest or behind the player/occluded by the world. As a result, once the object pool reaches higher numbers, over 200, frame times are permanently hindered as the game waits for all these pings. I'd tested in my world the difference between VRChat's default Object Sync script and MMMaellon's Smart Object Sync on about 212 objects. Performance with default object sync raised frame times to 16.7-17ms. MMMAellon's Smart Object Sync brought framerates down to 2.4-3ms, an overall savings of around 4-5x performance improvement. And this is not on a slow PC - this is on a Ryzen 7 7800x3D with a Noctua NH-12s cooler, an RTX 4070, and 64 GB of RAM. You cannot simply add power to fix the problem. MMMaellon's script does a lot to improve performance, but the core function allows objects at rest to stop pinging unless exerted by an external force. They are also developing a newer version of the script that cuts bandwidth in half. As VRC adds more dynamic global objects through the inventory system, I fear this issue will only become more exasperated the longer global sync gets ignored. I highly recommend enabling higher performance syncing methods by default for newer worlds and enabling the older sync system only when absolutely necessary. As many maps feature QV pens, pool tables, grabbable pillows, coffee and drink prefabs, and other grabbable synced objects, this will have an immediate performance impact across the entire game, and it's something all creators need to be made aware. https://github.com/MMMaellon/SmartObjectSync
2
·

tracked

[VRCCameraSettings] Property to tell which camera is currently rendering
Within a render callback such as OnWillRenderObject, it's useful to be able to check which camera is rendering. Unity has "Camera.current" for this, but it's not exposed to Udon. The new camera API is awesome, but without a property like that, I still can't make my UdonPortals prefab render correctly in the hand-held camera because there's no way to tell which camera is currently triggering OnWillRenderObject. I'd like a property to tell which camera is responsible for the render. A really simple implementation would be a new read-only property like: VRCCameraSettings.CurrentCameraType: An enum consisting of the values "ScreenCamera" or "PhotoCamera". However, I think this API could be extended further to be even more useful. In particular, if a Camera that was created by the world (and so is already accessible to Udon) is rendering, it would be great to be able to access the actual Camera object! Just like Unity's "Camera.current", but only limited to world-created Cameras. An API might look like this: VRCCameraSettings.CurrentCameraType: Enum consisting of the values "ScreenCamera", "PhotoCamera", "WorldCamera", or "Other". "WorldCamera" would be any camera created by the current world, i.e. a Camera that's accessible to Udon. "Other" would be anything else that isn't (yet!) accessible to Udon, e.g. avatar cameras or the screenshot camera. VRCCameraSettings.CurrentCamera: A reference to the current Camera object, just like Unity's Camera.current, except it's only set when CurrentCameraType is "WorldCamera". Otherwise, it's null.
2
·

tracked

Load More