明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

.NET Compact Framework的強大二維圖形引擎

[摘要]簡介  對于移動設備而言,.NET Compact Framework 即使不是最佳的 API,也是極好的 API。它的圖形引擎受到很大的限制,以便提高呈現速度和降低內存消耗。但是,它似乎遠遠無法滿足用戶日益增長的對更好的圖形體驗的要求。嘗試去獲得 .NET Compact Framework 中...
簡介
  對于移動設備而言,.NET Compact Framework 即使不是最佳的 API,也是極好的 API。它的圖形引擎受到很大的限制,以便提高呈現速度和降低內存消耗。但是,它似乎遠遠無法滿足用戶日益增長的對更好的圖形體驗的要求。嘗試去獲得 .NET Compact Framework 中的一些高級矢量圖形呈現功能可能是一項乏味的任務。開發(fā)人員具有兩個選擇:

  1.求助于本機代碼。例如,Pocket PC Game API 可能是一項不錯的選擇。它的性能令人印象深刻。有關詳細信息,請參閱位于以下位置的一篇非常全面的文章:http://msdn.microsoft.com/mobility/samples/default.aspx?pull=/library/en-us/dnnetcomp/html/gmangame.asp。問題在于本機代碼不支持矢量圖形呈現,并且與某些設備不兼容。此外,它可能無法與 Pocket PC 仿真程序協(xié)同工作。您可以想象調試這樣的程序有多么困難。

  2.請等待下一代移動圖形引擎問世。據我所知,Windows CE 5 中將包含一個強大的 Direct3D Mobile引擎。這對于移動游戲開發(fā)人員來說是一個好消息,但是 Direct3D 不適合于二維圖形。它太復雜了,因而無法在一般應用程序中應用。

  我們所需要的是像 GDI+ 這樣強大而易于使用的二維圖形引擎。因此,我從零開始開發(fā) XrossOne GDI+ 項目。它完全是用 C# 托管代碼編寫的,不包含任何本機代碼或不安全的代碼。經過幾個月的艱苦工作之后,我終于可以在本文開頭提供可下載的原始版本。

開始工作
  從該項目一開始,我就一直銘記 XrossOne GDI+ 引擎應當對不同的手持設備和平臺保持中立。結果,它可以與 Pocket PC、Windows CE、Smartphones、Windows .NET 和 Mono 兼容。您可以將同一個運行庫復制到不同的目標,而它仍然可以正常工作。

下表概括了總體體系結構。

      層             命名空間
  XrossOne GDI+ API       XrossOne.Drawing
  基于定點的二維圖形引擎    XrossOne.DrawingFP
 16.16 定點計算引擎       XrossOne.FixedPoint

  XrossOne GDI+ 中有三個層。最低層為“16.16 定點計算引擎”。其中一個主類 — MathFP — 是從 Beartronics J2ME 庫 改編而來的。一些函數已經進行了優(yōu)化,其中包括 sqrt、atan 和 PointFP.Distancecalculation。在命名空間 XrossOne.FixedPoint 下面,有其他三個類:SingleFP、DoubleFP 和 MatrixFP。SingleFP 是一個用于 16.16 定點數的 Helper 類。它為在定點類型和標準類型(int、float、string)之間進行轉換提供了方便。MatrixFP 是為定點二維變換編寫的。因為定點計算的精度較低,所以級聯變換可能會損失一些精確性。例如,在大多數情況下,兩次求逆運算無法還原原始矩陣。DoubleFP 的存在是為了使該庫完備,但尚未使用。

  “基于定點的二維圖形引擎”是 XrossOne GDI+ 的內核。它實現了很多復雜的矢量圖形算法,例如,反鋸齒繪圖、線帽/聯接裝飾、二維變換、漸變填充、Alpha 通道合成等等。這里可以找到本機 GDI+ 中的大多數高級功能。但是,您只應在少數情況下直接使用它,因為它的基于定點的接口對于程序員而言不夠友好,但是不必過分擔心這種情況。有一個封裝良好的 API 可供使用。您可以在 XrossOne.Drawing 命名空間中找到它們。XrossOne.Drawing 中的類非常類似于 System.Drawing 中的類,不同之處在于每個類的末尾有一個字母“X”。例如,XrossOne.Drawing.PenX 類等效于 System.Drawing.Pen。有一個用于將 GDI+ 程序轉換到 XrossOne GDI+ 的小竅門。在 using 節(jié)中,將 XrossOne GDI+ 類重命名為它們的等效類。例如:

using Pen = XrossOne.Drawing.PenX;
using LinearGradientBrush = XrossOne.Drawing. LinearGradientBrushX;
using Matrix = XrossOne.Drawing.MatrixX;


[1] [2] [3] [4] [5]  下一頁