您必须在单独的线程中渲染您的图形,以便:
- 使用垂直同步来精确计时,以有效显示您的图像。
- 获取用户输入的精确时间(因为用户界面与渲染循环不在同一个线程上。
初始化 Direct3D 以在渲染期间启用 VSync:
// DirectX example
presentParams.SwapEffect = SwapEffect.Discard;
presentParams.BackBufferCount = 1;
presentParams.PresentationInterval = PresentInterval.One;
device = new Device(...
在单独的线程中执行渲染:
Thread renderThread = new Thread(RenderLoop);
renderThread.Start();
shouldDisplayImageEvent = new AutoResetEvent();
然后使用以下渲染循环:
void RenderLoop()
{
while(applicationActive)
{
device.BeginScene();
// Other rendering task
if (shouldDisplayImageEvent.WaitOne(0))
{
// Render image
// ...
userResponseStopwatch = new Stopwatch();
userResponseStopwatch.Start();
}
device.EndScene();
device.Present();
}
}
然后处理用户输入:
void OnUserInput(object sender, EventArgs e)
{
if (userResponseStopwatch != null)
{
userResponseStopwatch.Stop();
float userResponseDuration = userResponseStopwatch.ElapsedMillisecond - 1000 / device.DisplayMode.RefreshRate - displayDeviceDelayConstant;
userResponseStopwatch = null;
}
}
您现在使用shouldDisplayImageEvent.Set()事件触发器根据需要显示图像并启动秒表。