2013-07-09 22 views
1

我正在嘗試爲Windows 8編寫自定義光標圖形。我將使用它來使用一個或任何數量的Wiimotes發送觸摸輸入到Windows,這意味着我需要能夠顯示幾個cursors的應用程序。我無法使用cursor的內部版本進行觸摸,因爲從遠處觀看時很難看清楚。如何在沒有延遲的窗口中重新定位圖形?

目前我使用的每個在其上予繪製光標圖形與DirectX光標一個單獨的透明窗口,但對於cursor的實際重新定位我通過使用win32方法SendMessage將窗口移動到當前cursor位置和SetWindowPos。這將導致重新定位的接近零延遲,但它將使用不合理的處理時間量。有時在30%附近同時移動多個遊標。

我最初嘗試的是繪製到覆蓋整個屏幕的透明窗口。我試過了一個WPF窗口,在Canvas上重新定位形狀,並直接繪製到Desktop Window ManagerD3DDirectX實例,並通過更改變換matrixes重新定位。這些會導致一些非常煩人的毫秒延遲。

如何在屏幕上繪製一個cursor,它將以低延遲和低位移動CPU

+0

你不僅可以使用覆蓋整個屏幕的單個透明窗口嗎? –

+0

是的,這就是我在「其他方法」上所做的,但我不知道如何無延遲地重新定位圖形(最好是消除鋸齒和半透明)。 – Simphax

回答

3

如果您使用的是D3D/DirectDraw。

雙緩衝已知導致輸入滯後,三重導致甚至更多。如果考慮到VSYNC,那麼該過程會阻塞甚至高達20毫秒。

這意味着輸入事件之間會有20ms的間隔。

雙/三角形緩衝通常不是問題的原因VSYNC塊的顯示屏幕所需的時間2000%。

因爲通常需要1-2毫秒來渲染屏幕,而17-24毫秒等待VSYNC。

例如[C++]:
- 看看here

+0

我正在使用D3D。 從我看來,也許雙緩衝是我的問題,而不是我的解決方案? 來自第一個鏈接的引用「更多的緩衝區可以消除你的幀速率,但它們也可能導致輸入滯後(用戶點擊某個鍵時和他看到結果之間的延遲)」。這正是我想要避免的(輸入滯後)。 – Simphax

+0

@Simphax我誤解了你的問題。我認真地想過你在光標移動時談到了撕裂幀。無論如何,雙緩衝確實會導致輸入滯後,三重導致更多。 –

+0

@Simphax再次檢查答案:)。 –