【Rust日报】2020-08-13 关于群集(Bevy)引擎ECS框架中system的语法糖是怎么实现的
Learn Wgpu 系列简化了之前Instancing的教程
作者表示之前的Instancing部分写的太过繁杂,作者喜欢展示各种不同的技术导致之前该章节与之前的章节相比显得脱节,这次更新简化了该教程。
教程地址:https://sotrh.github.io/learn-wgpu/beginner/tutorial7-instancing/#instancing
关于群集(Bevy)引擎ECS框架中system的语法糖是怎么实现的
群集(Bevy)引擎中的system就是普通的Rust函数,这样的设计及其符合人体工程学,就像作者本人在群集(Bevy)引擎的介绍中说的那样,目前找不到比群集引擎更符合人体工程学的ECS框架设计了。
推特上有人简单分析了一下群集引擎中这部分代码的语法糖是怎么实现的,考虑到不少小伙伴并不能够随时访问推特,在这里我把大概意思搬运过来。
system作为普通的Rust函数,它的参数也就代表了需要访问的那些组件的查询。群集提供的主要示例非常引人注目,系统就是函数,组件就是结构体,你不需要实现额外的trait,就能够让ECS框架正常运作。
use bevy::prelude::*;
struct Velocity(f32);
struct Position(f32);
// setup这个函数就是一个系统
// 这个系统把由Postion和Velocity组件构建的实体spawn到了commands缓冲区内
fn setup(mut commands:Commands) {
commands
.spawn((Position(0.0),Velocity(1.0),))
.spawn((Position(1.0),Velocity(2.0),));
}
// 该系统的参数就是我们要查询的组件构成的实体
fn movement(position:Mut<Position>,velocity:&Velocity) {
position.0 += velocity.0;
}
// 这是应用的入口,希望你把上面写好的系统注册到要运行的App中
fn main() {
App::build()
.add_startup_system(setup.system())
.add_system(movement.system())
.run();
}
就像上面的示例一样,只要按照一定的规则写出函数,在App的构建模式中调用.system()
方法就可以把函数变成系统。
一个普通的Rust函数在调用.system()
这个方法之后,将被转换为一个Box<dyn System>
,对于群集支持的两种系统,采用IntoForEachSystem
和IntoQuerySystem
这两个trait进行转换。
// 具体代码可以去群集的文档里看,这里只举例了IntoQuerySystem这个trait
pub trait IntoQuerySystem<Commands,R,Q> {
fn system(self) -> Box<dyn System>;
}
有了trait之后只需要把trait实现给我们可能会调用的函数,一个一个函数的去实现肯定是不可能的,翻看群集的这部分源码能够看到大量的使用了宏:
具体的代码可以去看群集的源码,总结来说,群集实现的这种及其符合人体工程学的ECS架构,就是基于宏加上trait来实现的。宏的部分十分值得仔细研究,推特原文作者也是正在研究其中的东西,截至日报更新时还没有新的成果,后续可以直接去关注该条推特。
推文链接:https://twitter.com/yaahc_/status/1293567953875505152?s=20
Rust写数据可视化的一个小教程
该文用到了plotly
库,是一个可以动手实验的小教程。
教程原文:https://shahinrostami.com/posts/programming/rust-notebooks/box-plots-at-the-olympics/
OrbTk
0.3.1-alpha3发布了
之前关注过Redox的应该知道OrbTk是他们团队给该操作系统设计的Gui库,现在这个库在crates.io发布了最新的版本,相较于之前性能更好了,也有了新的主题切换引擎可以选择。还更新了三种UI组件(ProgressBar,NumericBox,TabWidget)。
Read More:https://github.com/redox-os/orbtk/releases/tag/0.3.1-alpha3
“Rust没有稳定的ABI”
作者见过GNOME的用户(通常是在C库上工作了很长时间的人)表达以下问题:
- 编译的Rust代码没有稳定的ABI(应用程序二进制接口)。
- 因此,我们不能使用传统的Linux发行版共享库。
- 同时,Rust还将其整个标准库与它所编译的每个二进制文件捆绑在一起,这使得Rust构建的库非常庞大。
作者是那种认为大部分基础设施都应该用Rust重写的人,所以这些问题,也是作者本人非常关注的事。
因此作者写了一篇关于这个问题文章。
Read More:https://people.gnome.org/~federico/blog/rust-stable-abi.html
docs.rs 已经更新了文档覆盖功能
docs.rs更新了文档覆盖功能
关于构建者模式的一个简短介绍
一个关于构建者模式的简短介绍。
以及提供了三个实际项目中的用例。
Read More:https://matklad.github.io/2020/08/12/who-builds-the-builder.html
This Week in Rust
每周官方都会更新的This Week in Rust又更新了。
这已经是第351期了。
基本上最近有关Rust的动向里面都收集了,个人一直比较关注的是Tooling类的动向吧,rust-analyzer越来越好用了。
其他动向日报基本都涉及过了,这里不再提及,主要说两个,一个是每月都会更新一次的Rust GameDev,以及最近才更新的区块链相关动向。
感兴趣的可以直接下面的链接到文章。
Rust GameDev:https://rust-gamedev.github.io/posts/newsletter-012/
Blockchain:https://rustinblockchain.org/newsletters/2020-08-05-are-we-smart-contract-yet/
Read More:https://this-week-in-rust.org/blog/2020/08/11/this-week-in-rust-351/
From 日报小组 Downtime Jancd
社区学习交流平台订阅:
- Rust.cc 论坛: 支持 rss
- 微信公众号:Rust 语言学习交流
- WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇]
- WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]
- 树大招风:细数2017年加密货币市场的幺蛾子事件
- 如何解决HP QC(Quality Center)在Windows 7下不能工作的问题
- WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[上篇]
- 5个典型实例启发:什么是数据可视化
- 智能家居“智商”不够,能靠情商来补吗
- 大话MVP
- AngularJS in Action读书笔记1——扫平一揽子专业术语
- MS Enterprise Library 5.0发布!!
- WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]
- 《Enterprise Library深入解析与灵活应用》博文系列汇总
- 使命必达: 深入剖析WCF的可靠会话[概念篇]
- AngularJS in Action读书笔记2——view和controller的那些事儿
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言 | 根据数据框的顺序进行筛选
- 上帝视角看 TypeScript
- 一文 get 入门 canvas 的最佳路径
- Matlab系列之数组的基本操作
- Matlab系列之数组(矩阵)的生成
- R语言T检验的简单小例子
- ggplot2 修改图例的一些操作
- 实践:SpringBoot实现定时任务的动态增删启停
- Asp.Net Core API 需要认证时发生重定向的解决方法
- 在 Windows 系统上启用远程应用
- ArcGIS Enterprise 配置 nginx 反向代理
- 在安卓手机上通过 Termux 运行编译/运行 .NET 应用
- 在 ASP.NET Core 中修改配置文件后自动加载新的配置
- 使用 frp 安全的暴露内网服务
- 在 .NET Core 应用中使用 NHibernate