Вы не указываете, какую версию Direct3D вы используете. С D3D9 вы можете передать D3DPRESENT_DONOTWAIT вашему вызову Present (), и он вернет D3DERR_WASSTILLDRAWING, если оборудование занято обработкой или ожидает интервал вертикальной синхронизации. Это означает, что если у вас включен vsync, в вашем основном цикле вы можете просто вызывать Present с флагом DONOTWAIT всякий раз, когда вы загружаете файл, и загружать другой, если он возвращает WASSTILLDRAWING.
Обратите внимание, что вам нужно получить цепочку обмена и вызвать Present () в цепочке обмена, а не вызывать Present () непосредственно на устройстве, чтобы иметь возможность передать этот флаг для представления, или вы можете установить его в структуре D3DPRESENT_PARAMETERS когда вы создаете устройство или создаете IDirect3DDevice9Ex вместо устройства IDirect3DDevice9 и вызываете PresentEx () вместо Present ().
Это не решает проблему файлов, которые загружаются дольше, чем кадр, однако - ваша частота кадров упадет, если у вас есть файл, который занимает много времени для обработки. На мой взгляд, лучшим решением этой проблемы было бы перенести как можно больше ваших операций ввода-вывода в другой поток (однако в D3D9 вам все равно придется создавать ресурсы D3D в главном потоке) и просто передать имя файла, который в данный момент обрабатывается в вашей основной / рендер-нить для отображения каждый раз, когда вы представляете кадр.