多通道的同步问题

来源:互联网 发布:java的网络编程重要吗 编辑:程序博客网 时间:2024/05/16 07:49

原文地址: http://www.cnblogs.com/ArenAK/archive/2008/05/09/1189610.html


一.综述

多通道投影是一种典型的虚拟现实的实现,多通道可以是多个CRTLCD显示器,也可以是DLP投影仪,本文中统称为显示器。在多通道显示(Multi Display)中的一个重要问题是保持各个通道间显示画面的同步。

对于一个通道对应于<一台计算机、一个显示器>的多通道系统,同步问题包括三个方面或者说是涉及到三个层次:DataLockSwapLockGenLock

1DataLock

用于保证在每个渲染周期各渲染计算机使用相同的场景数据(包括每帧都需要更新的数据和类似于消息的间断性数据)进行更新,以避免各计算机之间场景内容的不一致。

2SwapLock

用于保证每个渲染周期中各渲染计算机在相同的瞬间切换帧缓存,以避免各计算机之间画面切换时刻的不一致。

3. Framelock&GenLock

Framelock指相互连接的各渲染计算机的显示器扫描频率彼此保持一致,而GenLockGeneratorLock)则是指显示器的扫描频率与一个外部频率源保持一致。FramelockGenLock可以在像素级别同步、扫描行级别同步、帧级别同步,我所看到的都是帧级别的同步。Framelock&GenLock在立体显示中尤为重要,因为各通道显示器的帧频与立体眼镜快门开关的开关频率必须保持同步[1]

二.DataLock

DataLock通常由软件实现,通过对网络数据的发送、接收、处理的控制来达到数据同步。

三.SwapLock

SwapLock也可由软件来折衷实现,通常通过网络来对Swaplock的锁定误差在1ms以内,对于交互式程序来说这个已经满足需要了。SwapLock也有硬件支持的,如Nvidia Quadro 3000G显卡,结合Opengl扩展即可做到。

对于DataLockSwapLock的软件实现我在下一篇文章会写。本篇以下内容大致叙述我所了解的Framelock&GenLock的实现方式。

四.Framelock&GenLock

硬件实现:

目前支持FrameLock&GenLock的都是专业显卡,如3Dlabs Wildcat4 7210NvidiaQuadro FX 3000GQuadro FX 4000Quadro FX 4500Quadro FX 5500。对于Nvidia的显卡在使用时将一个显卡接上外部同步源信号(实现GenLock),并通过Nvidia控制面板使其作为Master;其它显卡相互级联后接到Master显卡上(实现FrameLock),并通过控制面板使其作为Slave,这样即可实现了。同时有NvidiaOpengl扩展提供了相应的软件函数调用。详细使用方法可参考Nvidia FrameLock手册。

软件实现:

更确切的说是软硬结合的实现方法,其与上述方法的区别之处在于并不采用专业级的显卡,而只是在使用时自己制作或购买几个小小的插头连接到计算机并口和显卡,结合软件使用消费级显卡就可达到Framelock&GenLock

Linux下的软件:Softgenlockhttp://www.hlrs.de/organization/vis/people/aumueller/genlock/

Windows下的软件:WinSgl http://graphics.ethz.ch/~mwaschbu/winsgl/

两者原理相同,下面统称为Sgl

图1所示Sgl是将外部0-5V的脉冲信号(如TTL信号)通过计算机并口接入,由Sgl驱动程序读取此信号频率,由PowerStrip(由EnTech 提供)的函数和DirectDraw API得到计算机显卡的Vedio Timing信息,由Sgl Application程序对两者进行比较后得到调整显卡Video Timing的相应方法(见下一段),再由PowerStrip函数来执行此方法,从而控制显示器的频率与外部源保持一致。

1  Sgl运行结构

调整显卡Video Timing的方法是调整垂直前端扫描(Vertical Front Porch)的时间。因为显示器显示一帧画面时实际上并不只是扫描用户所能见到的区域,对可见区域四周环形不可见区域的扫描是必须的(这些扫描是有其作用的,这里不叙述),如2所示只有红色部分是可见区域。Sgl就是通过更改不可见区域中Vertical Porch扫描占用的时间来调整每帧画面扫描的时间,从而对显示器频率进行微调,使其与外部同步源保持一致。

2 Video Timing

因此你需要做的只是设好外部同步源的频率(如60.000Hz),用自己的插头将外部同步信号接入计算机并口,并通过VGA口来观察同步信号,然后运行软件就可以了。

以下是我所做的实验:

硬件设备包括:

1. Nvidia GeForce 6800GT card

2. ViewSonic VE710b LCD at 60Hz refresh rate

3. Square form Clock =enerator at about 60Hz,5V TTL

4. Windows 2000 OS

5. SG1646A信号发生器(如3

3 SG1646A信号发生器

运行画面如图4所示:


 

4 WinSgl运行画面

其中modeline一行的含义:

1024 pixelsHorizontal Active period

40 pixelsHorizontal Front porch

136 pixelsHorizontal Sync width

144 pixelsHorizontal Back porch

768 linesVertical Active period

12 linesVertical Front porch

6 linesVertical Sync width

16 linesVertical Back porch

这是一年前的实验结果了,性能并不稳定,有时会Lost Sync,不知现在如何了。。。

参考文章:



[1] http://http.download.nvidia.com/XFree86/Linux-x86/1.0-9629/README/appendix-x.html

2. http://www.nvidia.com/object/IO_10794.html

3. http://www.hlrs.de/organization/vis/people/aumueller/genlock/

4. http://www.nvidia.com/object/IO_10753.html

5. Software-Genlock for Windowsk, Michael Duller

6. Nvidia Framelock User’s Guide

7. WinSGL: Software Genlocking for Cost-Effective Display Synchronization under Microsoft Windows


0 0
原创粉丝点击