2010-04-25

Blogger 生出的 Code 變好爛

不知道為什麼,上一篇 html 碼裡頭,充滿了無意義的 <div>...</div>,貌似被當成 <p>...</p>使用了。居然會在 blogger 發生這種等級的問題,實在有點出乎意料....


補充一下,連編輯視窗裡的 ">" 還有 "<" 都不會自動被帶換成 &gt; 和 &lt;,是不是越做越回去了啊 ˇˇ (反過來說,html 編輯模式裡的符號,在編輯視窗裡也沒被代換過去)

隨筆:在 Visual Studio 中,使用 Serializable 儲存物件

既然現在 IDE / Framework 都把加速開發當作主要目標,Coder 再混也應該要學一學這些把戲 >///<


以往用 C/CPP 都可以把不含指標的 struct / class 直接 binary read/write,但在 Java / Visual Studio 裡,這樣的流程被稍微擴充,改以 Serialize / Deserialize 作為媒介 。簡單的說,Serialize 就是把一個物件(物件裡可以有指向其他物件的參考),弄成一個 Byte 陣列,可以拿去做其他壞事(傳到別的電腦上,或者存到硬碟裡);Deserialize 就是把這個 Byte 陣列弄回原本的物件,其中所有的變數都完全相同。 我是沒什麼興趣去查 Serialize / Deserialize 的使用限制在哪邊啦,不過碰到有交互參照繞圈圈,或者是變數含有資源(DB / File resources / Socket)的狀況,就算會爆炸也不意外啦。

使用 C# 時,需加上
using System.Runtime.Serialization ;
using System.Runtime.Serialization.Formatters.Binary ;

並在需要 Serialize / Deserialize 的 class 宣告前加上 [Serializable()]
在物件內,Serialize 時要忽略的變數前加上 [NonSerialized()]

儲存時參考程式碼:
IFormatter f = new BinaryFormatter();
Stream s = new FileStream(FILENAME, FileMode.Create, FileAccess.Write, FileShare.None);
f.Serialize(s, INSTANCENAME);
s.Close();

提取時參考程式碼:
IFormatter f = new BinaryFormatter();
Stream s = new FileStream(FILENAME, FileMode.Open, FileAccess.Read, FileShare.Read);
INSTANCENAME = (CLASSNAME) formatter.Deserialize(s);
s.Close();

註:詳細內容請參照 msdn : SerializableAtribute,欲求不滿再參考 ISerializable

補充,如果是 Class A 裡持有 Class B 變數的話,必須宣告 Class A/B 均為 Serializable(),才能將 Class A Serialize,否則會在 Runtime 出錯;或者可以將 Class B 設為 NonSerialized。另外,Serializable() 不會被繼承,因此要使用的物件需明確宣告。

2010-04-11

DirectX, XNA, OpenGL 什麼是什麼啊

前陣子想把在實驗室開發的一套超簡易模擬系統(模擬什麼就不重要啦,那是秘密!),加上顯示的功能,因此花了點時間瞭解市面上的 3D 繪圖技術。底下稍微把查詢到的東西重新整理,當作備忘 XD

  • DirectX(wikipedia): Microsoft 所開發出的多媒體函式庫,其下又區分為許多與遊戲、多媒體、顯示相關的套件:Direct3D 處理 3D 顯示,DirectInput 處理鍵盤滑鼠 GamePad 輸入,DirectSound 負責音效等等的功能。
    DirectX 9 是最後一個支援 WindowsXP 的版本,而 DirectX 9Ex/10 與 11 則只支援 Vista 與 Windows7。雖然如此,DX9 的功能已成熟到能建構「堪用」的介面,DX 9/Ex/10/11 的差異主要在於效能、效果方面,因此若要開發汎用的 3D 顯示程式的話,Dx9 仍為首選。DX11 新增的 DirectCompute 套件能利用 GPU 進行一般運算(GPGPU, General-purpose computing on Graphics Processing Units),與 nVidia 出的 CUDA 功能類似,算是 DX11 比較讓我感興趣的部份。
    DirectX SDK 為 C 語言的函式庫,因此能以大多數的 C/C++ Compiler 編譯。除了 Microsoft 平台以外,Wine 計畫實做了可安裝於 Un*x 作業系統下的對等 Runtime Library
  • Managed DirectX: Microsoft 在 .Net 熱潮的時候搞出來的東西,把底層的 DX9 API 包成了 Managed Code,讓 .Net coder 可以很爽的以 Visual Studio 快速開發。這套專案已在 2006 年終止,不過目前下載的 DirectX SDK 還是包含這個套件。由於本體還是 DirectX 9,利用這套 Library 開發的程式應該能在安裝 .Net Framework 與 DirectX 9 的電腦上執行(未確認)
  • XNA (wikipedia): Microsoft 推出的另一套遊戲導向的函式庫。與 Managed DirectX 類似,XNA 同樣將 DirectX 9 的功能以 Managed Code 的方式封裝運作。雖說透過 XNA 寫出的執行檔能在 Windows, Zune, XBox 360, Windows Phone 7.0 下運作,客戶端還是需要安裝特定 runtime library 才能執行,因而 XNA 還是受到了一些詬病。然而 XNA 在 2D 與 3D 程式的開發上,確實比 Managed DirectX 更簡單快速。
    Microsoft 將 XNA 定位為供學生或工作室能快速開發遊戲的平台,因此很難期待 MS 會對它的效能與功能做出多少強化。又因為 XBox360 似乎只支援到 DX9,因此 XNA 應該也不會納入 DX10/11 的新特色。
  • OpenGL (wikipedia): 一套由非營利團隊負責的開源碼圖像系統,功能與 DirectX 中的 Direct2D, Direct3D 類似。開源碼專案一般都會有許多熱心人士建立適用於各種環境的 Library,讓像我這種什麼都不懂的人也能自我感覺良好,因此 OpenGL 的平台與環境支援度遠超越 DirectX;然而各家實做的完成度、效率、附加限制,也變成需要考量的重點。既然我什麼都不懂啊,就別期待能看到這方面的內容啦 ㄎㄎ
    除了 OpenGL 以外,還有其他的開源碼專案如 OpenML 處理多媒體、OpenAL 處理音效、OpenCL 進行運算;這些套件合體後,所能提供的功能與 DirectX 也就差不多啦。
    就 OpenGL + .Net Framework 來說,以前我摸過一下下 Tao,前陣子因為 Tao 官網炸裂,就改裝 OpenTK,目前仍在學習中。

最近啊...

最近在摸 C# 還有 3D 顯示相關函式庫 (DirectX, OpenGL, XNA 等等),有追 Plurk 的朋友應該早就發現了吧 XD 與其讓筆記在噗浪的洪流裡消失,還是記在這邊以後比較容易回過頭來查詢。兩週內這邊應該會稍微有為一下!