Я пытаюсь реализовать многопоточное 3D-приложение, в котором один поток выполняет обновления сцены с постоянной скоростью (на частоте 120 Гц), а другой выполняет рендеринг (возможно, с очень коротким временем кадра, например, на частоте 400 Гц) с тройной буферизацией совместно используемых данных. Согласно Статья MSDN по времени QueryPerformanceCounter
плохо работает с использованием нескольких потоков:
Вычисление синхронизации для нескольких потоков — например, с каждым потоком, связанным с конкретным процессором — значительно снижает производительность многоядерных систем.
Однако требуется высокая точность синхронизации в потоке обновления, чтобы гарантировать, что обновления происходят с правильным интервалом, и в потоке рендеринга, чтобы получить точное время кадра для интерполяции, так каков общий способ решения этой проблемы?
ОБНОВИТЬ:
Сейчас я создал небольшую тестовую программу для проверки этого «значительного снижения» производительности. Это раз пробег QueryPerformanceCounter
100000000 раз. Он делает это для одного потока, а затем запускает его для двух потоков параллельно на разных ядрах. Согласно совету статьи, каждый поток имеет свою привязку к определенному ядру. Результаты теста на моей машине удивительны, если вы идете по слову статьи.
Результаты:
Примечание. Эти результаты включают время, затраченное на увеличение счетчика цикла (64-разрядное целое число) и переход к началу цикла, поэтому фактическое время выполнения короче.
1 Thread: Execution in 3255313449 ns Approximately 32.6 ns per call 2 Threads: Thread 1: Execution in 3278105881 ns Approximately 32.8 ns per call Thread 2: Execution in 3271422015 ns Approximately 32.7 ns per call
Это не показывает никакого существенного влияния на производительность от использования двух потоков для вызова QueryPerformanceCounter
, Это аномальное поведение, или статья некорректна для большинства современных машин?
Задача ещё не решена.
Других решений пока нет …