这一切都要从一只蝙蝠说起。。。。。。
有图有真相
实现了跨平台的 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