Jump to Content
VRChatGuides
HomeGuides[v2022.4.1]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GuidesVRChat
v2022.4.1
Search
Overview
• Welcome to VRChat
• Getting Started
• Frequently Asked Questions
• Controls
□ HTC Vive Wands
□ Oculus Touch
□ Valve Index Controllers
□ Keyboard and Mouse
□ Gamepad
□ Action Menu
• Additional Options
□ Gesture Toggle
□ Launch Options
□ Configuration File
□ VRChat Performance Options
□ Local VRChat Storage
Guides
• Currently Supported Unity Version
• Choosing your SDK
• Setting up the SDK
• Updating the SDK
• SDK Troubleshooting
• Avatars
□ Creating Your First Avatar
□ Whitelisted Avatar Components
□ Rig Requirements
□ Avatar Optimization Tips
• Worlds
□ Creating Your First World
□ Whitelisted World Components
□ Supported Scripted Assets
□ World Creation, Optimization, and Community Labs Tips
• Two-Factor Authentication
• Upgrading Unity Projects
□ Migrating from 2018 LTS to 2019 LTS
□ Migrating from 2017 LTS to 2018 LTS
□ Migrating from 5.6 to 2017 LTS
• Using VRChat in a Virtual Machine
Avatars
• Avatars 3.0
□ Playable Layers
□ Animator Parameters
□ State Behaviors
□ Expression Menu and Controls
• Avatar Dynamics
□ PhysBones
□ Contacts
□ Permissions and Settings
□ Debugging Avatar Dynamics
VRChat Udon
• What is Udon?
• Getting Started with Udon
• Using Build & Test
• Udon Node Graph
□ Graph Elements
□ Searching for Nodes
□ Event Nodes
□ Type Nodes
□ Special Nodes
• Input Events
• Video Players
□ Video Player Whitelist
• Debugging Udon Projects
• UI Events
• Animation Events
• Player API
□ Getting Players
□ Player Positions
□ Player Forces
□ Player Collisions
□ Player Audio
• Networking
□ Network Components
□ Network Specs and Tips
□ Network ID Utility
• Midi in Udon
• Networking (Legacy)
• World Debug Views
• VRCGraphics
VRChat Quest
• Creating Content for VRChat on Oculus Quest
□ Setting up Unity for Creating Quest Content
□ Quest Content Optimization
□ Cross-Platform Setup
□ Quest Content Limitations
Systems
• VRChat Community Labs
• VRChat Safety and Trust System
• Avatar Particle System Limits
• Avatar Dynamic Bone Limits
• Shader Blocking and Fallback System
• Avatar Performance Ranking System
• Public Avatar Cloning
• Full-Body Tracking
□ IK 2.0 Features and Options
• Avatar Fallback System
VRChat OSC API
• OSC Overview
□ OSC Avatar Parameters
□ OSC Debugging
□ OSC DIY
□ OSC as Input Controller
□ OSC Resources
Examples & Kits
• SDK Prefabs
• Examples
• Udon Example Scene
□ Simple Pen System
□ Udon Video Sync Player
• Obstacle Course
□ Obstacle Course Toolkit
□ Obstacle Course: Build From Demo Parts
□ Obstacle Course: Build From Custom Parts
□ Obstacle Course: How Stuff Works
□ Obstacle Course: Flythrough
• VRChat Kits
□ VRChat Home Kit
Components
• Avatar Components
□ VRC_AvatarDescriptor
□ VRC_IKFollower
• Scene Components
□ VRC_SceneDescriptor
□ VRC_AvatarPedestal
□ VRC_MirrorCamera
□ VRC_MirrorReflection
□ VRC_PortalMarker
□ VRC_CustomRendererBehaviour
□ VRC_Station
□ VRC_Trigger
□ VRC_EventHandler
□ VRC_PlayerAudioOverride
□ VRC_SpatialAudioSource
• Combat Components
□ VRC_CombatSystem
• Prop Components
□ VRC_Pickup
• General Components
□ VRC_AudioBank
□ VRC_DataStorage
□ VRC_DestructibleStandard
□ VRC_ObjectSync
□ VRC_Panorama
□ VRC_PlayerMods
□ VRC_UiShape
□ VRC_SyncVideoPlayer
□ VRCPipelineManager
□ VRC_SyncVideoStream
□ VRC_VideoScreen
□ VRC_VideoSpeaker
□ VRC_MidiNoteIn
□ VRC_OscButtonIn
• Legacy Components
□ VRC_ObjectSpawn
□ VRC_SyncAnimation
VRC_Trigger
• Summary
• Triggers
□ Custom
□ Relay
□ OnEnable
□ OnDisable
□ OnDestroy
□ OnSpawn
□ OnNetworkReady
□ OnPlayerJoined
□ OnPlayerLeft
□ OnPickupUseUp
□ OnPickupUseDown
□ OnTimer
□ OnEnterTrigger
□ OnExitTrigger
□ OnKeyDown
□ OnKeyUp
□ OnPickup
□ OnDrop
□ OnInteract
□ OnEnterCollider
□ OnExitCollider
□ OnAvatarHit
□ OnOwnershipTransfer
• Actions
□ AnimationFloat
□ AnimationBool
□ AnimationTrigger
□ AudioTrigger
□ PlayAnimation
□ SetParticlePlaying
□ TeleportPlayer
□ SetGameObjectActive
□ SpawnObject
□ SendRPC
□ ActivateCustomTrigger
□ DestroyObject
□ SetLayer
□ SetMaterial
□ AddHealth
□ AddDamage
□ SetComponentActive
• Broadcast Types
Latest Release
• VRChat 2022.4.1
□ VRChat 2022.4.1p1
□ VRChat 2022.4.1p2
Release Notes
• Recent Releases
□ VRChat 2022.3.1p2
□ VRChat 2022.3.1p1
□ VRChat 2022.3.1
□ VRChat 2022.2.2p5
□ VRChat 2022.2.2p4
□ VRChat 2022.2.2p3
□ VRChat 2022.2.2p2c
□ VRChat 2022.2.2p2b
□ VRChat 2022.2.2p2
□ VRChat 2022.2.2p1b
□ VRChat 2022.2.2p1
□ VRChat 2022.2.2
□ VRChat 2022.2.1p6
□ VRChat 2022.2.1p5
□ VRChat 2022.2.1p4
□ VRChat 2022.2.1p3
□ VRChat 2022.2.1p2
□ VRChat 2022.2.1p1
□ VRChat 2022.2.1
□ VRChat 2022.1.2p4
□ VRChat 2022.1.2p3
□ VRChat 2022.1.2p2
□ VRChat 2022.1.2p1
□ VRChat 2022.1.2
□ VRChat 2022.1.1p5
□ VRChat 2022.1.1p4
□ VRChat 2022.1.1p3
□ VRChat 2022.1.1p2
□ VRChat 2022.1.1p1
□ VRChat 2022.1.1
• Archived
□ VRChat 2021.4.2p4
□ VRChat 2021.4.2p3
□ VRChat 2021.4.2p2
□ VRChat 2021.4.2p1
□ VRChat 2021.4.2
□ VRChat 2021.4.1p1
□ VRChat 2021.4.1
□ VRChat 2021.3.4p3
□ VRChat 2021.3.4p2
□ VRChat 2021.3.4p1
□ VRChat 2021.3.4
□ VRChat 2021.3.3p2
□ VRChat 2021.3.3p1
□ VRChat 2021.3.3
□ VRChat 2021.3.2p1
□ VRChat 2021.3.2
□ VRChat 2021.3.1p1
□ VRChat 2021.3.1
□ VRChat 2021.2.4p3
□ VRChat 2021.2.4p2
□ VRChat 2021.2.4p1
□ VRChat 2021.2.4
□ VRChat 2021.2.3p1
□ VRChat 2021.2.3
□ VRChat 2021.2.2
□ VRChat 2021.2.2p1
□ VRChat 2021.2.1
□ VRChat 2021.1.5p2
□ VRChat 2021.1.5p1
□ VRChat 2021.1.5
□ VRChat 2021.1.4p1
□ VRChat 2021.1.4
□ VRChat 2021.1.3p2
□ VRChat 2021.1.3p1
□ VRChat 2021.1.3
□ VRChat 2021.1.2p1
□ VRChat 2021.1.2
□ VRChat 2021.1.1p1
□ VRChat 2021.1.1
□ Patch Notes - 2020
□ Patch Notes - 2019
□ Patch Notes - 2018
□ Patch Notes - Pre-2018
Powered by
Using VRChat in a Virtual Machine
Suggest Edits
🚧
Advanced Users Only!
This information is generally only useful for advanced users and
specifically only those running VRChat in a virtual machine. It will
contain language that may not be recognizable or useful for most users.
❗️
Running VRChat in VMs is Unsupported!
Using VRChat via a Virtual Machine is not directly supported, however we
have done some research to try to make things easier for those that choose
to try anyways.
The presence of this documentation does not mean we support running VRChat
in a VM. It is possible that these methods or any others may stop working
at any given time. We will try to keep this documentation up to date
regardless.
VRChat's anti-cheat solution, Easy Anti-Cheat (EAC) generally fails when
running in a Virtual Machine (VM) environment.
This can be very easily worked around though. Most notably, working around it
does not have a performance impact.
libvirt
Use virsh edit VM_NAME to open the VM's XML config in your favorite editor.
Then simply add the following line under features > hyperv:
In the end, your features block should look something like this:
Again, this does not affect performance. You can leave other settings, such as
the hypervisor, topoext and invtsc cpuid flags or the hyper-v clock (which all
do have performance benefits) enabled.
In fact, here's a little trick: Instead of just adding a vendor_id, you can set
the Hyper-V mode to passthrough:
This will enable all available hyper-v enlightenments* that are available for
your kernel/QEMU version - including a vendor id, meaning EAC will not
complain, but also including other features you might not have had enabled
before, meaning this may very well improve your performance!
* "enlightenments" is hyper-v's way of saying "paravirtualized extensions",
i.e. interfaces that the linux kernel or QEMU provide to windows guests to
enhance performance or functionality in virtual environments
After 26 AUG 2022, the above fixes may not be enough to get the game to run
still (you should still do them). If you are still facing issues, try manually
setting SMBIOS strings for your virtual machine. Theoretically, any valid
hardware configuration should work fine, but your best bet would be to pull
your own system's baseboard information via dmidecode.
You should be able to extrapolate info about your baseboard from these
commands:
dmidecode --type bios
dmidecode --type baseboard
dmidecode --type system
To do so, add this to your domain root but preferably use your system's
information:
American Megatrends Inc.
F31o
12/03/2020
Gigabyte Technology Co., Ltd.
X570 AORUS ULTRA
x.x
BASEBOARD SERIAL HERE (or "Default string")
BASEBOARD UUID HERE
BASEBOARD SKU HERE (or "Default string"
X570 MB
For your UUID entry, you can use the VM's generated UUID at the top of your
domain XML. The UUID in your domain XML and in your sysinfo will need to match,
otherwise libvirt will complain.
Also, add this under your group to make use of those new system
parameters:
QEMU
If you're starting your VM using a raw QEMU command line, you just have to add
the vendor id to the -cpu flag. For example:
-cpu host,migratable=off,hypervisor=on,invtsc=on,hv-time=on,hv-vendor-id=0123756792CD
There may be other stuff in your -cpu argument already, in which case you just
append ,hv-vendor-id=0123756792CD to the end, as shown above.
You can use hyper-v passthrough mode here too:
-cpu host,migratable=off,hypervisor=on,invtsc=on,hv-time=on,hv-passthrough=on
(note: you do not need any other hv-foo arguments other than (I think?) hv-time
in that case, passthrough will take care of the rest)
(further note: you'll have to figure out how to apply the os/smbios options
from the libvirt section yourself if you are indeed using QEMU, since I was
using libvirt when investigating a fix)
Proxmox/PVE
Make sure your operating system is set to "Windows 7" or higher in the
"Options" tab of your VM. No other action should be required.
(note: same deal as above, this may or may not be enough to get the game to
work since the 26 AUG 2022 update broke things)
Technical notes
You may notice that some of this is very similar to the infamous "NVIDIA code
43 fix" from the past. Really the only difference here is that hiding the kvm
interface (kvm=off or ) is not even required
(but also doesn't hurt). If you have previously set up your VM using such a
guide (e.g. https://passthroughpo.st/apply-error-43-workaround/), then VRC with
EAC should be working out of the box for you.
On a technical level, what the hyper-v vendor id does is setting leaf
0x40000000 of the guest's cpuid information to whatever is provided. The
default here is "Microsoft HV", which EAC simply blacklists. Using hyper-v
passthrough mode, this turns into "Linux KVM Hv", which still indicates a VM,
but EAC is unfazed by it.
Since this does not require changing the hypervisor flag, the OS kernel in the
guest (Windows NT) will still recognize the environment as a VM and apply
performance enhancing measures as such. This also means that the Task Manager
in the guest will report running in a virtual machine. This does not matter for
EAC in testing within a KVM environment.
Very technical notes
Here's a little win c++ program to demonstrate the effect of the changes:
#include
#include
void print_leaf(int leaf)
{
int res[4];
__cpuid(res, leaf);
std::cout << "leaf: 0x" << std::hex << leaf << std::endl;
for (size_t i = 0; i < 4; i++)
{
std::cout << "res" << i << ": 0x" << std::hex << res[i] << " (";
for (size_t j = 0; j < 4; j++)
{
char part = (res[i] >> j * 8) & 0xff;
std::cout << part;
}
std::cout << ")" << std::endl;
}
}
int main()
{
// cf:
// https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/feature-discovery
// https://docs.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=msvc-170
std::cout << "manufacturer id:" << std::endl;
print_leaf(0); // Manufacturer ID
std::cout << "hyper-v id:" << std::endl;
print_leaf(0x40000000); // Hypervisor CPUID Leaf Range
return 0;
}
Output on an examaple machine using hv-passthrough:
manufacturer id:
leaf: 0x0
res0: 0x10 (► )
res1: 0x68747541 (Auth)
res2: 0x444d4163 (cAMD)
res3: 0x69746e65 (enti)
hyper-v id:
leaf: 0x40000000
res0: 0x40000005 (♣ @)
res1: 0x756e694c (Linu)
res2: 0x564b2078 (x KV)
res3: 0x7648204d (M Hv)
Updated 2 months ago
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Did this page help you?
Yes
No
• Table of Contents
•
□ libvirt
□ QEMU
□ Proxmox/PVE
□ Technical notes
□ Very technical notes