這一切都要從一只蝙蝠說起。。。。。。
有圖有真相
實現了跨平台的 GUI開發(基於2D圖形引擎)
實現了跨平台的多媒體開發(圖中播放mp3 和 ogg)
LINUX代表 Ubuntu(條件有限,只能虛擬機了)
MACOS代表 IMAC
以及WINDOWS代表
這三個平台運行的都是這個
一個 mp3 和 ogg的播放器
還有一個NES模擬器 wsad 上下左右 jk是 AB op 是select 和start
這些都不需要復雜的配置,裝好dotnet,拉下倉庫,
一條dotnet run 就可以跑起來
倉庫在
https://gitee.com/lightsever/fakenes
細節分析
為什么要做這樣一個東西呢,還得從一只蝙蝠說起。。。。。。
嗯嗯,跑遠了,出發點是因為自從轉向.netcore技術棧以后,總是缺一塊,如鯁在喉。對了,就是GUI與多媒體開發。
在.net 時代,windows上有winform,wpf
linux macos上有mono 攜帶gtk#
但是畢竟還是完全割裂的兩家人。
.netcore解決了根本的執行環境的統一,可是在圖形多媒體這一塊始終缺一點。
而我,始終很在意跨平台這個問題。
想寫一個工具,所有平台都能用,要么electron方案,但是畢竟js還是沒有c#的生產力。
c#方案官方還是沒有一套統一的機制
怎么辦,要說咱可是20年前就接觸c++了,雖說c#圈子里沒有這樣一個全覆蓋的方案,c++那邊可是成群啊。
所以,我只要選擇一個,提供了最基礎最基礎的功能的,保證他的跨平台,用c# p/invoke 去調用他的API,實現各個平台一套代碼,一字不改。
要構建一個多媒體GUI系統需要三個功能
1.窗口管理
2.繪圖功能
3.聲音系統
這方面廣為人知的系統有兩個,一個OpenTK,一個SDL,都非常有名氣而且還古老。
他們都能完全覆蓋我的需求,經過簡單的比較,我毫不猶豫放棄了OpenTK
因為OpenTK的實現太復雜了,而且在每個平台都有一些不同的實現,而且聲音播放基於OPENAL,這玩意在windows下都不能帶個dll就跑,還得安裝,pass,pass.
OpenTK的優點只有OpenGL的兼容非常好。
而SDL就非常的干凈了,主庫SDL2
1.有窗口管理
2.只有非常簡單的2D繪圖功能
3.聲音系統也只有簡單的向聲音設備寫流數據
但是,他確實實現了,各個平台一套完全一致的代碼。
所以,后面的問題只需要我們調試好SDL2的c#包裝。
說是只需要,可是我還是調了很久。。。
尤其是macos的SDL2動態庫生成,真的是折騰了一陣子。
索性,現在這些你都不用操心了,我全都把他們搞好了
UI與繪圖
然后,我寫了一個小霸王風格的UI系統,
可以看到還在開發中,只要能畫像素,這些都不是問題
需要3D繪圖 OPENGL的接口還得另綁,不過我本來定位就不打算搞3D
有窗口管理和事件,有繪圖,基於他實現一個UI系統該有的都有了
加載圖片的問題
SDL主庫不具備圖片解碼器,不能加載圖片,要加載圖片有個SDL2_Image庫,但是折騰跨平台編譯、綁定真的很煩躁,所以我決定上層功能全部使用pure c#實現,目前還沒實現
不過這里有一個我曾經用過的
https://github.com/SixLabors/ImageSharp
這個庫,質量很高,基本不用動手
加載音樂的問題
目前我支持了加載ogg 和 mp3格式的音樂
ogg用了我以前修改過的 nVorbis ,這是誰照着官方c代碼翻得,質量挺高,我原來搞Unity中實時播放音樂時稍微改了改就能用了,這次直接搬過來了
Mp3我用了mp3sharp的50%代碼,這個庫的品質太差,是java 翻c#,一堆bug,我花了大力氣,才讓mp3正常播放出來,現在mp3讀取寫的比較清晰了,實際還需要再重構一下。
好了,我們已經解決了開發dotnetcore 跨平台 多媒體程序開發的問題。
還有兩件事
寫代碼
dotnet run