Ну во первых для этого существуют high-resolution timers. И никогда для этого не используйте GetTickCount и подобные. В винде для этого надо использовать multimedia timers. В принципе можно использовать boost::asio для этого. Здесь требуется событийная система.
Дальше, что сильно пугает, так это опрос клавиатуры, вы не сможете таким образом нажать 2 клавиши одновременно. Так никогда не стоит делать. В винде для этого есть RawInput. Как в никсах уже не подскажу.
А вообще возьмите готовый движок, не парьте мозг.
P.S. А вообще почитайте как организуются игровые циклы. В основном цикле заводится некий таймер, но он не предназначен для контроля fps (тут как я сказал выше нужен high-resolition timer и очень желательно событийный), он предназначен для расчета состояния игрового мира, чтобы скорость игры не зависила от кол-ва fps. На деле FPS обычно контролируется средствами системы (а в частности видеокарты) и называется это "ожидания луча" (в древности), ныне называется просто синхронизация кадра/видео и что-нить еще. При этом она может быть кратной вертикальной частоте монитора, если монитор имеет частоту 60, то вы можете получить частоту кадров 30. В этом вам спокойно помогут готовые игровые движки.