Попробуй пройтись отладчиком и проверить что инициализации действительно выполняются только однажды, а именно d3d_init, потому как пересоздание состояния может быть очень дорогим.
Так же неясно что делает menu::init, да и кроме него фпс может просаживаться в любом месте кадра, не только EndScene.
В любом случае в студии в меню Отладка > Профилировщик производительности, можешь выбрать Использование GPU и Использование ЦП (процессор, а не то что вы подумали) и снять профиль на минутку, он тебе выдаст что больше всего жрет.