我最近创办了Cuda并研究了样本。我觉得有点奇怪。
在'fluidD3D9'样品中,DirectX目前的功能需要15~20 milisec。 我检查时间如下面的源代码。
LARGE_INTEGER start, end, f;
QueryPerformanceFrequency(&f);
QueryPerformanceCounter(&start);
hr = g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
QueryPerformanceCounter(&end);
float finterval = (float)(end.QuadPart - start.QuadPart) /
(float)(f.QuadPart / 1000);
printf("\nPresent : %f\n", finterval);
但是SwapBuffer在'fluidGL'样本上没有花时间。 似乎阻塞发生在'fluidD3D9'样本中。 由于这个时间,FPS也不同于DirectX和OpenGL Sample。
我该如何解决这个问题?
答案 0 :(得分:3)
您应该阅读此MSDN文章,了解您的计时方法无效的原因:Accurately Profiling Direct3D API Calls (Direct3D 9)。简而言之,您无法轻易预测GPU工作何时开始实施,因为Direct3D严重批量试图避免内核转换开销,而GPU通常与CPU不同步。
正如其他人所说,Direct3D 9很古老,并不真正支持GPGPU。要进行更多的Apple-to-apples比较,请尝试使用DirectX 11 DirectCompute示例FluidCS11。
答案 1 :(得分:0)
这不是一个问题。它更多的是驱动程序设计和优化差异。所有D3D呼叫都不会做太多事情,当你打电话给现在时,你最终会冲洗之前排队的大部分帧。当然你可能已经做了一些比现在更大的东西,但它是一个黑盒子,即使有nvidia的支持,通常很难获得它。
另一方面,d3d9相当陈旧,驱动程序可能不如现代操作系统那么好,任何d3d开发现在应该使用d3d11(使用d3d12时为1%)。