2010-12-02 42 views
2

這將是一個相當模糊的問題,但我不知道怎麼去解決這個問題IM面臨...框架不可知結構問題

目前,我有我已經在不久前撰文指出,所有許多不同的項目有一個類似的框架來處理空間分區和排序,但是每個項目都有自己的這個框架版本。他們都是基於圖形的應用,但在實施中:

  • 的Silverlight
  • 的WinForms(GDI)
  • XNA
  • 的DirectX
  • 的OpenGL(TAO)

雖然有5這個框架的不同版本他們都做完全相同的事情,只是接受不同的對象。一個例子是GDI使用System.Drawing.Point來完成大部分與繪圖相關的任務,而XNA使用Vector2,但是它們都是代表X/Y的對象,與其他庫相同,有些將x/y值存儲爲int,浮動,雙重但最終在心臟代表相同的數據。

空間分區框架的主要工作是消除這些2/3維值,並生成樹或在這些數字周圍執行其他基於排序的任務。

我目前正試圖將許多分佈式框架統一到一個集中式的框架中,以便它可以有一個單獨的項目,並通過測試來證明一切正常。

所以我的第一個想法是創建一些不可知論的對象來處理像定製的Point2D,Point3D,四元數,矩形等這個X/Y問題。但是,然後我將不得不將它們轉換回它們的本地版本進行渲染,如果我爲每個渲染週期中的每個對象中的每個點執行此操作,那麼這聽起來像是一個巨大的性能損失(尤其是當此框架旨在儘可能保持高性能時)。

我在想接口可以解決這個問題,只是在實現部分內部包裝本地對象,但即時通訊仍然不確定這是否是最好的方法,因爲我從來沒有真正做過很多跨平臺所以從來不需要解決這些問題。

無論如何將停止waffling現在,任何建議將是偉大的!

回答

2

我的建議是實施自己的數學類型,並使用這些類型進行所有計算。我可能會使用XNA作爲基礎。不僅因爲它們非常好,還因爲你可以從Mono.XNA,SilverSprite或XNATouch獲得開源實現。 (當然還有框架本身,在XNA中)。這樣可以爲你節省很多工作。

我能看到的主要問題是您的不同平臺使用不同的類型。 GDI使用整數,XNA,DirectX和OpenGL使用單精度浮點數(通常),Silverlight使用雙精度浮點數。

如果不是這種情況,您可以將您的類型分配給佈局完整的原生類型,並依靠JIT將其優化。

關於OpenGL,DirectX和XNA(不包括像SpriteBatch之類的東西)的好處是你基本上告訴API你的數據佈局 - 你可以在內部使用任何你喜歡的東西。

對於GDI和Silverlight,無論如何,您可能會努力做超高性能圖形。所以我只是把轉換的命中浮動和返回。只需編寫簡單的轉換函數即可顯示數據。與渲染相比,轉換類型將是一個非常微小的CPU時間百分比。

(我實際上這樣做的Silverlight - 它真的不值得擔心)

+0

呀XNA幾乎是一個我想複製,並且您已經一針見血的與數學庫一起工作,因爲這基本上是什麼階段,就好像它已經到位了,其他所有東西都可以使用它們並抽象出底層的本地方法...... GDI以及某種程度上GDI實現都是基於工具包的應用程序,所以反正他們不需要跑得這麼快。 – Grofit 2010-12-02 13:40:02