亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 19:18:22
字體:
來源:轉載
供稿:網友

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

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

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

  我們所需要的是像 GDI+ 這樣強大而易于使用的二維圖形引擎。因此,我從零開始開發 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 庫 改編而來的。一些函數已經進行了優化,其中包括 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 節中,將 XrossOne GDI+ 類重命名為它們的等效類。例如:

using Pen = XrossOne.Drawing.PenX;
using LinearGradientBrush = XrossOne.Drawing. LinearGradientBrushX;
using Matrix = XrossOne.Drawing.MatrixX;
主要功能
反鋸齒矢量圖形繪圖

  通過 XrossOne Mobile GDI+ 可以呈現所有種類的二維幾何圖形,例如,線段、矩形、多邊形、橢圓、扇形、貝塞爾樣條曲線、基數樣條曲線等等。但是,扇形、貝塞爾樣條曲線和基數樣條曲線在 .NET Compact Framework 中不可用。此外,所有圖形在呈現時都自動進行反鋸齒處理。這有助于獲得超級平滑質量。在 .NET Compact Framework 中,畫筆的寬度被固定為 1 個像素。這一限制在 XrossOne GDI+ 中不存在。畫筆的不同大小可以應用于所有圖形的輪廓,如圖 1 所示。


圖 1. 反鋸齒矢量圖形繪圖



  代碼示例 1

//Clear the background and reset the transform state
gx.Clear(Color.White);
gx.ResetTransform();
//Draw skew grid as the background
PenX pen = new PenX(Utils.FromArgb(0x40, Color.LightGray), 5);
for (int i = -Height; i < Width + Height; i+=20)
{
gx.DrawLine(pen, i, 0, i + Height, Height);
gx.DrawLine(pen, i, 0, i - Height, Height);
}

//Draw a DarkMagenta rectangle with a 10.5-pixel pen
Color c = Utils.FromArgb(0x80, Color.DarkMagenta);
pen = new PenX(c, 10.5f);
gx.DrawRectangle(pen, 50, 20, 150, 200);

//Fill a GreenYellow rectangle
c = Utils.FromArgb(0xA0, Color.GreenYellow);
BrushX brush = new SolidBrushX(c);
gx.FillRectangle(brush, 120, 50, 90, 150);

//Draw a BlueViolet ellipse with a 10.5-pixel pen
c = Utils.FromArgb(0x80, Color.BlueViolet);
pen = new PenX(c, 10.5f);
gx.DrawEllipse(pen, 50, 20, 150, 80);

//Fill a Red ellipse
c = Utils.FromArgb(0xA0, Color.Red);
brush = new SolidBrushX(c);
gx.FillEllipse(brush, 20, 50, 80, 150);

//Draw a HotPink pie from 156.5 degree to -280.9 degree
pen.Color = Utils.FromArgb(0xA0, Color.HotPink);
gx.DrawPie(pen, 3.6f, 120.3f, 200.8f, 130.1f, 156.5f, -280.9f);

//Draw Orange Bezier curves
c = Utils.FromArgb(0xA0, Color.Orange);
pen = new PenX(c, 16);
Point start = new Point(70, 100);
Point control1 = new Point(100, 10);
Point control2 = new Point(150, 50);
Point end1 = new Point(200, 200);
Point control3 = new Point(100, 150);
Point control4 = new Point(50, 200);
Point end2 = new Point(10, 150);
Point[] bezierPoints ={start, control1, control2, end1, control3, control4, end2};
pen.EndCap = LineCapX.Round;
gx.DrawBeziers(pen, bezierPoints);

//Refresh
Invalidate();



  XrossOne GDI+ 和本機 GDI+ 的矢量圖形輸出是相同的,但基數樣條曲線除外。我的算法取自 Jean-Yves Queinec 撰寫的文章 Smoothing Algorithm Using Bezier Curves。因此,您可能發現在它們的輸出之間存在一些差異,如下面的圖 2 所示。


圖 2. DrawCurve/DrawClosedCurve 的輸出



  盡管大多數矢量圖形呈現函數都已經得到實現,但仍然有一些工作需要完成。某些函數(DrawString、DrawImage、DrawPath 等等)直到下一個版本才可用。

漸變填充

  在本機 GDI+ 中有五種畫刷 — SolidBrush、LinearGradientBrush、PathGradientBrush、TextureBrush 和 HatchBrush。但是,在該版本中,只有 SolidBrush 和 LinearGradientBrush 可用。XrossOne GDI+ 支持 RadialGradientBrush 而不是 PathGradientBrush。下面的圖 5 演示了漸變填充。


圖 5. 漸變填充



  代碼示例 4

//Clear the background and reset the transform state
gx.Clear(Color.White);
gx.ResetTransform();

//Fill a rectangle with a black-white LinearGradientBrushX
Rectangle r = new Rectangle(20, 50, 300, 100);
Color c1 = Color.Black;
Color c2 = Color.White;
BrushX brush1 = new LinearGradientBrushX(r, c1, c2, 30F);
gx.FillRectangle(brush1, r);

//Fill a rectangle with a 7-color LinearGradientBrushX
r = new Rectangle(90, 100, 150, 100);
LinearGradientBrushX br = new LinearGradientBrushX(r,Color.Black,Color.Black, 60F);
ColorBlendX cb = new ColorBlendX();
cb.Positions=new float[7];
int i=0;
for(float f=0;f<=1;f+=1.0f/6)
cb.Positions[i++]=f;
cb.Colors=new Color[]
{Color.Red,Color.Orange,Color.Yellow,Color.Green,Color.Blue,Color.Indigo,Color.Violet};
br.InterpolationColors=cb;
gx.TranslateTransform(160, 10);
gx.RotateTransform(60F);
gx.FillRectangle(br, r);

//Fill a rectangle with a 7-color RadialGradientBrushX
r.Y += 50;
RadialGradientBrushX brush2 = new RadialGradientBrushX(r, Color.Black,Color.Black, 220F);
brush2.InterpolationColors = cb;
gx.RotateTransform(-45F);
gx.TranslateTransform(-200, -170);
gx.FillRectangle(brush2, r);

//Refresh
Invalidate();



Alpha 通道合成

  System.Drawing 命名空間中的 Color 結構在 .NET Framework 和 .NET Compact Framework 中都可用。區別在于 .NET Compact Framework 中禁用了 alpha 成分并且色調-飽和度-亮度 (HSB) 值不可用。幸運的是,alpha 通道合成可以完美地與 XrossOne GDI+ 協同工作(您可能已經從前面的圖形示例中推斷出這一點)。

性能
  手持 PC 的 CPU 的功能確實通常要比標準 PC 的 CPU 差很多。繁重的計算可能使手持設備的響應速度降低,從而可能使用戶變得不勝其煩。換句話說,性能對于手持設備軟件而言至關重要。因此,在重大場合下使用 XrossOne Mobile GDI+ 之前,您可能希望分析它的總體性能。因為 GDI+ 中大多數對應于 .NET Compact Framework 的等效函數都不可用,所以基準測試是針對 .NET Framework 在 XrossOne Mobile GDI+ 和 GDI+ 之間進行的。測試是在下列類別中執行的:矢量圖形呈現、二維變換和漸變填充。測試方案在相同的條件下執行。您可以在下載軟件包中找到基準測試程序,并且可以在 http://www.xrossone.com/PRojects.php?menu=4 快速查看它們的圖形輸出。

  XrossOne Mobile GDI+ 完全是用 C# 托管代碼編寫的,它的總體性能可以接受(參見下表),盡管二維變換和漸變填充需要在以后的版本中進一步優化。

方案XrossOne Mobile GDI+GDI+ for .NET Framework系統開銷

DrawLine

2.604 ms

0.901 ms

189.0%

DrawRect

3.705 ms

1.602 ms

131.3%

DrawPolygon

3.205 ms

1.502 ms

113.4%

DrawEllipse

6.409 ms

2.403 ms

166.7%

DrawBezier

3.505 ms

1.602 ms

118.8%

DrawCurve

4.006 ms

1.402 ms

185.7%

DrawPie

6.810 ms

2.003 ms

240.0%

TranslateTransform

10.615 ms

3.405 ms

211.7%

ScaleTransform

4.106 ms

0.801 ms

412.6%

RotateTransform

7.811 ms

1.803 ms

333.2%

LinearGradient (1)

9.013 ms

2.103 ms

328.6%

LinearGradient (2)

8.012 ms

1.803 ms

344.4%


缺少的功能
  在上述部分中,我們已經演示了 XrossOne Mobile GDI+ 的一些令人興奮的功能。但是,該版本中仍然缺少一些功能:

  • 文本輸出

  • 光柵輸出

  • 虛線樣式支持

  • HatchBrush、PathGradiantBrush、TextureBrush

  • Pen.CustomStartCap、Pen.CustomEndCap

小結
  我們相信 XrossOne Mobile GDI+ 可以幫助 .NET Compact Framework 開發人員創建更加引人注目的圖形接口??紤]到它的小內存足跡 (72kb),它的功能已經相當豐富了。而且,它的性能對于一般應用程序而言已經足夠了。此外,多虧它的純粹托管代碼設計,XrossOne GDI+ 是一個跨平臺、跨設備的二維圖形引擎。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产页| 中文字幕在线精品| 日韩免费不卡av| 亚洲视频网站在线观看| 综合久久五月天| 亚洲最大福利网站| 亚洲第一区在线| 亚洲午夜久久久久久久| 国产视频精品va久久久久久| 日韩精品视频在线| 日日摸夜夜添一区| 日本精品va在线观看| 97精品视频在线观看| 不卡在线观看电视剧完整版| 成人免费午夜电影| 国产成人福利视频| 国产精品美女久久久久久免费| 欧美日韩一二三四五区| 激情成人在线视频| 亚洲成人黄色在线观看| 国产成人精品国内自产拍免费看| 亚洲精品久久久久久久久| 久久久亚洲网站| 久久久www成人免费精品| 精品夜色国产国偷在线| 久久久91精品国产一区不卡| 国产香蕉精品视频一区二区三区| 欧美一级大片在线观看| 欧美高跟鞋交xxxxxhd| 日韩小视频在线观看| 亚洲国产成人久久综合一区| 欧美国产日韩一区二区三区| 亚洲成人网av| 国产精品扒开腿做爽爽爽视频| 成人深夜直播免费观看| 久久久精品视频成人| 欧美日韩不卡合集视频| 国产精品mp4| 日韩av在线免费看| 欧美视频在线免费看| 国产精品久久久久久久app| www.国产一区| 久久亚洲国产成人| 国产一区二区精品丝袜| 疯狂蹂躏欧美一区二区精品| 91影视免费在线观看| 成人性教育视频在线观看| 欧美亚洲国产日韩2020| 亚洲女人天堂网| 成人免费视频97| 欧美黑人一区二区三区| 成人久久久久久久| 亚洲欧美日韩中文在线| 日韩色av导航| 91日韩在线播放| 欧美夫妻性生活xx| 久久亚洲精品成人| 中文字幕日韩欧美在线视频| 国产日韩视频在线观看| 欧美视频在线观看 亚洲欧| 欧美高清一级大片| 91精品国产91久久久久久| 亚洲一区国产精品| 国产一区二区三区直播精品电影| 成人在线视频福利| 久久亚洲一区二区三区四区五区高| 丝袜亚洲欧美日韩综合| 欧美成人一二三| 日韩欧美aⅴ综合网站发布| 亚洲自拍偷拍色片视频| 91av在线国产| 国色天香2019中文字幕在线观看| 久久99精品久久久久久琪琪| 中文字幕亚洲综合| 国产不卡av在线免费观看| 亚洲丝袜一区在线| 精品久久久久久久久久久久久| 日韩一二三在线视频播| 久久亚洲精品小早川怜子66| 91九色国产社区在线观看| 91av在线播放视频| 91地址最新发布| 亚洲精品久久7777777| 久久久免费在线观看| 日韩av免费在线播放| 91美女片黄在线观看游戏| 精品国产自在精品国产浪潮| 9.1国产丝袜在线观看| 国产精品视频yy9099| 国产精欧美一区二区三区| 亚洲一区二区久久久久久久| 91在线免费观看网站| 久久99青青精品免费观看| 久久91亚洲精品中文字幕奶水| 亚洲午夜av久久乱码| 色综合久久悠悠| 精品亚洲男同gayvideo网站| 91在线播放国产| 在线视频国产日韩| 日韩av高清不卡| 亚洲欧美激情视频| 高清欧美一区二区三区| 日韩欧美有码在线| 亚洲天堂第一页| 97精品久久久中文字幕免费| 国产精品欧美久久久| 色哟哟网站入口亚洲精品| 成人精品网站在线观看| 亚洲一区二区三区香蕉| 久久91精品国产| 国产91在线高潮白浆在线观看| 一区二区三区 在线观看视| 日本aⅴ大伊香蕉精品视频| 宅男66日本亚洲欧美视频| 亚洲一区二区免费| 日韩av一卡二卡| 亚洲欧美制服综合另类| 日韩在线观看免费高清完整版| 亚洲亚裔videos黑人hd| 91成人在线播放| 国产91精品青草社区| 久久亚洲国产精品成人av秋霞| 一夜七次郎国产精品亚洲| 国内精品久久久久久久| 亚洲视频综合网| 久久欧美在线电影| 亚洲欧美另类中文字幕| 欧美激情高清视频| 亚洲久久久久久久久久久| 亚洲欧美国内爽妇网| 亚洲欧洲在线免费| 日韩福利伦理影院免费| 91久久久久久久久久| 精品动漫一区二区| 日韩av电影在线免费播放| 欧美激情精品久久久久久大尺度| 久久久伊人日本| 2019亚洲日韩新视频| 国产精品中文字幕在线| 美女福利视频一区| 久久久免费在线观看| www.欧美视频| 精品一区二区三区三区| 午夜精品福利电影| 亚洲视频日韩精品| 高清亚洲成在人网站天堂| 欧美激情视频播放| 欧美性猛交xxxx免费看| 91免费的视频在线播放| 欧美电影免费观看大全| 中文字幕欧美精品日韩中文字幕| 亚洲欧美日韩中文在线制服| 欧美在线性爱视频| 成人h视频在线观看播放| 成人黄在线观看| 久久免费福利视频| 亚洲免费影视第一页| 亚洲视频一区二区三区| 亚洲欧美日韩一区二区三区在线| 精品久久久久久中文字幕一区奶水| 精品亚洲国产成av人片传媒| 日韩精品极品视频免费观看| 91日本在线观看| 欧美壮男野外gaytube|