zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Nginx入门
    Spring基础知识汇总 Java开发必看
    java ArrayList倒序
    1
    js event 的target 和currentTarget
    java 文件的写入和读取
    DOMContentLoaded与load的区别
    JS中先有Object还是先有Function?
    JSON.stringify的三个参数
    Java的泛型约束和限制
  • 原文地址:https://www.cnblogs.com/crazylights/p/12347294.html
Copyright © 2011-2022 走看看