Dotnet Core 跨平台GUI 開發實踐


這一切都要從一只蝙蝠說起。。。。。。


有圖有真相

實現了跨平台的 GUI開發(基於2D圖形引擎)

實現了跨平台的多媒體開發(圖中播放mp3 和 ogg)


LINUX代表 Ubuntu(條件有限,只能虛擬機了)

IMG_20200222_203937

MACOS代表 IMAC

IMG_20200222_203933

以及WINDOWS代表

IMG_20200222_204019


這三個平台運行的都是這個

一個 mp3 和 ogg的播放器

image

還有一個NES模擬器  wsad 上下左右  jk是 AB  op 是select 和start

image


這些都不需要復雜的配置,裝好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動態庫生成,真的是折騰了一陣子。


image

索性,現在這些你都不用操心了,我全都把他們搞好了


UI與繪圖

然后,我寫了一個小霸王風格的UI系統,

image

可以看到還在開發中,只要能畫像素,這些都不是問題

需要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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM