DirectX:如何完美地同步两个输出

时间:2015-09-25 10:37:01

标签: directx sync multiple-monitors

我想完美同步两个屏幕输出。我正在使用DirectX11,在一个视频卡适配器上输出两个屏幕。目前我的基本算法是:

mainloop:
{
    for (int i=0;i<2;i++)
        render the scene for output i

    for (int i=0;i<2;i++)
        swapchain(i)->Present()
}

一切正常。但有些用户报告他们感觉&#34;两个屏幕上的两个图像都不完全同步。 (我使用完全相同的屏幕,一切都在同一个视频适配器上运行)。

通过做两个swapchain->present,我不确定两者是否同步。我的问题:

有没有办法确保两个输出同步?例如,是否可以只有一个交换链用于两个输出?

提前致谢

阿诺

1 个答案:

答案 0 :(得分:0)

您可以尝试的选项很少

选项1: 立即进行演示,无需等待显示器同步。

d3dpp.Windowed = FALSE; 
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; 

(这不是最好的选择,但对于某些应用而言并不重要)

选项2: 如果适配器数量为2,那么您可以创建 2全屏(非窗口模式)专用设备进行渲染和介绍。在这里,您可以在每个帧演示中同步监视器。

g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd_0,
                         D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice_0 );

设备1:

 g_pD3D->CreateDevice( 1, D3DDEVTYPE_HAL, g_hWnd_0,
                          D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice_1 );

设备2:

function ViewCtrl($scope) {
  $scope.modelValue = {pointer: false};
  $scope.modelReadonly = {pointer: true};
  var modelValueStatic = undefined;
  $scope.$watch('modelValue.pointer',function (newVal, oldVal) {
    console.log('newval: '+newVal+' oldVal:'+oldVal+' static:'+modelValueStatic);
    if (newVal != oldVal && $scope.modelReadonly.pointer && modelValueStatic != undefined) {
      $scope.modelValue.pointer = modelValueStatic;
    }
    if (!$scope.modelReadonly.pointer || newVal == oldVal) {
      modelValueStatic = $scope.modelValue.pointer;
    };
  });
}

选项3: 您可以尝试三重缓冲,而不是双重缓冲。