Why is VNC so slow?
Ok, this is just a rant more than anything. I've been using VNC for years, and I just don't understand why over anything less than a 100baseT link it's so unusable. And even over 100baseT it's marginal. I connect via any client to a remote X11 VNC server, and bring up a terminal and start typing, and it LAGS by minutes! Why is it so hard to send the 10x10 pixel block of the last character I typed? What the heck is it sending back and forth during that entire time before it does send that little pixel block? Yes, it's great that VNC is free, which is why I use it. And it's great that it lets me telecommute. But it's frustrating because something that would take me a couple minutes at the office now takes me HOURS to do from home.
Update: I needed to see some error messages on a computer to diagnose it. Over the phone I told the person on the other end to log in and out and type stuff and it performed quite well! But as soon as I start typing or clicking everything went dirt slow for me. Why does sending events make VNC lag and refuse to send the screen updates, but yet local events don't do that and VNC sends the screen updates quite quickly?
Update Jun 7, 2012: I've noticed this article has become one of the more popular ones on my blog. Since I wrote my rant, I've done some more research into why VNC is so slow. It turns out it was designed that way.
VNC started off as a research project at the Olivetti & Oracle Research Lab. It seems like for the most part it was designed as a quick and dirty hack to do some screen sharing and remote control. The protocol was badly designed from the start: the way it is intended to work is for the client to keep polling the server and receiving the entire screen. It wasn't designed for the server to send updates, small regions or anything.
The design of polling of the entire screen has pretty much stuck with VNC and while there have been hacks to try to send smaller regions or poll for updates more often, the entire design is flawed. The server side should be controlling the screen updating, not the client side. It's the server that knows when the screen changed and what areas. Why VNC was designed this way when other screen sending methodology of the time was server driven is still unclear.
The only real way to make VNC go faster is to simply not use it and use a better designed protocol such as Microsoft's Remote Desktop Protocol. If you're stuck with VNC you're pretty much stuck with slow.
+1 Posted by mike • Feb.02.2006 at 02.53 • Reply
Try adjusting the settings. If you are polling the whole screen it will take longer. keep the "Poll Foreground Window" checked and the "Poll Full Screen" unchecked. This will speed up the server, because the server need not to pump as much data, compared to polling the full screen. Also you may consider reducing screen resolution and #of colors. Make sure your virus scanner is not scanning all incomming packets, that could be a bottle neck. If you are on a router you will have to port forward the range for the vnc server.
+1 Posted by John A. Peters • Feb.27.2015 at 19.01 • Reply
Mike, you are right.We bought a new machine, which is the server, and when we put VNC on there, we didn't realize you had to change the settings you are talking about checking and unchecking avove which are iinternal to VNC. I'm so happy to have high-speed local area network LAN service between my computer and the other one which has QuickBooks on it so we don't have to buy a second copy of QuickBooks. Thanks!
+1 Posted by Chris Osborn • Feb.02.2006 at 03.14 • Reply
I've already got it setup to only poll the foreground window. I dropped the resolution to 800x600 and 256 colors. No virus checker, and no ports need to be opened since the server listens on just one port. There's definitely something wrong with the VNC algorithms. There's no reason to send the entire window when a single character is being drawn. And even if it <i>was</i> sending the entire window it'd go a lot faster since I often can do Force Updates to get it to feel responsive.
+1 Posted by iain • Aug.25.2009 at 18.55 • Reply
agreed. i love VNC but even with mirror drivers installed, all the settings turned virtually off/low it's chronically slow.
Citrix, Microsoft (RDP), PcAnywhere, etc etc all manage to do this and make this work, why can't VNC why is it do damned slow
+1 Posted by Doug Kramer • Dec.05.2009 at 04.10 • Reply
One thing not mentioned... I just noticed that on the server side, Service mode is noticeably faster than User mode (using RealVNC).
+1 Posted by Katyan • Oct.19.2011 at 23.26 • Reply
Turn off Hardware Acceleration
In order to get maximum refresh rate, responsiveness and performances, it is necessary that you completely disable "Hardware Acceleration" on the machines that run WinVNC (server). It can be done in "Display Properties" Panel -> "Settings" Tab -> "Advanced..." Button -> "Troubleshooting" Tab -> "Hardware Acceleration" Tab set to "None".
+1 Posted by Steve • Aug.02.2012 at 00.07 • Reply
i tried turning off hardware acceleration as mentioned below! THANKS
+1 Posted by Ion • May.10.2013 at 08.37 • Reply
Was having the same issue and your article got me thinking differently. There have been some developments since your wrote it and one of those is xrdp. And while it down it is not implemented natively it can connect locally to the VNC session and present rdp to the client. This gets rdp performance for VNC.
+1 Posted by FozzTexx • May.10.2013 at 09.02 • Reply
xrdp is an implementation of the Microsoft Remote Desktop protocol, which is as you said, quite fast. That's because it's a much better design (and one of the few things Microsoft got right). xrdp doesn't use VNC at all, it fires up its own X servers and communicates with them, bypassing VNC.
+1 Posted by John A. Peters • Feb.27.2015 at 19.03 • Reply
I don't believe VNC is s crippledt design. It actually works well once you get it properly set up.