Rust 学习资源
<p>博主发现咸鱼咸鱼着居然到 2022 年了,忽然良心不安,因此先从这篇比较水的资源总结开始吧!</p> <p>这篇文章主要是总结下学 Rust 参考过的资料,会随着博主对 Rust 的关注随缘更新。</p>
<p>博主发现咸鱼咸鱼着居然到 2022 年了,忽然良心不安,因此先从这篇比较水的资源总结开始吧!</p> <p>这篇文章主要是总结下学 Rust 参考过的资料,会随着博主对 Rust 的关注随缘更新。</p>
<p>学 Rust 十来天了,自己被这个语言惊艳到,就跟着教程 <a href="https://raytracing.github.io/books/RayTracingInOneWeekend.html">Ray Tracing in One Weekend</a> 写了个很简陋的光线追踪示例练习,项目在 <a href="https://github.com/Latias94/rust_raytracing">Latias94/rust_raytracing</a>。</p> <p>学这门语言的时候,感觉就是上手容易遇到很多新概念,容易学不下去,跟编译器作斗争…不过作为一个还很新的系统编程语言,工具链如文章、包管理、格式化、编译器等很完善,官方教程很棒,社区也很活跃。</p> <p>学 Rust 的契机其实是在 V2EX 上看到有人在纠结学 Go 还是 Rust,底下的帖子也有不少夸 Rust 语言的,因此自己也开始关注 Rust 语言。后来发现 Rust 的用武之地非常广,Github 上还能找到不少 Rust 做的游戏引擎,其中一部分主打 ECS 功能,例如:<a href="https://github.com/bevyengine/bevy">bevyengine/bevy</a> 、<a href="https://github.com/Ralith/hecs">Ralith/hecs</a> 等。</p> <p>学习 Rust 语言,其实也是在了解一个现代化的语言该有的样子,了解 C++ 或其他语言部分设计上的不足,以及 Rust 是打算如何从根源解决这些问题的。这部分我作为一个初学者,不打算展开讲。大家有空可以了解一下 Rust 语言,看看官方的教程<a href="https://kaisery.github.io/trpl-zh-cn/title-page.html">《Rust 程序设计语言》</a>。</p> <p>总而言之,我觉得光线追踪的教程可以作为学一门新语言后<strong>严肃学习</strong>的项目,做完成就感也满满!</p>
<p>前不久十分厌学,想着是不是学废了,就想找到其他的东西学学,于是有一天周日尝试了同时入门 Blender 和 像素画。</p> <p>建模其实和 Unity 用初始模型搭积木差不多,入门也还好。但是自己从小就是对美术绝缘,只有初中的时候会和其他同龄人一样照着漫画书瞎画。后来就直到现在,因此开始画像素画的时候还是十分不适应,感觉每一个点都是为无用艺术界添砖加瓦。</p> <p>后来决定画像素画的契机是听<a href="https://gulugulufm.github.io/podcasts/2/">播客</a>介绍到一个码农姐姐为了做游戏<a href="https://www.douban.com/note/773573673/">坚持 100 天画像素画</a>,于是少年那颗不知天高地厚的心怦然地燃烧起来。</p> <p>教练!我想学画画!</p>
<p>做游戏的时候,我们经常要面对各种优化问题。DOTS 技术栈的出现提供了一种 CPU 端的多线程方案,那么我们是否也能将一些计算转到 GPU 上面,从而平衡好对 CPU 和 GPU 的使用呢?对我而言,以前使用 GPU 无非是通过写 vert/frag shader、做好渲染相关的设置等操作,但实际上我们还能使用 GPU 的计算能力来帮我们解决问题。Compute Shader 就是我们跟 GPU 请求计算的一种手段。</p> <p>本文将从并行架构开始,依次讲解一个最简单的 Compute Shader的编写、线程与线程组的概念、GPU 结构和其计算流水线,并讲解一个鸟群 Flocking 的实例,最后介绍 Compute Shader 的应用。全文较长,读者可以通过目录挑想看的看。</p> <p>Compute Shader 也和传统着色器的写法十分不一样,写传统 Shader 写怕了的同学请放心~</p>
<p>我认为博客应该放一些经过思考的、实践的、适合读者阅读的文章,自己有时候也会在看其他视频教程或文章时记一些笔记。有些笔记本身不太适合分享出来,因为做笔记不可避免的会按照自己的思路和现有知识来定制,可能和别人注意重点不太一样。</p> <p>因此我打算将一些比较成文的、有结构性的、有参考价值的笔记分享出来,这也能锻炼我把笔记组织成文的能力。</p> <p>这些公开的笔记我放在独立的一个 Notion 页面中,这个页面可以点击博客上方的<strong>公开笔记</strong>,或者这个链接找到:<a href="https://www.notion.so/frankorz/e9a64743c07743f08605f5df7cb57eaf">公开笔记</a>。</p> <p>Notion 本身对公式、排版都比较友好,但是打开可能要科学上网,我是懒得把这些文章往博客搬了…不过用 Notion 有个好处就是,我对公开笔记的编辑都能实时更新到。</p>
<p>注意:由于这个博客主题对 MathJax 支持不好,部分推导转用图片代替,或者可以移步我的 Notion 笔记:<a href="https://www.notion.so/frankorz/ce300124a4444c2cacc90a5ea0a5a19b">Transformation</a>。</p> <p>本文是 Games101-现代计算机图形学入门 第三和第四节课的笔记,文中对二维变换、三维变换、视图变换、正交投影和透视投影做了推导,相关视频在下方。</p> <p><a href="https://www.bilibili.com/video/BV1X7411F744?p=3">GAMES101-Lecture03 Transformation</a></p> <p><a href="https://www.bilibili.com/video/BV1X7411F744?p=4">GAMES101-Lecture04 Transformation Cont.</a></p> <p>本文同时参考了《Unity Shader 入门精要》的第四章,作者公开了第四章的 PDF,可以在下面下载到。</p> <p><a href="https://github.com/candycat1992/Unity_Shaders_Book#%E7%AC%AC%E5%9B%9B%E7%AB%A0%E5%8B%98%E8%AF%AF">candycat1992/Unity_Shaders_Book</a></p> <p>闫老师的推导十分简洁易懂,我也尽量把过程补充到文章中,读者看了我相信肯定也能跟着思路把变换公式推导出来。</p> <p>在读本文的过程中,也推荐参考上面提到的视频和 pdf 互相参考,本文是视频中推导的详细笔记,冯乐乐的 pdf 中虽然没有投影变换的推导,但是在很多地方都把理论讲的十分清晰,例如必要的数学基础和各种图形学概念的讲解。</p>
<p>最近一直在思考自己在技术学习上是否过于低效的问题。出现这个问题的缘由是,自己工作下班之后没多少精力和时间去留给自己学习。本来就有限的时间,如果还没有合适的学习计划,而是一昧凭兴趣去学一些离自己目标方向比较远的东西,可能会事倍功半。</p> <p>就我而言,自己目前的水平更像是“磨”出来的,东学学西学学,什么都有点印象,但是专业方向的知识之间的连接却非常离散。读研的时候有大量时间给我“磨”,总归能学会点什么,但工作则不一样。</p>
<p>首先,感谢所有将自己时间贡献在知识分享的人们。</p> <p>本文将简单地介绍下最近我看到的想学的、有意思的教程、视频等,内容不仅限于游戏开发。大家可以做个参考,说不定其中就能找到适合自己的教程,进一步打算接下来的学习。</p> <p>这个文章类型和之前写的都不一样,一方面有自己时间少、沉淀不够、不能持续输出的原因,另一方面是因为这些东西都比较碎,也不好在记录生活的微博上发布一些专业的东西。至于这个导读会不会成为一个系列来更新,还要看看我有没有足够东西来分享啦。</p>
<p>这本书仍然是入门 C# 最好的一本书。</p> <p>这本书新版出来的时候我十分关注,于是英子姐送了一本给我,本文也是答应英子姐所写的一篇文章。她一开始还问我“你现在还需要看这本入门书吗?”,我认为是的。工作了遇到了不少问题,大都跟自己基础不牢有关系。</p> <p>这本书以图形为载体,生动地介绍了 C# 语言本身。其中图形对我们了解 C# 语法在内存中的本质十分有帮助,异步、异常等章节中的处理流程图也很清晰明了,这也是我看重的一点。</p> <p>本文会从本书出发,简单讲讲代码优化的一些点。</p>
<p>今年发生了很多事情,博客也因此从七月停更到了现在,实在惭愧…现在趁着年终,赶紧抓住 2019 年的尾巴了,来总结下我的这一年。</p> <p>本文真的会很啰嗦,但是希望能帮到希望用 Unity 恰饭或者其他技术恰饭的同学。</p>
<p>虽然网络上已经有不少 ECS 文档的汉化,但自己读官方文档的时候也会产生不少疑问,为此通过查询各种资料,写下本文。</p> <p>本文从 ECS 官方文档出发,加之内存布局结构的讲解,力求读者能够和博主一起吃透 ECS 中的基本概念。同时建议读者可以先读读我的上一篇博文<a href="http://frankorz.com/2019/05/07/simple-talk-unity-dots/#Entity-Component-System">《Unity DOTS 走马观花》</a>的 ECS 部分,本文不再复述前文已经提到过的相关概念。</p> <h1>ECS 与 Job System</h1> <p>我认为有必要重申其两者的关系。</p> <ul> <li>Job System 能帮我们方便地写出线程安全的多线程代码,其中每个任务单元称为 Job。</li> <li>ECS,又称实体组件系统。与传统的面向对象编程相比,ECS 是一种基于数据设计的编程模式。<a href="http://frankorz.com/2019/05/07/simple-talk-unity-dots/#Entity-Component-System">前文</a>从内存结构分析了 OOP 模式的缺点,也提到了 ECS 是怎么样基于数据的设计内存结构的。</li> </ul> <p>Job System 是 Unity 自带的库,而要使用 ECS 我们需要从 Package Manager 中安装 “Entities” 预览包。这两者虽说完全是两种东西,但是他们能很好地相辅相成:ECS 保证数据线性地排列在内存中,这样通过更高效的数据读取,能有效提升 Job 的执行速度,同时也给了 Burst 编译器更多优化的机会。</p>
<p><img src="http://img.frankorz.com/5cd168d7974ba.png" alt="The Big Picture"></p> <p>简单介绍 Data-Oriented Technology Stack (DOTS, 数据导向型技术栈) ,其包含了 C# Job System、the Entity Component System (ECS) 和 Burst。</p>
<h2 id="介绍">介绍</h2> <p><a href="https://github.com/UnityTech/UIWidgets/">UIWidgets</a> 是 Unity 的一个插件包,是一个从 Google 的移动 UI 框架 Flutter 演变过来的 UI 框架。</p> <p>相对于原生开发的高开发成本(不同平台都需要不同的一套代码),Flutter、React-Native 等这种跨平台 UI 框架应运而生。</p> <p>Flutter 自 2018 年 3 月发布以来,社区不断壮大。由于 Flutter 自身设计理念的出色,Unity 中国已经着手将其移植过来。当然了,也因为这两个东西都非常的年轻,因此开发的时候都像开荒一样。</p>
<p><strong>2020 年 2 月 11 日更新另外一种方法</strong></p> <p>今天一不小心发现 <a href="https://kodi.tv/">Kodi</a> 这个播放神器居然还有 iPad 版!</p> <p>但是苹果 App Store 不允许 Kodi 应用商家,于是自己在网上找了些方法:</p> <ol> <li>越狱(手动再见)</li> <li>下载官方提供的安装包用 Xcode 打包进去(太麻烦)</li> <li>国内同步助手等提供的“VIP 服务”,购买服务后,用它们提供企业证书来下载(吃相难看)</li> <li>…</li> </ol>
<h2 id="ET-框架简介">ET 框架简介</h2> <p>正所谓时势造英雄,在 Web 开发领域或者传统软件开发领域中,人们把经过千锤百炼的代码总结出一套开发框架,从而提高开发效率,让开发者能更专注于业务本身。对于游戏领域而言,不同游戏需求的东西也不一样:有的游戏对性能有着苛刻要求,有的游戏需要快速地迭代出来,有的游戏需要联网热更新等等。因此不同的游戏框架应运而生。</p> <p>例如:</p> <ul> <li><a href="https://github.com/EllanJiang/GameFramework">Game Framework</a> 是一个基于 Unity 引擎的游戏框架,主要对游戏开发过程中常用模块进行了封装,很大程度地规范开发过程、加快开发速度并保证产品质量。</li> <li><a href="https://github.com/liangxiegame/QFramework">QFramework</a> 一套渐进式的快速开发框架。框架内部积累了多个项目的在各个技术方向的解决方案。</li> <li><a href="https://github.com/sschmid/Entitas-CSharp">Entitas</a> 一套基于 C# 和 Unity 的实体组件系统。</li> <li><a href="https://github.com/Unity-Technologies/EntityComponentSystemSamples">Entities</a> Unity 官方的实体组件系统实现,不过还是 Beta 版本,详细介绍可以查看<a href="https://unity.com/unity/features/job-system-ECS">官网</a>。</li> <li><a href="https://github.com/strangeioc/strangeioc">StrangeIoC</a> 一套基于 C# 和 Unity 的控制反转 (Inversion-of-Control) 框架。</li> </ul> <p>今天介绍的是 ET 框架。</p> <blockquote> <p>ET是一个开源的游戏客户端(基于unity3d)服务端双端框架,服务端是使用C# .net core开发的分布式游戏服务端,其特点是开发效率高,性能强,双端共享逻辑代码,客户端服务端热更机制完善,同时支持可靠udp tcp websocket协议,支持服务端3D recast寻路等等</p> </blockquote> <p>ET 框架能让我们只用 C# 就能搞定前后端,热更新方面也采用了基于 C# 的 IL 运行时——<a href="https://ourpalm.github.io/ILRuntime/">ILRuntime</a>, 贯彻了 “珍爱生命,远离 Lua” 这句话。目前自己接触的大多是客户端部分,因此服务器方面不做介绍。</p>
<p>最近在阅读《游戏人工智能编程案例精粹(修订版)》,本文是书中第二章的一篇笔记。</p> <p>有限状态机(英语:Finite-state machine, 缩写:FSM),是一个被数学家用来解决问题的严格形式化的设备,在游戏业中也常见有限状态机的身影。</p> <p>对于游戏程序员来说,可以用下面这个定义来了解:</p> <blockquote> <p>一个有限状态机是一个设备(device),或是一个设备模型(a model of a device)。具有有限数量的状态,它可以在任何给定的时间根据输入进行操作,是的从一个状态变换到另一个状态,或者是促使一个输出或者一种行为的发生。一个有限状态机在任何瞬间只能处在一种状态。<br> ——《游戏人工智能编程案例精粹(修订版)》 Mat Buckland</p> </blockquote> <p>有限状态机就是要把一个对象的行为分解成易于处理的“块”或者状态。拿某个开关来说,我们可以把它分成两个状态:开或关。其中开开关这个操作,就是一次<strong>状态转移</strong>,使开关的状态从“关”变换到“开”,反之亦然。</p>
<p>继<a href="https://frankorz.com/2018/04/13/first-board-game/">《我设计的第一个桌游》</a>后,这次带来的是电子游戏的作业—— 2D像素平台游戏 Aretha’s Journey。</p> <h2 id="游戏背景">游戏背景</h2> <p>来自潘达尼亚的女孩 Aretha 已经离乡别井几年了,回乡之际,发现族人们都被神所诅咒而变成了石头,原因是他们的族人曾尝试反抗神。于是 Aretha 便踏上拯救家园之路…</p>
<p>很久没写文章了,这次带来的是游戏设计课中的桌游大作业。</p> <p>小组成员在第一节课就随机分好了,我们一开始选择每人准备一个桌游原型,然后共同选择一个原型来深入设计,最后一起选择了我的设计原型。</p>
<p>最近开始接触寻路算法,对此不太了解的话建议读者先看这篇文章<a href="http://www.gameres.com/777251.html">《如何快速找到最优路线?深入理解游戏中寻路算法》</a> 。</p> <blockquote> <p>所有寻路算法都需要一种方法以数学的方式估算某个节点是否应该被选择。大多数游戏都会使用<strong>启发式</strong>(heuristic) ,以 h(x) 表示,就是估算从某个位置到目标位置的开销。理想情况下,启发式结果越接近真实越好。</p> <p>——《游戏编程算法与技巧》</p> </blockquote> <p>今天主要说的是贪婪最佳优先搜索(Greedy Best-First Search),贪心算法的含义是:求解问题时,总是做出在当前来说最好的选择。通俗点说就是,这是一个“短视”的算法。</p>
<p><strong>2020年7月26日更新:</strong><br> 最近对变换重新学习整理了,文章在:<a href="http://frankorz.com/2020/07/26/transformation/">图形学常见的变换推导</a>。</p> <p>上一篇笔记<a href="http://frankorz.com/2017/09/22/basic-of-vector-and-matrix-transformation/">3D 数学基础-向量运算基础和矩阵变换</a>记录了一些向量和矩阵运算的基础,和一些矩阵基本的变换。这篇笔记主要介绍了平移变换、齐次坐标、平移和旋转变换的组合、法线变换和改变坐标系。</p>