当前位置: 首页 > news >正文

初步探究Rust生态与图形界面编程

引言

Rust作为一种现代的、安全的系统编程语言,自2010年问世以来,逐渐在开发社区中崭露头角。它的内存安全保证、并发处理能力、以及无需垃圾回收机制的高性能特性,使得它成为了开发系统工具、网络服务、以及嵌入式系统的热门选择。然而,在图形界面编程领域,Rust尚处于起步阶段,社区正在积极发展相关生态系统。今天,我们一起探讨Rust图形界面编程的现状、生态系统的发展,以及面临的挑战。

Rust的图形界面编程生态

现状

与C++的Qt、C#的WPF或者JavaScript的Electron等成熟的图形界面框架相比,Rust的图形界面生态显得相对年轻。虽然Rust社区内部有一些早期的图形界面库,但它们多数还不够成熟,或缺乏广泛的社区支持和维护。不过,随着Rust语言的普及和社区的壮大,图形界面编程生态正在逐步发展。

框架与库

1. Conrod

Conrod是一个简单易用的即时模式UI库,它使用Rust的特性来提供安全的UI编程模式。Conrod适合快速原型开发和小型项目,但可能不适合大型、复杂的应用程序。

2. Druid

Druid是一个数据驱动的Rust原生UI设计框架,由Mozilla赞助的Redox操作系统项目团队开发。Druid的目标是提供高性能、易用性和可扩展性,它还在积极地开发中,未来前景广阔。

3. Iced

Iced是一个灵感来自Elm的声明式Rust图形界面库,它致力于简洁和响应式设计。支持跨平台开发,包括WebAssembly,是现代Rust GUI开发的有力候选者。

4. gtk-rs

gtk-rs项目提供了GTK+库的Rust绑定,使得Rust开发者能够利用成熟的GTK+进行图形界面开发。这是目前为止Rust中最成熟的图形界面方案之一。

社区和资源

Rust的快速增长也带动了其社区的发展,从各种在线论坛、聊天室到官方和非官方文档,都可以找到关于Rust图形界面编程的讨论和帮助。然而,与更成熟的技术相比,Rust在图形界面编程方面的社区和资源仍相对有限。

挑战与展望

挑战

  • 成熟度:Rust的GUI框架大多数还未达到商业应用的成熟度,缺乏全面的文档和广泛的生态支持。
  • 学习曲线:Rust本身的学习曲线较陡峭,加之图形界面编程的复杂性,新手可能会感到门槛较高。
  • 异步支持:现代GUI应用通常需要良好的异步支持以处理诸如网络请求等操作,Rust的异步编程模型还在不断进化中,对于GUI框架的集成提出了挑战。

深入Rust社区的Iced图形界面库

在上面众多图形界面库中,Iced相对比较新,功能和关注都比较丰富。
iced库的github地址为:https://github.com/iced-rs/iced

观察iced项目的依赖库,列出如下:

  1. async-std: 提供标准库风格的异步版本,包括I/O、文件系统操作、线程等。

  2. bitflags: 一个宏帮助创建封装位字段的结构体,用于处理位掩码操作。

  3. bytemuck: 无需unsafe代码即可进行安全的裸字节转换,还支持派生宏。

  4. bytes: 提供字节缓冲区的数据结构,如BytesBytesMut,用于网络编程和异步I/O。

  5. cosmic-text: COSMIC Text 提供高级文本整形、布局和渲染,这些功能都包含在一个简单的抽象中。整形由 rustybuzz 提供,并支持各种高级整形操作。渲染由 swash 提供,它支持连字和彩色表情符号。布局是在安全的 Rust 中自定义实现的,并支持双向文本。

  6. dark-light: 检测是否启用了暗模式或亮模式。

  7. futures: 一个提供异步编程能力的库,包括异步操作的future、stream和sink抽象。

  8. glam: 一个简单且快速的线性代数库,用于图形和游戏开发。

  9. glyphon: 这个库来自于指定的git仓库,是一个用于webgpu处理字形的库。

  10. guillotiere: 一个矩形打包库,可用于贴图图集或UI布局。

  11. half: 提供16位浮点类型(即半精度浮点数)。

  12. image: 一个综合图像处理库,支持多种图像格式的编码和解码。

  13. kamadak-exif: 用于解析Exif元数据的库。

  14. kurbo: kurbo库包含曲线和矢量路径的数据结构和算法。。

  15. log: Rust的日志记录宏和API。

  16. lyon: 一个用rust编写的路径细分库,用于基于GPU的2D图形渲染。

  17. lyon_path: lyon库的一部分,处理路径的数据结构和算法。

  18. num-traits: 数字类型的特性和相关实用工具。

  19. once_cell: 提供单次初始化的单元格类型,如Lazy

  20. ouroboros: 允许在Rust中创建自引用结构体的库。

  21. palette: 用于颜色计算和转换的库。

  22. qrcode: 生成QR码的库。

  23. raw-window-handle: 提供访问底层窗口句柄的抽象。

  24. resvg: 一个SVG渲染库。

  25. rustc-hash: Rust编译器使用的快速散列函数。

  26. smol: 一个小型和快速的异步Rust运行时。

  27. smol_str: 用于存储小字符串的库,通常用于编程语言工具。

  28. softbuffer: 可能是一个软件渲染缓冲区的库,但没有详细信息。

  29. syntect: 用于代码语法高亮显示的库。

  30. sysinfo: 获取系统信息(如CPU、内存使用情况)的库。

  31. thiserror: 用于简化错误处理的库。

  32. tiny-skia: 一个小型的Skia子集,Skia是一个2D图形库。

  33. tokio: 异步运行时,用于编写网络应用程序。

  34. tracing: 提供结构化诊断信息的应用程序框架。

  35. unicode-segmentation: 用于Unicode文本分割的库。

  36. wasm-bindgen-futures: 用于在wasm-bindgen和JavaScript之间转换futures的库。

  37. wasm-timer: 为WASM提供时间相关功能的库。

  38. web-sys: 提供对Web API的绑定,用于在Rust中操作Web技术。

  39. web-time: 可能是一个处理时间的Web库。

  40. wgpu: Rust的WebGPU API,用于现代图形和计算。

  41. winapi: 提供对Windows API的绑定。

  42. window_clipboard: 用于操作剪贴板的库。

  43. winit: 一个窗口创建和管理库,这个特定版本来自于git仓库。

编译和运行例子

安装rust的编译环境非常顺利,使用cargo构建iced的例子也很顺利。
运行了一些例子,发现iced还是存在一些bug,控件的丰富度和自定义能力有待提升。
但是非常喜欢iced库构建出来的二进制体积小巧。iced在windows默认有两个绘制后端,分别是tiny-skia和webgpu,把webgpu去掉后,构建出来的一个代码编辑器例子只有4.34MB(win-x64):
在这里插入图片描述

结论

Rust在图形界面编程领域虽然起步较晚,但其安全性、性能和现代化的语言特性,为其未来的发展提供了坚实的基础。
cargo 目前已经有比较成熟的2D、3D渲染的库了。Rust社区拥有强大的图形界面库也指日可待了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • zookeeper在哪里能用到
  • Python-PLAXIS自动化建模技术与典型岩土工程
  • 【web】-sql注入-login
  • VSCode remote无法链接
  • 使机器人在执行任务倒快递
  • 【数智化CIO展】三一集团CIO吕青海:企业高速发展“数字化”是基础,“数智化”是升华...
  • MySQL黑马教学对应视屏笔记分享之聚合函数,以及排序语句的讲解笔记
  • 查询(q_proj)、键(k_proj)和值(v_proj)投影具体含义
  • CSS上下悬浮特效
  • OpenCV和PIL进行前景提取
  • AWS-S3实现Minio分片上传、断点续传、秒传、分片下载、暂停下载
  • 【总线】AXI第九课时:介绍AXI响应信号 (Response Signaling):RRESP和 BRESP
  • 网络层重点协议—IP协议
  • Angular页面项目以HTTPS方式启动调试
  • 【教程】Hexo 部署到 Github Page 后,自定义域名失效的问题
  • hexo+github搭建个人博客
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 30秒的PHP代码片段(1)数组 - Array
  • 345-反转字符串中的元音字母
  • Angular Elements 及其运作原理
  • bearychat的java client
  • canvas绘制圆角头像
  • Date型的使用
  • Lucene解析 - 基本概念
  • Mocha测试初探
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpringBoot几种定时任务的实现方式
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue-cli3搭建项目
  • 创建一个Struts2项目maven 方式
  • 代理模式
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 入门到放弃node系列之Hello Word篇
  • 使用docker-compose进行多节点部署
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 网络应用优化——时延与带宽
  • 小程序 setData 学问多
  • 译自由幺半群
  • 因为阿里,他们成了“杭漂”
  • 硬币翻转问题,区间操作
  • 用element的upload组件实现多图片上传和压缩
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​学习一下,什么是预包装食品?​
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • (35)远程识别(又称无人机识别)(二)
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (六)c52学习之旅-独立按键
  • (转)c++ std::pair 与 std::make
  • (转)h264中avc和flv数据的解析
  • (转)http-server应用
  • (转)http协议
  • (转)一些感悟
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl