{"id":15018123,"url":"https://github.com/euan142/lazyoptimiser","last_synced_at":"2025-04-05T21:08:06.860Z","repository":{"id":45002438,"uuid":"511432021","full_name":"euan142/LazyOptimiser","owner":"euan142","description":"An experimental tool to apply some automatic optimisations to an avatar","archived":false,"fork":false,"pushed_at":"2025-02-20T10:29:45.000Z","size":347,"stargazers_count":116,"open_issues_count":5,"forks_count":7,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-04-05T21:08:02.878Z","etag":null,"topics":["optimization","unity","vrchat"],"latest_commit_sha":null,"homepage":"http://lazyoptimiser.euan.net/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/euan142.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2022-07-07T07:44:56.000Z","updated_at":"2025-03-30T13:58:25.000Z","dependencies_parsed_at":"2024-01-22T23:05:06.546Z","dependency_job_id":null,"html_url":"https://github.com/euan142/LazyOptimiser","commit_stats":{"total_commits":81,"total_committers":4,"mean_commits":20.25,"dds":0.07407407407407407,"last_synced_commit":"871802f9f9e08fc6353212498c2dfef5134f0496"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euan142%2FLazyOptimiser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euan142%2FLazyOptimiser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euan142%2FLazyOptimiser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euan142%2FLazyOptimiser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/euan142","download_url":"https://codeload.github.com/euan142/LazyOptimiser/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247399877,"owners_count":20932876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["optimization","unity","vrchat"],"created_at":"2024-09-24T19:51:28.698Z","updated_at":"2025-04-05T21:08:06.834Z","avatar_url":"https://github.com/euan142.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Introducing the Lazy Optimiser for VRChat!\nEver get annoyed you have to go back and re-optimise an avatar because you want to add / adjust something? Want to push what your avatar can do but frustrated by the amount of time that you need to spend optimising? Well you too can be lazy (somewhat) in your avatar creation but still be (somewhat) optimised using these automated tools![^1]\n\n**Forewarning**  \nThis is an experimental side project! Expect infrequent updates and occasional bugs, especially as various assumptions have to be made about the avatar.\n\n## Requirements\n- [The Unity version recommended by VRChat](https://docs.vrchat.com/docs/current-unity-version)\n- [VRChat Creator Companion](https://vrchat.com/home/download)\n\n## Setup\nYou can either go to [https://lazyoptimiser.euan.net/](https://lazyoptimiser.euan.net/) OR download and add the package in [the releases section](https://github.com/euan142/LazyOptimiser/releases)\n\nLazy Optimiser will automatically be run on avatar build.\n\n## What does it do?\nCurrently the following optimisations are done (listed in order of execution)\n\n**Remove unused gameobjects**  \nAny gameobjects that are not necessary based on if they're active, animated, used in skinned meshes or dynamic bone are stripped. This is useful for stripping unused assets in general, say you have multiple outfits on the avatar structure but are only using one, the unused ones will be stripped.\n\n**Remove unused blendshapes**  \nAny blendshapes not set, animated or used for things like viseme are stripped from skinned meshes. Additionally any blendshapes that are set but never animated or used for things like viseme are baked. This is useful to reduce file size and reduce runtime expense.\n\n**Merge meshes**  \nBased on animations, what's active and such it will merge meshes together. This is useful as you want to minimise the amount of skinned meshes in use (with minor exceptions such as separating meshes using blendshapes).\n\n**Removal blendshapes (remove blendshape vertices from mesh)**  \nNon-animated blendshapes with a non-zero weight with names begining with \"remove_\" will be used to delete parts of the mesh. For the removal it takes any affected vertices of the blendshape. An example use case is having the full base mesh in unity with one or more outfits, without this tool the mesh beneath the clothing would not be removed, however with this areas not seen can be marked with a blendshape in blender then utilised as a \"removal blendshape\".\n\n## TODO\nHere's some stuff I want to see done, either by myself or someone else. Some I'm not exactly sure how to do or if are effectively possible.\n\n**Material combiner / Atlaser**  \nDetect similar materials on meshes that can be combined accounting for materials / material slots that are animated\n\n**Texture optimiser**  \n(potentially part of the atlaser) Edit textures to only contain what's used in the UVs (with some padding of course)\n\n**Hidden mesh detection**  \nDetect occluded body mesh using lights rendering to texture or something, then remove the hidden mesh\n\n**Conditional exclusions**  \nAllow the avatar creator to set up conditions which exclude things from being removed, merged, etc\n\n**Debug mode**  \nHave an editor window allowing global disabling of various optimisation steps and outputting of the generated result as a prefab for inspection\n\n**Bake / strip bones not actively affected**  \nEssentially if a bone is weighted but isn't a humanoid bone, affected by a constraint, secondary motion script, etc then it doesn't need to be there. What should be done is the weights of the bone should be given to the parent bone in these cases, then the process is run iteratively upwards until there is no useless bones.\n\n\n## Thanks\nThis project was not done alone! The prototype of the blendshape remover was written by @FrostbyteVR, they also wrote the logic that actually merges given skinned meshes together (turns out unity didn't make it so easy)\n\n## Contribute\nDo you want to help raise the bar of optimisation in VRChat? Do you want to be lazier in your avatar creation but not sacrifice performance? Then please do feel free to help expand this project, there's so much more this could do (as mentioned in the TODO's) and I can't do this alone\n\n## Other useful tools\n[VRCAvatarActions](https://github.com/euan142/VRCAvatarActions/) - Allows you to avoid getting into animators for most things in Avatars 3.0  \n  \n  \n[^1]: It's always important to optimise what can't be done in these tools as well, these tools can't decimate your avatar for example","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feuan142%2Flazyoptimiser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feuan142%2Flazyoptimiser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feuan142%2Flazyoptimiser/lists"}