2010-02-07 61 views
0

我正在寫一個應用程序,需要在Direct3D9中繪製大量文本 - 幾行,也許幾十行。文本可以大量格式化(即不同的字體,樣式,大小),並且可以包含來自不同字符集的unicode符號。最糟糕的是,它可以隨時改變,所以它需要動態的(一旦顯示永遠不會做)。如何渲染Direct3D9中的格式化文本?

有兩個問題:首先,我可能需要大量的D3DXCreateFont調用,這些調用的代價很大(我不確定自己)。另一種方法是在繪製多部分線之前創建所有字體,然後在它們之間切換 - 這樣更好嗎?那麼,我還可以在繪製線條時即時創建字體對象,將它們添加到某種字體對象緩存中,然後在嘗試創建新字體之前查看緩存中的字體對象?你認爲什麼是最好的方法?

第二個問題是D3DXFont似乎不理解下劃線/透視字體樣式。儘管D3DFONT基於LOGFONT,但它忽略了這些字段(儘管支持斜體)。假設我真的需要強調/突破,我該怎麼做?有沒有辦法強制ID3DXFont做下劃線?我應該自己畫這些線(我該怎麼做)?或者,也許我應該切換到在HDC上使用GDI進行繪製,然後將這些像素複製到紋理中 - 是否會提供合理的性能?

回答

0

那麼,我還可以在畫線時將字體對象添加到某種字體對象緩存中,然後在嘗試創建新字體之前查看緩存?你認爲什麼是最好的方法?

緩存方法。甚至不需要在需要時隨時重新創建字體,而不需要緩存。我不知道D3DXCreateFont的實際成本,但功能在設計上並不打算太頻繁地調用。

關於下劃線/刪除 - 您可以使用IDirect3DDevice9::DrawPrimitiveUPD3DPT_LINELIST以及直通着色器自行將線條渲染到頂部,以保持線頂點不變和未轉換。

或者我也許應該切換到在HDC上使用GDI進行繪圖,然後將這些像素複製到紋理中 - 是否會提供合理的性能?

我不會因爲它需要將紋理內容從系統RAM傳輸到VRAM。

+0

謝謝!我使用了緩存方法,工作得很好。 – himself 2010-02-09 23:22:21