Как я могу выполнять действия в ожидании вертикальной синхронизации? - PullRequest
0 голосов
/ 23 июня 2011

Я хочу иметь возможность загружать / скачивать кучу ресурсов и уведомлять пользователя о файле, который загружается в данный момент, но я не могу просто нарисовать фрейм после начала загрузки каждого файла, потому что v-sync будет ждать, пока он не будетможно нарисовать рамку до того, как она продолжится (узкая нагрузка менее 60 / сек).

Есть ли способ проверить, готово ли устройство к рисованию или нет (без хаки) имеет 1/60секунды прошло?), так что я могу выполнять действия, пока он не будет готов? Я не возражаю, если уведомление пропускает файлы, которые закончились до того, как оно будет готово к рисованию, но я хочу максимизировать скорость загрузки при сохранении возможностичтобы уведомить пользователя.

Кроме того, я бы хотел избежать временного отключения v-синхронизации даже потому, что не хочу, чтобы графическая карта снижала частоту 300FPS, если компьютер загружается очень быстро.

1 Ответ

1 голос
/ 23 июня 2011

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

Обратите внимание, что вам нужно получить цепочку обмена и вызвать Present () в цепочке обмена, а не вызывать Present () непосредственно на устройстве, чтобы иметь возможность передать этот флаг для представления, или вы можете установить его в структуре D3DPRESENT_PARAMETERS когда вы создаете устройство или создаете IDirect3DDevice9Ex вместо устройства IDirect3DDevice9 и вызываете PresentEx () вместо Present ().

Это не решает проблему файлов, которые загружаются дольше, чем кадр, однако - ваша частота кадров упадет, если у вас есть файл, который занимает много времени для обработки. На мой взгляд, лучшим решением этой проблемы было бы перенести как можно больше ваших операций ввода-вывода в другой поток (однако в D3D9 вам все равно придется создавать ресурсы D3D в главном потоке) и просто передать имя файла, который в данный момент обрабатывается в вашей основной / рендер-нить для отображения каждый раз, когда вы представляете кадр.

...