粉丝194获赞1330


你现在看到的是该课程里面的案例, 整个靴的课程的设计思路是从连连看开始讲起,慢慢过渡到手写靴的。为了降低整个门槛,让第一次接触靴的同学更容易上手,前面的五个案例我们都是先用连连看进行实现,然后再分析连连看生成的代码并修, 让大家慢慢熟悉靴的代码。完成过度后,我们开始正式从零所写靴的。通过下面的几个案例,假设靴的中常用的二技巧,认真学完后,你就可以自己实现挺多的靴的效果。比如说这个插件的简化版。 当然,为了适配当前的运动品版本,我们会在课程的最后将如何将自己的靴子移植到不同的炫耀管线里面去,比如说 urp, 让大家的学习成果能够用到自己的相机方面去。 目前课程的折扣力度非常大,少喝几杯奶茶,你就可以点亮薛的这颗炫酷的技能术,还能减肥!

很多同学期待着 red shift 基础教程,今天他来了这里,从基础设置以及灯光各种基础常用材质我都有详细的讲解,比如光泽三 s 镜面金属色散玻璃混合材质等等。这个长达四十分钟的教程已经给你准备好,另外还有四 d 的基础入门教程,这套基础入门教程大家可以免费学习, 里面的内容是非常多,比如 oc 烟火、多重布料以及柔体,这里使用的都是私立最新版本,这些工程都准备好了,并且还有高版本的建模技巧以及骨骼创建、关节绑定,刷权重,还有各类插件教程,甚至各类的素材资源都给你准备好了,想要的扣六给你安排。

今天教大家如何加 mode 材质包以及光影,先打开我的世界文件夹,打开点 mancraft 文件夹,然后打开 mods 文件夹,把帽子放进去就行了。 然后再说一下材质包怎么加,返回 mancraft 文件加,打开 resource x 文件加,然后把材质包丢进去就可以啦。然后再说一下光影怎么加, 再返回 mancraft 文件夹,然后打开 shiter pax 文件夹,把光影丢进去就行了。这样子就完成了,我们可以愉快的玩游戏了。

同样的 shader, 为什么在他的机器上性能高,在我的机器上性能就低呢?这可能和 g p u 有关。作为 g p u 编程 shader, 我们写了好多次,那你知道 shader 在 g p u 上是如何执行的吗? g p u 全称 graphic processing unit 图形处理器,顾名思义,它就是专门用来处理图形的 cpu 常常会拿来和 cpu 做对比。有一个比较广泛的理解是把 cpu 比喻成一名博士,他可以解决复杂的难题。而 cpu 相当于是一群小学生,他们只能做简单的运算,诞生在人多。而图形渲染就是处理大量简单的运算。 我是孙强,但也需要一道题一道题的去解决,而一群小学生就可以马上完成。所以 cpu 比较适合处理单独的复杂的工作,而 gpu 更适合图形渲染这种大规模的简单运算。这是一个 gpu 和 cpu 的简略图,它们组成类似,都包括核心走线和内存。 gpu 的内 内存也叫显存,主要用来存储图形数据,比如渲染时用到的顶点信息、文理信息和缓冲区内容。内存和核心距离比较远,他们之间用总线连接,当核心要访问内存时,就要经过总线,总线有带宽限制,带宽是单位时间内传输的数据量, 就像一条马路,路越宽,能同时通过的车辆越多,开车也就越快。但带宽是有限的, gpu 访问内存时就会受到限制,尤其是在处理大规模数据时,传输速度就会变慢。而核心中有缓存单元,缓存的速度比内存快很多,他可以存储最近被访问的数据。 比如在文理采样式,我们要用到一个 uv 对应的像素,那么会取他周围的九个像素来放入缓存中。缓存的这种高速度可以大大减少核心对内存的访问次数,也就让渲染更加高效。可以看到 gpu 核心和 cpu 核心的组成也是类 类似的,包括缓存单元、计算单元和控制单元。缓存单元用来存储数据,计算单元用来执行运算,控制单元用来指挥协调。由于要处理大量的图形数据, cpu 比 cpu 有更多的缓存单元、控制单元,尤其是更多的计算单元。 计算单元常常听到的名称叫流处理器 sp, 而 vdr 中叫做酷道核心。在图形渲染中,会涉及到大量的顶点运算、像素计算、纹理采样这些操作,这些任务之间是相互独立的,可以同时进行。 gpu 就是通过计算单元来进行计算,快速进行图像的渲染。 如果你是选购显卡,你可能会关注到这些数据,如果再深入研究,你会看到这些参数,嗯,似乎有一点复杂,这些参数中哪些又和 shit 的执行有关呢?我们先回顾一下渲染管线。渲染管线一般可以分为顶点处理、三角形处理、光商化、 片面处理和遮缓冲区操作五个部分。顶点处理的任务是把模型的顶点信息从绑定空间转换到屏幕空间,然后在三角形处理阶段,顶点会组装成线段或者三角形,组成基本的图形。接着在光上化阶段会生成像素。 在然后的片缘处理阶段,像素会进行着色,直到最后一个阶段生成的像素会经过一系列的测试以及混合处理输出,生成最终渲染的图像。 有些人管线,不熟悉的朋友可以看我之前的视频。由于顶点处理阶段的任务是把顶点从本地空间转换到屏幕空间,他就涉及到了大量的矩阵运算。 这个部分主要就是由 shader processor 来完成,它位于计算单元,在这里负责处理和转换消费场景中的顶点坐标,执行顶点变换法线变换等等操作。三角形处理阶段由 preventive assembler 完成,它的主要任务是把顶点组装成图形, 比如线段和三角形。光商化阶段由 rest rider 来进行,他要生成像素,包括确定图圆覆盖了屏幕上的哪些位置,以及哪些像素会受到图圆的影响。下一个阶段进行像素着色,这一阶段需要 shared processor 和 texture mapping unit 两个部分的执行。 学着 process 会处理屏幕上每个像素的颜色和光照。计算 t m u 的主要生物是处理纹理映射,他接收到纹理坐标后,从纹理内存中获取到对应的纹理数据。 t m u 还会处理和纹理相关的其他操作,比如纹理过滤、纹理巡止、 meet map 等等。 arrestor operation process 负责执行确认管线的最后一步操作,包括模板测试、山度测试、颜色混合和像素写入。它的作用是保证屏幕上显示的图形是按正确的绘制顺序和颜色混合方式来呈现的。这些模块不同的厂商,不同的 gpu 架构, 女生可能有所不同,但基本功能都是相似的,比如 rtx、 四零九零和三零九零肽、二零八零肽比起来,他就有更多的扩大核心、纹理单元以及 rop 扩大核心越多, gpu 的变形计算能力就越强,就能够同时处理更多的任务和数据。纹理单元越多,纹理采用的速度就越快, 更多的 r o p 也可以加速三度测试、模板测试以及像素的最终输出,一切都是为了渲染效率,这是很 video 的。 a 的 loveless g p u 架构,它有一万八千四百三十二个裤带,核心五百七十六个纹理单元 a d 幺零二 g p u 由十二个图形处理集群 g p c 组成。 我们放大一个 gpc, 这里就是 rop, 负责像素的输出合并阶段,一个 gpc 里面包含了十二个流失多处理器 sm, 放大看一个 sm, 这些就是扩大核心,在渲染中执行海量的数据运算。 下面是纹理单元,在 fs 阶段负责纹理映射,这就是 gpu 如何把场景模型绘制到屏幕上。而同样的 shader 在不同的机器上拼文表现不同,可能的原因有很多,可能和缓存有关,更大更高效的缓存可以提高歇着的内存访问效率。 可能和带宽有关,因为带宽决定了从内存读写数据的速度。当场景模型比较复杂的时候,还有可能是 t m u 和 r o p 分布不均导致的。 除了这些,影响系统性能的原因还有很多方面,比如 a 卡、 n 卡、高通卡这些不同厂商的 gpu 架构和设计不同,他们的性能也有所差异。电脑卡和手机卡也不一样,核险、极险、独险也不一样, tpu 架构中的 imrtprtpdr 也不一样,也会造成性能差异。所以在产生性能问题的时候,可能是多方面原因造成的,一定要多分析分析。好了,今天给大家做了一个简单的科普,希望对大家有所帮助。那今天的视频就到这里,我是玉兔,我们下期再见。

啊,这一集我们来讲一下 viewmodel, 那么 viewmodel 呢,是属于 android jetpack 这个库里面的一个类。 android jetpack 呢是一套比较新的一个库,他呢最早呢是在二零幺八年 google io 大会上发布的,我们从那个呃 android 开发者的这个首页上看,这个 jetpack 呢,是在这个一级目录上, 那我们也可以看到他的这个地位是比较高的啊,在这个一级目录下,那我们点开来看一下, 好,这个 jetpack 他的 一个 logo 呢,是一个看到没有,一个安卓的机器人背上了一个火箭,一飞冲天。 那么这个寓意呢?我们看一下 google 对这个 jetpack 的描述呢,是这样的,他呢帮助我们的开发者更加高效快速的开发出优质的代码,减少代码的重复性, 能够呢将复杂的任务模块化,让我们的开发者呢更加专注于应用的本身。 那么同时呢,这个 jetpack 他又称为 android x, 这个酷, 他呢是独立于 android 的底层 api 的,所以呢他更加灵活,维护跟更新的速度呢,也会比 android 本身要更快。那么现在呢,一般我们普遍呢认为这个 jetpack 这个酷呢,就是 google 官方引导下的我们安卓的开发的未来的一个指引跟方向。所以对于现在学习安卓的开发的人来讲呢,我们一定要比较重点留意这个这一套东西啊,关心他啊,学习他, 那么这一套东西本身也是个比较庞大的一个库,它分为四个模块,第一个是称为 foundation, 第二个是 architecture, 第三个 behavior, 第四个 ui, 那我们今天说到的这个 view model 就是属于这个 architecture 这个模块里面的一个 类啊,在这里 view model, 那么顾名思义呢, model 在我们的程序设计的框架中,就是一个对数据的一个模型吧,那么顾名思义,我们 viewmodel 它的作用呢,就是将我们 view 中 的 view 就是我们的界面,将 view 中的数据给它,模块给它独立出来,对它进行单独的管理,那么从而呢使得我们的控制器就是我们的 activity 或者是那个 fragment, 这两个呢是称为我们的控制器 变得更加简单,他们只需要呢专注于控制界面的逻辑本身以及响应用户的操作就可以了,而不需要去管理界面上的复杂的数据,这对于当我们的界面比较复杂的时候呢,这种分离跟抽象呢,其实是非常有用的。 此外 view model 呢还有个特性,它呢是负责管理一个屏幕上的数据,当我们的 activity be destroyed 或者重新 created 的时候呢,数据呢不会丢失啊,像我们上一集讲的,当系统发生这个 叫做 configuration change 的时候,比如我们切换系统的语言或者屏幕旋转的时候,如果是采用 viewmodel 来管理的数据呢,它是不会丢失的, 那我们呢也就意味着我们不需要采用上一集的那种方式去手动的去存储,然后呢去读取这个数据啊,会非常方便。那么最后一点呢,就是我们的这个 vivo model 还可以跟这个 这里有另另外一个类叫做 life data, 这两者的配合呢将会实现一个非常有用的功能,就是对数据的监听,所谓 life 就是一个活活的数据吗? 那么对数据的监听呢,就是当我们的数据本身发生变化的时候,我们的就可以呢通过这个监听来使得我们界面的内容呢会自动的得到刷新, 这会非常方便。另外呢他配合这个 room room 这个类呢,是一个用于处理这个 sq light 这个数据库的一个中间键啊,那么就可以呢来负责我们数据的存储啊,所以呢这一块内容呢是非常有用的啊。 好,那么以上呢就是关于这个 viewmodel 的一个简锐的介绍,接着呢我们通过一个简单的例子来体会一下这个 viewmodel。 好,我们创建一个例子,在这个例子呢,我们把它叫做 view model 啊,第一个 test, 由于我们这个要需要 jetpack 这个类,所以我们这里把这个勾上, use android x 啊,这 这个库把它勾上。好,那么我们这个例子是做一个什么呢?做一个非常简单的在我们的界面上呢放置一个标签,然后呢再放置两个按键, 这两个按键呢,我们按下去的时候呢,他就会对我们的这个标签上显示的数字呢进行耒加,其中一个按键呢是加一,另外一个按键加二啊,我们这个功能非常简单,我们把这个界面稍微调整一下, 把它放到上面一点,然后这两个按键呢也给他连一下啊, 好让他稀疏一点。那么同时呢,我们处理一下这里的这些名称啊,第一个给他一个名称,这个白柳叫做 welcome 啊,其实不设都没关系吧。好,这个按键,这个叫把疼一,我的内容呢是叫做加一下一个把疼二, 我内容呢,他显示加二。好,那么这样的告诉用户,我按下这个键是加一,按下这个键是加二啊,然后我来创建一个这个 叫做 viewmodel 啊,我们点这里,点中我们这个包的名称啊,右键 new java class。 这个呢,我把它叫做 my viewmodel 啊,我们 java 的对类的命名呢,一般采用这种叫做开幕 case, 每一个单词的第一个字母呢,大写 好,它的继承于这个 super class 呢,就是我的这个 view view model 啊,这个不要选错,就是这个。 那么由于我们这个例子非常简单,我们呢以最简单的形式出现。我们这个 vivo mode 呢,只管理一个数啊,把它声明为帕布力克, 类型是 inter 整数。这我把它叫做 number 啊,给它初始化为零。好,我只管这个数啊, 把它声明为 public。 之后呢,我这个 satagat 呢,都不用写了啊,直接可以对这个玉兰来进行操作。 好,然后我们回到这个家吧这个文件中。那我们这里呢,就需要呢定义一个这个 view model 的对象,它的类型是 my viewmodel 这个对象,我把它叫做 my viewmodel, 这个叫做 view model providers。 我点按下这个类啊,现在他不认识,是红色的吗?我点这里的 啊,他这里没有出现这个酷的啊,建议啊,那我这里手动添加一下吧。啊,需要添加一个酷的知识,就是 in pot android x 点 life cycle life cycle, 点 view model providers 啊,这个酷, 那么这个库你按了之后他还是红色的,你再再点一下要爱的 dependency。 好,我们需要这个 gradal 呢,给他们同步一下 啊,你按下这个,这里会显示这个 grade 重新同步,那么他会把这个库呢给他下载下来,加载到我们这个项目里面。好,有了这个之后,我们就可以写下面这个句子了啊,我让这个 my viewmodel 等于 viewmodel providers 啊,这里千万不要写错啊,因为有另外一个 view model provider 跟他很像啊,我们要用这个啊 providers 点 off this, 然后后面呢是点 get my view model 点 class, 这样呢就创建了一个 viewmodel 的对象。好,那么我们呢下面就可以使用它了啊,那么有了这个之后,我们剩下的变量呢,也要观念一下,有一个 text view, 这个叫 text view, 还有两个 button, button 一跟 button 二,然后呢我们这里呢 text view 等于发音的 view, 两个 button 的一样来写一下 好,完了之后呢,我们对这两 两个 button 的写两个事件, button e 点 setter unclick listen, 你有 view 点 unclick listener, 那么由于这个 button 一呢,就是对它加一嘛,所以就是 my view model 点 number 加加, 那么加完之后呢,我们还需要呢刷新我们的界面啊,那么就是我们的 text view 点 set text 啊, set text, 这里呢是需要翻一个 string, 那么我取回来的数据呢,是一个 int, 所以我需要要把它包装一下,用到这个 string 的一个静态方法, dream the value of my viewmodel 点盖点 number, 那么这样呢,就将我们的这个数字呢从 取回来,显示在我们的这个 text view 上面,同理处理第二个案件, button 二点 set on click listener 啊,操作类似,只不过这里呢是加等于二啊,他是加二,然后呢是 text of you 点,这句话一模一样。 好了,那我们呢就写完了啊,我们来运行一下, 好,运行一下,我们看到这里进来,我加一加二,那么这个操作呢?是正常的啊, 然后我翻转一下屏幕啊,大家注意到我这里并没有写那个 safe, 没有利用这个我们上一集讲的这个方式来存储,那么当我的屏幕翻转的时候呢?我们看看, 嗯,他又丢失了,这个丢失的原因呢?其实并没有丢失,是因为我们这里漏了一句话啊,就是当我们的这个 uncreate 初始的时候啊,再写一句话,就是在这里啊,我们 text view 点 set text, 那么 string 点 value of my, 重新创建的时候,我也需要呢,是吧?取回这个数显示在上面啊,重新来一下啊,这下就没问题了, 我先把它还原 number, 这下就没问题了啊,我按下这个数字,他会做加二加一,好翻转,那你会看到这个数字还在啊,还在, 那不仅这个翻转还在了,我们可以比如说换一个系统语言, 调一个系统语言,那调一个系统语言呢,也会将我们的这个 activity 呢给他 destroy 掉,并且呢重新创建,那我们发现即是指重情况下,我们这个东西呢还在 啊,现在语言已经切换过来了,我们看看界面都已经切换过来了,那我们看一下这个 real model, 这这个就是刚刚我们写的这个应用, 我们进去这个数还在十六,那么这个呢,就是我们使用这个 viewmodel 来管理这个数据的一个好处,我们不需要对它进行存储, 也不需要在这个地方用这个对象去取回,并且呢我们看到这个地方呢没有出现一个数据的变量,因为我们以前的写法在这个地方肯定要放一个 inter 类型的数,用来存放这个数吗? 那么这样呢模块化呢就不好了,我们这个这个 activity, 我们呢不用来管理数据,我们数据呢全部放在这个 view model 里面啊,这样呢我们的程序呢将会变得非常 模块化,当我们的界面如果很复杂的时候啊,你更加会发现这种好处,我们现在这里只有一个数据,一个变量,你可能还不一定 发现这个好处。那么这一节呢,我们就讲到这个地方了,那么在下一集中呢,我们会用一个稍微复杂一点的例子来将我们前面做过的内容呢,给他做一个综合的一个应用。今天先讲到这里。