Dunno exactly what constitutes a "project" in your context, but have a look at desktop bookmarks, with Bookmark+.
An Emacs desktop records (and subsequently restores) the kinds of thing you mention: frames, windows, buffers (open files etc.), variable values,... With only vanilla Emacs, people tend to use only a single desktop, and they use it only to save the final state of an Emacs session and restore then that state when the next session starts.
But with Bookmark+, you can easily switch among any number of desktops, just by "jumping" to desktop bookmarks.
bmkp-set-desktop-bookmark (bound by default to
K on the bookmark keymap, which is by default on prefix key
C-x p (so
C-x p K), saves the current Emacs state in a desktop bookmark (or updates an existing such bookmark).
bmk-desktop-jump, bound by default to
K on the bookmark jump keymap, which is by default on prefix key
C-x j (so
C-x j K), prompts you for a desktop bookmark name (with completion), and jumps to the one you choose, which means that it switches Emacs to that desktop.
bmkp-cycle-desktop (not bound by default) cycles through your desktop bookmarks.