ZKX'S Blogs
  • ZKX'S BLOG
  • action
    • road-map
    • todo-list
    • temp
  • 游戏技术
    • 物理
    • algorithm
      • obstacle-avoidance
      • path-finding
    • Assets
      • 解包资源
      • Sound
      • text
      • 动画
      • image
        • image-tools
        • maple-story
        • 项目图
        • SD
        • AI
          • ai-model
          • Novel ai
          • transformer
          • ComfyUI
            • start
          • sd
            • four-view
            • image-assets
            • icon
              • working-flow
            • tutorials
              • introduction
              • model-traning
        • ui
          • ui-todo
          • work
          • ui-tutorials
            • 一颗豆Studio
            • image-process
              • 8-minute
              • 1. 现代图形绘制流水导论
            • xiao-long-bao
              • game-ui
              • ps-skill
      • model
        • Houdini
        • Blender
          • animation
          • 配合 Unity 建模流程
          • common-use
          • Blender 配置
          • plugins
          • Words
          • tutorials
            • Imphenzia
            • blender-4.0
              • 建模篇
              • 10. role-anim
              • 11. room-anim
              • 2. lighting
              • 3. material
              • 场景动画
              • 5. item-animation
              • 6. engrave
              • 7. role
              • 8. face
              • 9. bone
      • vfx
        • vfx-assets
        • vfx
      • 视频录制
    • README_冲突文件_zkx_20240828215908
      • 计算机科学
      • 代码写法
        • functional-programming
        • programing-driven
      • data-structure
        • tree
      • multi-threads
        • consistent-hash
        • I/O 多路复用
        • reactor-proactor
        • zero-copy
      • 操作系统
        • cpu-cache_冲突文件_zkx_20240828215908
        • soa_冲突文件_zkx_20240828215908
        • memory
          • memory-allocation
          • memory-recycle_冲突文件_zkx_20240828215908
          • 预读机制
          • virtual-memory_冲突文件_zkx_20240828215908
        • 进程线程
          • base_冲突文件_zkx_20240828215908
          • communicate_冲突文件_zkx_20240828215908
    • 笔记
      • Bevy 引擎研究
      • render-pass
      • usd
      • Interview
      • breaking
        • multi-threads
      • GPU
        • multi-threads
        • DirectX 12 3D 游戏开发实战
        • Analyze
        • vulkan
          • Vulkan 应用
          • Vulkan 坐标系
          • Vulkan 创建 CubeMap
          • 渲染器流程
          • Vulkan 对象
          • vulkan-learn
            • Vulkan tutorials
              • Comparison of graphics apis
              • Official Vulkan Tutorial
              • brendan-galea
                • Vulkan Game Enggine
              • Vulkan-lecture-series
                • Vulkan Essentials
                • Swap chain
                • 03. Resources & Descriptors
                • Commands and Command Buffers
                • pipeline and stages
                • 07. Synchronization
      • projects
        • fbx
        • 动画
          • animation-graphs_冲突文件_zkx_20240828215918
          • animation-programming-basics_冲突文件_zkx_20240828215918
          • README_冲突文件_zkx_20240828215918
            • 1. Intro to Physics-Based Animation_冲突文件_zkx_20240828215918
            • Vector
            • 3. Rigid body dynamic_冲突文件_zkx_20240828215918
            • 4.Rigid Contacts_冲突文件_zkx_20240828215918
            • 5.Cloth Simulation_冲突文件_zkx_20240828215918
          • arm
            • 1. Introduction to Character Animation_冲突文件_zkx_20240828215918
          • 程序动画
            • 程序动画
        • GLTF
          • 皮肤
        • 网格生成
          • Mesh Gen
          • 网格
          • 程序化地形
          • games-202-几何建模和处理
            • 1. 课程介绍
            • 2. 数据拟合
      • 渲染
        • 渲染器
        • 管线和引擎
          • 颜色空间
          • 法线映射
          • Render Graph
          • 渲染管线
        • 游戏引擎
          • font
          • gpu-instance
          • 光照纹理
          • 光线追踪
          • 蒙皮动画
          • Skybox
          • 文字
          • texture-compress
          • UI
          • view-port-mode_冲突文件_zkx_20240828215919
          • 虚拟纹理
        • performance
          • HLOD
          • tools
        • controller
          • 2d 后处理和光照
          • 抗锯齿
          • buffer
          • 延时渲染
          • hclip
          • 后处理
          • 阴影
          • transparency
          • culling
            • Culling
            • hiz
        • 技术美术
          • 艺术表达
            • 各向异性
            • 一些特效
            • 非真实感渲染(卡通渲染)
            • Outline
            • 次表面散射
            • Tone Mapping
          • Filament 渲染器里的算法
            • 2 Overview
            • Notation
            • 4 Material System
            • 5. Lighting
          • 自然模拟
            • BRDF
            • 全局光照 GI
            • 光照
            • 物理真实的渲染
            • Blogs
            • 反射
            • UE 中的物理光照系统
            • 体渲染
            • water
            • 天气系统
        • 渲染教程
          • apex-legends-mobile
          • Shader 入门精要笔记
          • 庄懂-美术向 TA 课程
          • games-202
            • Introduction and Overview
            • Real-Time Physically-Based Materials
            • real-time-physically-based-materials-2
            • 实时光线追踪 1
            • 实时光线追踪 2
            • A Glimpse of Industrial Solusion
            • 2. Recap of CG Basics
            • Real time Shadows 1
            • Real time shadows 2
            • 实时环境光 上
            • 实时环境光 下
            • 实时全局光照 1
            • 实时全局光照 2
            • Realtime global illumination 3
      • 渲染笔记
      • tutorials
        • mobile-optimize
        • modern-mobile-rendering-note
        • README_冲突文件_zkx_20240828215908
          • 7. 游戏循环及实时模拟_冲突文件_zkx_20240828215908
          • multi-threads
          • multi-threads
          • 12. 碰撞和刚体动力学
          • multi-threads
          • cargo-mobile
          • 15. 运行时游戏性基础系统
          • multi-threads
          • C/ C++ 的数据、代码及内存
          • 4. 游戏所需要的三维数学
          • 5. 游戏支持系统_冲突文件_zkx_20240828215908
          • base
          • cargo-mobile
          • projects
          • multi-threads
        • GAMES104-现代游戏引擎: 从入门到实践
          • 第一节:游戏引擎导论
          • 第二节:引擎架构分层
          • 第三节:如何构建游戏世界
          • 第四节:游戏引擎中的渲染实现
          • 第五节:光和材质
          • 第六节:游戏中大气和云的渲染
          • 第七课:游戏中渲染管线、后处理和其他
          • 第八课:引擎中的动画技术基础
          • Advanced Animation Technology
          • Physics System
          • 物理系统应用
          • 粒子系统和音效系统
          • 玩法
          • 基础 AI 上
          • 基础 AI 下
          • 高级 AI 上
          • 高级 AI 下 Machine Learning
          • 网络架构基础 上
          • 网络架构基础 下
          • 网络架构进阶 上
          • 网络架构进阶 下
          • Data-Oriented Programming and Job System 面向数据编程
          • Data Oriented 下
          • 动态全局光照和 Luman
          • 全局光照和 lumen 下
          • GPU-Driven Geometry pipeline - Nanite
          • Nanite - 2
        • games-106
          • multi-threads
          • 2. 图形绘制流水的基本原理和实践 (1)
          • 3. 图形绘制流水的基本原理和实践 (2)
          • 4. 图形绘制流水的基本原理和实践 (3)
          • 绘制管线中的计算频率
          • 6. 性能分析
    • game-ai
      • game-ai-book
      • behaviour
      • base
      • goap
      • sli97
    • 游戏设计
      • battle-system
      • 新手引导
      • character-controller
      • game-designer-books
      • game-theory
      • 关卡策划
      • 模块化设计
      • simple-note
      • player-behaviour
      • skill
      • 缝合怪和肉鸽
      • 顶视角
      • tps-vs-fps
      • 策划实用网站
      • culture
      • 游戏数值
        • battle-numerical
        • 战斗数值
        • 装备数值
      • 游戏设计教程
        • 超简短的独立游戏开发教学第一季
        • 超简短的独立游戏开发教学第二季
        • zelda-phisics-sound
    • 游戏引擎编程语言
      • english
      • CPP
        • cmake-tutorial
        • 编译
        • 包管理
        • cpp 工程结构
        • 智能指针
      • C#
        • GC
        • Web
        • 语言执行原理
        • weak-reference_冲突文件_zkx_20240828215917
      • Rust
        • base
        • cargo
        • macro
        • Rust android
        • rust-async_冲突文件_zkx_20240828215917
        • 跨平台
        • FFI
        • 文件操作
        • Rust Macros
        • Rust 内存管理
        • Rust Option 和 Result 的处理
        • Rust 中的引用
        • Rust 正则表达式
        • 学习 Rust
          • Rust 笔记
        • 使用 Rust 写 Vulkan
          • 开源中间件和项目
          • Rust 光线追踪
    • 数学
      • Fractal
      • 机器学习
      • 元胞自动机
      • 曲线
      • 半球积分
      • 线性代数的本质
      • 低差异序列
      • 噪声
      • 四元数
      • 有向距离场
      • 空间变换
      • 球谐函数
      • physics
        • Games 401
        • soft-body
  • 游戏
    • 赛博朋克 2077
    • 艾尔登法环
    • 密室逃脱
    • 日式
    • 冒险岛国际服
    • no-oxygen
    • oil-game
    • text-game
  • 工具
    • shell
    • 博客搭建
      • 基础
      • 美化
      • 使用 Markdown 做博客
      • my-blogs
    • controller
      • sofunny
    • 游戏引擎使用
      • 虚幻引擎
      • Unity
        • plugins
        • client
          • life-time
          • 网络
          • weixin
          • 3c
            • input
            • animator
              • Reference
            • games-105-计算机角色动画基础
              • Motion
            • golden-rush
              • cargo-mobile
              • 工程技术
            • input
              • input-system
          • 代码
            • 协程
            • 事件系统
            • 游戏框架
            • projects
              • JobSystem
              • unitask
          • DOTS
            • ai_冲突文件_zkx_20240828215923
            • Entity component system
            • errors_冲突文件_zkx_20240828215923
            • SubScene
            • ecs-sample-note
              • advance
              • bake
              • base-practice
              • graphical
              • render
              • resource
          • Unity 编辑器使用技巧
            • 自定义模块
            • 下载
            • android
              • 调试安卓机
              • install-apk
            • Unity 工具
              • Editor UI
              • OnGUI
          • memory
            • 安卓内存
            • Unity 内存分布
            • native-memory
          • performance
            • accelerate
            • game-performance-note
            • performance-optimize
            • plugins
          • Unity UI
            • 设计
            • layout
            • shader-ui
            • Reference
        • others
          • Mod for Unity Game
          • weixin-game
          • xr
          • interview
            • junior-unity-client_冲突文件_zkx_20240828215923
          • 会议笔记
            • Unity 开放日 - 厦门分享总结
          • render-pipeline
            • ET Framework
            • DOTS-training-samples
              • 蚂蚁模拟
            • ECSSample
              • Advanced
              • Boids
              • hellocube_冲突文件_zkx_20240828215923
        • render
          • baking
          • gpu-driven
          • 粒子系统
          • Visual Effect Graph
          • 渲染管线
            • batch-render-group
            • inverse-z
            • platform-shader
            • scriptable-renderer
            • Universal Render Pipeline
            • HDRP
              • HDRP 中的 Anti-Aliasing
              • HDRP 自定义渲染阶段
              • 曝光
              • Lit 光照
              • SimpleLit
            • SRP
              • SRP Batch
              • SRP 概览
          • Unity shader 使用
            • Compute Shader
            • Draw Procedural
            • macro
            • 顶点坐标
            • Shader graph
            • 着色器语法
            • variant
            • Shader 预热
        • 资源管理
          • Addressable
          • config
          • 商业化的资源管理和热更新
          • AssetBundle
            • problems
            • skills
            • tutorials
          • asset
            • asset-live-time
            • Asset 简介
    • Git 进阶使用
      • git 常用方法
      • Git 使用出问题时的解决办法
      • git-submodule
      • basic
        • Git 基础
        • Github
        • Git 同步
    • IDE
      • Rider
      • 主题
    • 语法格式
      • 正则化
    • Windows
      • Windows 应用
由 GitBook 提供支持
在本页
  • 通过所有权机制管理内存
  • 字符串
  • 所有权
  • 引用
  • 方法形参
  • 可变引用
  • 防止数据竞争
  • 数据竞争出现的原因
  • 悬垂引用
  • 复合类型
  • 切片
  • 结构体
  • 结构体的内存排列
  • 结构体引用
  • 结构体字符串序列化
  • 枚举
  • 数组
  • 模式匹配
  • 方法
  • 泛型
  • 泛型指代 <T> Type
  • 特征(Trait)
  • 生命周期
  • 借用检查
  • 闭包

这有帮助吗?

在GitHub上编辑
  1. 游戏技术
  2. 游戏引擎编程语言
  3. Rust
  4. 学习 Rust

Rust 笔记

上一页学习 Rust下一页使用 Rust 写 Vulkan

最后更新于2年前

这有帮助吗?

通过所有权机制管理内存

  1. Rust 中每一个值都被一个变量所拥有,该变量被称之为值的所有者

  2. 一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者

  3. 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)

字符串

  • " " 字符串字面值,硬编码进可执行文件里的不可变数据,只能通过不可变切片访问

  • &str :不可变切片,引用只读集合内的一段连续数据

  • String 存储在堆上的可变大小字符集合,复合类型

  • String 变量取引用会隐式转换为切片返回字符串切片

  • String 变量执行 String 方法改变 String 后,变量将会指向一个全新的地址

    • 所以 String 变量需要操作的话必须是可变的

    • String 看起来能具备的各种改变内容的操作,但实际上他是不可变的,他实例化了一个新的对象

所有权

  • 复合变量赋值是进行移动,而不是浅拷贝,移动会销毁旧变量。

    • 一般情况不会直接复合变量赋值,没有意义,这个情况通常是出现在方法形参传递时,进入方法形参的变量将会移交所有权后失效,所有权为方法内部参数持有。

  • 值变量赋值是拷贝操作,即浅拷贝操作

  • rust 没有深拷贝操作

  • 值类型在 Rust 中称为 Copy 类型

引用

  • Rust 通过借用(Borrowing) 使另外一个变量不通过改变所有权的方式来访问这个变量的值

  • 这个操作也称为获取变量的引用

let y = &x;

y 是 x 的引用,

assert_eq!(5, *y)

*y 来解出引用所指向的值(也就是解引用)

方法形参

let s = String::from("hello"); change(&s); change(s: &String){}

方法形参可以自动解引用,方法作用域过去后,引用变量被释放,但是他不具有所有权,所以对应的值不会被释放。

引用的实质就是栈内数据指针

可变引用

let mut s = String::from("hello"); change(&mut s); change(s: &mut String){}

防止数据竞争

let mut s = String::from("hello");

let r1 = &mut s;
let r2 = &mut s;

println!("{}, {}", r1, r2);
  • 上面代码存在两个可变引用同一块栈空间

  • 就是两个读写指针同时指向了同一块内存

  • 在 r2 的作用域区间还访问了 r1

  • 为了防止数据竞争,这个代码将不会被编译通过

引用的作用域

从创建开始,一直持续到它最后一次使用的地方,这个跟变量的作用域有所不同,变量的作用域从创建持续到某一个花括号 }

高优先级的不可变借用

let r1 = &s; // 没问题
let r3 = &mut s; // 大问题

同时出现可用和不可变借用时将会报错,不可变借用不希望数据被其他位置修改

数据竞争出现的原因

  • 两个或更多的指针同时访问同一数据

  • 至少有一个指针被用来写入数据

  • 没有同步数据访问的机制

悬垂引用

  • 当变量引用了一个因为超出其作用域而被释放掉的变量时,编译将不会通过

复合类型

  • #![allow(unused_variables)] 编译器忽略未使用的变量

  • 返回一个 ! 类型,这个表明该函数是一个发散函数,不会返回任何值

  • unimplemented!() todo!() 告诉编译器该函数尚未实现

切片

切片也是引用

  • 创建字符串字面量的时候是创建这个字符串的完整切片引用 let s : &str = "12313"

切片可以引用堆内存数据

let mut s = String::from("hello world");
fn first_word(s: &String) -> &str {
    &s[..1]
}

切片可以切任意集合类型

let a = [1, 2, 3, 4, 5];
let slice = &a[1..3];
  1. 字符串切片的类型是&str,数组的切片类型是&[T].

  2. 字符串切片是按照字节进行索引的,数组切片是按照元素大小进行索引的.

结构体

  • 结构体

  • 元组结构体

  • 单元结构体

    • 单元类型 () 不占用任何内存

结构体的内存排列

结构体引用

先避免在结构体中使用引用类型

结构体字符串序列化

  • 使用 #[derive(Debug)] 对结构体进行了标记,这样才能使用 println!("{:?}", s);

  • 使用 {} 来格式化输出,那对应的类型就必须实现 Display 特征

枚举

  • 枚举对象等同于Int,而是等同于结构体,其中的每个枚举值相当于结构体成员,可以是任意类型

  • 枚举可以认为是结构体的子集

  • Option 枚举包含两个成员,一个成员表示有值:Some(T), 另一个表示没有值:None,

    • enum Option<T> {
          Some(T),
          None,
      }
    • 其中 T 是泛型参数,Some(T)表示该枚举成员的数据类型是 T,换句话说,Some 可以包含任何类型的数据。

    • Some 是泛型结构体

    • 这是代替了其他语言中的 null 的解决方案,也就是说,在 Option 的包裹下,变量才可能引用到 Null,其他情况下一定是有值的,不用做空值检查

    • 复合变量和值类型变量都可能有引用到 Null

  • Result 枚举关注函数返回值的正确性

    • enum Result<T, E> {
          Ok(T),
          Err(E),
      }
    • 如果函数正常运行,则最后返回一个 Ok(T),T 是函数具体的返回值类型,

    • 如果函数异常运行,则返回一个 Err(E),E 是错误类型。

数组

  • 数组 array 是存储在栈上,动态数组 Vector 是存储在堆上

  • 数组的初始化

    • let a = [1, 2, 3, 4, 5];

    • let a: [i32; 5] = [1, 2, 3, 4, 5];

    • let a = [3; 5];

    • [u8; 3]和 [u8; 4]是不同的类型,数组的长度也是类型的一部分

  • 数组切片

    • let slice: &[i32] = &a[1..3];

    • slice 的类型是&[i32],与之对比,数组的类型是[i32;5]

    • [T;n]描述了一个数组的类型,而[T]描述了切片的类型

    • 通过引用的方式去使用 &[T],因为后者有固定的类型大小

模式匹配

  • match 的匹配必须要穷举出所有可能,用 _ 来代表未列出的所有可能性

  • match 的每一个分支都必须是一个表达式,且所有分支的表达式最终返回值的类型必须相同

  • 模式匹配的另外一个重要功能是从模式中取出绑定的值

  • if let 只有一个模式的值需要被处理,其它值直接忽略

  • matches!,它可以将一个表达式跟模式进行匹配,然后返回匹配的结果 true orfalse

  • 模式是 Rust 中的特殊语法,它用来匹配类型中的结构和数据

    • 算是广义的正则表达式,pattern

    • 在 Rust 中,变量名也是一种模式,只不过它比较朴素很不起眼罢了。let x = 5;

    • 元组与模式进行匹配(模式和值的类型必需相同!) let (x, y, z) = (1, 2, 3);

      • let 和 for、match 都必须要求完全覆盖匹配,才能通过编译( 不可驳模式匹配 )。

      • if let 允许匹配一种模式,而忽略其余的模式( 可驳模式匹配 )。

    • 测试 Message::Hello 的 id 字段是否位于 3..=7 范围内,同时也希望能将其值绑定到 id_variable 变量中以便此分支中相关的代码可以使用它。

    •     Message::Hello { id: id_variable @ 3..=7 } => {
              println!("Found an id in range: {}", id_variable)
          },

方法

需要注意的是,self 依然有所有权的概念:

  • self 表示 Rectangle 的所有权转移到该方法中,这种形式用的较少

  • &self 表示该方法对 Rectangle 的不可变借用

  • &mut self 表示可变借用

  • 不使用 self 的是静态方法,可以拿来做构造函数

  • 可以将枚举看作结构体,为枚举写方法

泛型

泛型指代 <T> Type

  • 约束

  • 枚举类型

  • 打印任意类型的数组切片

    fn display_array<T: std::fmt::Debug>(arr: &[T]) {
        println!("{:?}", arr);
    }
  • 泛型代码的 单态化(monomorphization)来保证效率。单态化是一个通过填充编译时使用的具体类型,将通用代码转换为特定代码的过程。

  • 编译器寻找所有泛型代码被调用的位置并针对具体类型生成代码。

特征(Trait)

  • std::cmp::PartialOrd 让类型实现可比较的功能。

  • T : std::ops::Add<Output = T> 能进行相加操作,

  • 特征和接口差不多,也可以称为约束

  • 定义特征

    pub trait Summary {
        fn summarize(&self) -> String; // 没有是实现
        fn summarize(&self) -> String { // 默认实现
            String::from("(Read more...)")
        }
    }
  • 实现特征

    impl Summary for Post {
        fn summarize(&self) -> String {
            format!("文章{}, 作者是{}", self.title, self.author)
        }
    }
  • 使用特征作为函数的参数 fn notify(item: &impl Summary){}

  • 特征约束 fn notify<T: Summary>(item: &T) {}

  • 多重约束

    • fn notify(item: &(impl Summary + Display)){}

    • fn notify<T: Summary + Display>(item: &T) {}

  • where 写法的特征约束

    fn some_function<T, U>(t: &T, u: &U) -> i32
        where T: Display + Clone,
              U: Clone + Debug
    {
  • #[derive(Debug,PartialEq)] 编译器自动实现 Debug 和 PartialEq 特征

  • Display 特征相当于 ToString

  • 分发

    • 泛型是在编译期完成处理的:编译器会为每一个泛型参数对应的具体类型生成一份代码,这种方式是静态分发(static dispatch)

    • 动态分发(dynamic dispatch),在这种情况下,直到运行时,才能确定需要调用什么方法。之前代码中的关键字 dyn 正是在强调这一“动态”的特点。

  • 关联类型 Type item = u32;

  • 当使用泛型类型参数时,可以为其指定一个默认的具体类型

    trait Add<RHS=Self> {
        type Output;
    
        fn add(self, rhs: RHS) -> Self::Output;
    }

生命周期

借用检查

{
    let x = 5;            // ----------+-- 'b
                          //           |
    let r = &x;           // --+-- 'a  |
                          //   |       |
    println!("r: {}", r); //   |       |
                          // --+       |
}                         // ----------+
  • 被依赖的变量 x 的生命周期 'b 应当包含依赖他的变量 r 的生命周期 'a

  • 生命周期标注只是用来帮助编译器理解代码消除二义性,不会对程序实际作用产生影响

    • 不需要标注生命周期的引用变量是因为其没有二义性,所以自动隐式标注

  • 生命周期标注等于实际上存在较小的那个生命周期

  • 方法形参在栈上分配了数据,本来应当在方法括号内结束后释放,如果进行生命周期标注,他的施放时间将会改变成和标注的时间一致

  • 函数的返回值如果是一个引用类型,那么它的生命周期只会来源于:

    • 函数参数的生命周期

    • 函数体中某个新建引用的生命周期

  • 编译器使用三条消除规则来确定哪些场景不需要显式地去标注生命周期。

    • 每一个引用参数都会获得独自的生命周期

    • 若只有一个输入生命周期(函数参数中只有一个引用类型),那么该生命周期会被赋给所有的输出生命周期

    • 若存在多个输入生命周期,且其中一个是 &self 或 &mut self,则 &self 的生命周期被赋给所有的输出生命周期

闭包

|param1, param2,...| {
    语句1;
    语句2;
    返回表达式
}
1655781602549
1655781602549
1655781643321

使用 ,它会拿走表达式的所有权,然后打印出相应的文件名、行号等 debug 信息,最终还会把表达式值的所有权返回!

1655781657331

todo

rust course
dbg! 宏
2.8.4. 进一步深入特征