Feature Requests

Please check out the following guidelines before suggesting a feature! Off-topic posts will be deleted.
Better Ranking for Triangle inside the Avatar SDK
Currently, the triangle part of VRChat’s Avatar Performance Rank is misleading on PC because it creates a hard cliff that does not match real-world performance behavior. a genuinely heavy avatar can still rank Excellent, and a well-optimized avatar can still end up as Very Poor. The triangle thresholds on PC also make the system feel unfair. On PC, the official limits are 32,000 triangles for Excellent and 70,000 triangles for Good, and the triangle cap is still 70,000 for Medium and Poor. Anything above 70,000 immediately becomes Very Poor because that rank is unbounded. That means 70,001 triangles is treated the same as massively unoptimized avatars, which is discouraging and makes creators stop caring once they cross that single line. On PC and PCVR, triangles are not automatically the primary performance problem. They can matter, especially for skinned meshes and when combined with other expensive features, but VRChat’s own optimization guidance puts strong emphasis on reducing draw calls and CPU overhead by limiting skinned meshes and material slots. Each additional material slot is effectively another draw call and consumes more processor time, and material slots also drive submesh creation which adds draw calls. Texture memory and shader cost can also be major FPS killers, and these factors are explicitly not represented by the rank’s static triangle number. I also tested this in a controlled scenario: a very high-poly avatar (about 2,000,000 triangles, 1 material, 1 skinned mesh) versus a low-poly avatar (about 7,500 triangles, 1 material, 1 skinned mesh) in the VRChat Home world. The FPS difference was relatively small (about 350 FPS vs 375 FPS). This supports the point that, when materials and meshes are kept simple, triangles alone are often not the bottleneck. It does not mean triangles never matter, but it shows why a single harsh cutoff is not a good signal for PC performance. The triangle ranking needs a refactor on PC to remove the 70,000 cliff and provide more meaningful tiers. My suggested triangle tiers would be: 40,000 triangles = Excellent 70,000 triangles = Good 85,000 triangles = Medium 90,000 triangles = Poor 98,000 triangles = Very Poor Why this approach: it keeps optimization incentives alive. With the current system, one extra triangle past 70,000 immediately labels an avatar as Very Poor, so people stop caring. A gradual scale would better reflect reality and encourage creators to keep improving instead of giving up at 70,001. Finally, it is important to remember that rank alone cannot predict FPS. Because the rank does not consider shader complexity, texture resolution, pixel lights, or animator behavior, an avatar that ranks Excellent can still run worse than a higher-ranked avatar if it uses heavy shaders or excessive VRAM. Below is an example profiler graph comparing 110k, 70k, and 45k triangle models. In this test, they show the same end result in terms of performance. Even when I place 80 instances into the scene, the difference between 80×110k triangles and 80×45k triangles is only about 4%. Another test shows that a 30.000 Triangle Avatar with Unoptimized Materials can consume more GPU and CPU Usage compared to a Very Poor Avatar that has Optimized Materials but 70.001 Triangles. Thus; Is missleading.
1
Exposed Lightmap Settings to Udon for swapping Lightmaps at runtime
Currently VRChat does not support native runtime lightmap swapping. Creators must rely on workarounds such as duplicated geometry sets with toggles baked separately, or shader PropertyBlock overrides that depend on internal shader property names. These approaches increase build size, complicate workflows, and can be fragile. This limitation blocks common world features such as day and night cycles and multi scenario lighting setups. Exposing Unity’s lightmap API to Udon would enable a clean and supported solution. Requested API exposure in Udon Core requirements LightmapSettings.lightmaps read and write access Ability to assign an array of LightmapData at runtime LightmapData access Support for lightmapColor Support for lightmapDir for directional lightmaps Support for shadowMask for shadowmask workflows Renderer mapping Write access to Renderer.lightmapIndex Write access to Renderer.lightmapScaleOffset These are necessary to correctly remap renderers when lightmap atlases and packing differ between bakes. Strongly recommended additions LightmapSettings.lightmapsMode So creators can use non directional or directional bakes reliably Light probes access or swapping support LightmapSettings.lightProbes and or equivalent support This is important for dynamic objects and avatars that rely on probes Reflection probe refresh or reassignment hooks A supported way to refresh probes or reassign custom reflections after a swap to keep reflections consistent between scenarios Why this matters With these APIs, creators could bake multiple lighting scenarios such as day, night, indoor, event themes and swap them at runtime without realtime lights and realtime shadows. This reduces performance cost, avoids inflated builds from duplicate geometry, and removes reliance on unsupported shader internals. Suggested minimal acceptance criteria A sample UdonSharp script can assign a new LightmapData array, then update affected renderers lightmapIndex and lightmapScaleOffset, and the scene displays correct baked lighting for both directional and shadowmask modes.
1
Load More