60 FPS without GPU passthrough#277
Conversation
Could you add example for the optimal setting for CPUs with 8 equal cores like AMD Ryzen 7 5700G or Intel LNL? |
|
@Maryse47 I use exactly those settings - 4 cores for better performance. Actually this is not guarantee for stable GUI performance but this is much better than default settings with random cores for rendering. |
|
Hm......... THIS IS VERY GREAT. I might add this to my fork, but currently gonna test it. |
|
Well, i don't know if anything changed, i didn't installed big sur ever on qemu. But i think, meh. Not really good and not really 60 FPS. |
|
@renatus777rr Well, actually we have limit for 30fps for rendering with qemu, this is a bit clickbait, but I have stable 30fps with this. I can then add Youtube video if needed. It works on every macos system in qemu, this is not macos optimizations, this is linux host optimizations. |
|
@renatus777rr Without these optimizations I had 8-10fps even on lower resolution. So I am not sure why you so critical for these settings. Enjoy |
|
@renatus777rr for actual 60fps you might edit qemu sources, if you wish. |
Well i think it's like have more fps i think so, it's now more like usable. |
1920x1080@60fps without GPU passthrough
Core Principle
The entire point of this guide is to find your highest-performing physical cores and pin the macOS guest exclusively to them. You must prevent the host scheduler from spreading QEMU threads — especially the software rendering pipeline — across slow or distant cores, which introduces massive latency spikes and frame-pacing issues.
Modern CPUs are not symmetric. They contain:
If QEMU is allowed to roam freely, a vCPU or the display thread will inevitably land on:
The result is choppy 5–15 FPS slideshows instead of a smooth desktop.
The solution is strict isolation: hand-pick the fastest physical cores, disable SMT, and lock QEMU to them with
taskset.Quick Start: The
macos()FunctionAdd this to your
~/.bashrcor~/.zshrc(adjust the core numbers to your CPU):Then simply run:
You must also edit
./OpenCore-Boot.shto match the core count:CPU Selection Methodology
Step 1: Map your physical layout
Run:
Identify:
Step 2: Pick the best cores
Rules:
Step 3: Use AI for precise core selection
Because every CPU has a unique core numbering map (SMT pairs are not always sequential), feed your
lscpu -eoutput to an AI assistant and ask:The AI will parse your exact CCX/CCD topology and give you the correct comma-separated list.
Disable SMT / Hyper-Threading
SMT (Simultaneous Multithreading, called Hyper-Threading on Intel) allows one physical core to present two logical CPUs.
Why it kills QEMU performance:
When SMT is enabled and you pin QEMU to logical CPUs
0,1,2,3, the physical cores are still shared with their SMT siblings (12,13,14,15on a 24-thread CPU). The host scheduler places gnome-shell, kernel workers, or QEMU helper threads on those siblings, causing contention for:This produces micro-stutters that feel like low FPS even when the guest is technically rendering frames.
Temporarily disable SMT (no reboot required):
Re-enable later:
Architecture Comparison: Why Some CPUs "Just Work" and Others Don't
What we achieved
On the Ryzen 9 3900X, before optimization:
After disabling SMT and pinning to 4 physical cores on CCD 0 (
taskset -c 0,1,2,3):The 3900X did not need more cores — it needed clean, uncontended cores.
Important Warnings
Do not over-allocate vCPUs
Using
CPU_THREADS=16orsmp 16in QEMU does not make macOS faster. Without pinning, it causes the host scheduler to spread software rendering and vCPU threads across:This creates latency spikes and frame-pacing jitter that feel far worse than running on 4 dedicated fast cores.
Use 4–6 physical cores maximum, strictly pinned.
GPU matters for the host too
Even with perfect CPU pinning, the host needs a working OpenGL stack to composite the QEMU window efficiently.
amdgpudriver = excellent compositing performance.llvmpipe(software OpenGL), the window will remain sluggish regardless of CPU pinning.Verify your host renderer:
If it says
llvmpipe, fix your GPU drivers first.Tested Platforms
tasksetmandatorytaskset+ SMT off mandatoryTL;DR Checklist
lscpu -eand identify your fastest cores (use AI if unsure).echo off | sudo tee /sys/devices/system/cpu/smt/control.OpenCore-Boot.sh:CPU_THREADS=4,CPU_CORES=4.taskset -c <your-cores> ./OpenCore-Boot.sh.llvmpipe.