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

posted @ 2020-02-22 21:24  疯光无线  阅读(1920)  评论(0编辑  收藏