Skip to content

Instantly share code, notes, and snippets.

@tiye
Created May 10, 2025 18:35
Show Gist options
  • Save tiye/7d614825dbd8d81300103ff48bce1ffa to your computer and use it in GitHub Desktop.
Save tiye/7d614825dbd8d81300103ff48bce1ffa to your computer and use it in GitHub Desktop.
1
00:00:00,833 --> 00:00:05,433
[音乐]
2
00:00:07,733 --> 00:00:12,100
[音乐]
3
00:00:12,733 --> 00:00:18,166
我只是想
4
00:00:30,166 --> 00:00:35,366
[音乐]
5
00:00:38,300 --> 00:00:41,400
[音乐]
6
00:00:42,133 --> 00:00:46,000
你好,React Native 开发人员。
7
00:00:46,033 --> 00:00:51,700
[音乐]
8
00:00:52,133 --> 00:00:54,600
希望你一切都好。 威廉在这里
9
00:00:54,633 --> 00:00:56,300
录制了来自美丽的瑞士 Z 的节目。
10
00:00:56,300 --> 00:00:58,666
我想向你们展示两件事情,让这个
11
00:01:00,366 --> 00:01:02,366
早晨变得非常有趣。 首先,我们对
12
00:01:02,366 --> 00:01:04,666
React Native WebGPU 进行了更新。 我们将
13
00:01:04,700 --> 00:01:07,166
深受喜爱的 Web 标准引入 React Native,
14
00:01:07,200 --> 00:01:09,266
并希望向您展示
15
00:01:09,266 --> 00:01:11,000
我们将其集成到 React
16
00:01:11,033 --> 00:01:13,033
Native 平台的引人注目的方式。 我们想向您展示
17
00:01:13,400 --> 00:01:18,366
可以在其基础上构建的一系列新的用户体验。 我们想向
18
00:01:18,400 --> 00:01:21,033
您展示业界朋友如何使用
19
00:01:21,033 --> 00:01:23,566
它将 Web 生态系统的巨头(
20
00:01:23,600 --> 00:01:26,533
例如 three.js)引入 React Native。
21
00:01:26,533 --> 00:01:28,933
最后,除了图形之外,我们还想向
22
00:01:28,933 --> 00:01:31,166
您展示如何使用 WebGPU 为
23
00:01:33,433 --> 00:01:36,866
React Native 解锁通用 GPU 计算。 但是对于 React
24
00:01:36,866 --> 00:01:38,766
Native 开发人员来说,
25
00:01:38,766 --> 00:01:41,166
我们涉足 WebGPU 只有一个原因,
26
00:01:41,200 --> 00:01:43,200
那就是 React Native Skia。
27
00:01:43,200 --> 00:01:44,400
这是我们
28
00:01:44,400 --> 00:01:46,533
今天上午想要向你们展示的第二件事。 我们想向
29
00:01:46,533 --> 00:01:49,966
您展示 WebGPU 如何激发
30
00:01:50,000 --> 00:01:51,733
React Native Skia 的一系列改进,
31
00:01:51,733 --> 00:01:54,766
使用户能够在新的规模
32
00:01:54,766 --> 00:01:57,166
和新的平台上运行 Skia,其中一些
33
00:01:57,200 --> 00:01:59,600
甚至没有屏幕。 我们想向
34
00:01:59,600 --> 00:02:01,733
您展示这些改进如何
35
00:02:01,733 --> 00:02:03,866
滚雪球般地迁移到 Skia
36
00:02:03,900 --> 00:02:06,133
Graphite,Skia Graphite 是 Skia 的一个新的后端,用于在
37
00:02:06,533 --> 00:02:11,266
WebGPU 上运行的现代 GPU API,我们想向您展示
38
00:02:11,666 --> 00:02:15,466
随之而来的一些范式转变思想。
39
00:02:15,500 --> 00:02:17,500
最终,我们的目标是为
40
00:02:17,500 --> 00:02:19,900
您提供一个
41
00:02:19,900 --> 00:02:22,766
与 Google Chrome 对称的图形堆栈,其上运行着 Web GPU 和 Skia
42
00:02:22,800 --> 00:02:25,200
Graphite,并且
43
00:02:25,200 --> 00:02:27,100
这两个原语可以很好地
44
00:02:27,100 --> 00:02:29,733
相互组合。 Shopify
45
00:02:29,733 --> 00:02:32,000
正是倡导这一目标
46
00:02:32,033 --> 00:02:34,633
。 你好,React Native 开发人员。
47
00:02:34,633 --> 00:02:36,533
我是科林·格雷,来自
48
00:02:36,533 --> 00:02:38,600
安大略省美丽的斯特拉特福德的家中。 感谢您的
49
00:02:38,633 --> 00:02:41,166
收看。当我们第一次开始使用
50
00:02:41,200 --> 00:02:43,433
React Native Skia 时,我们的目标是
51
00:02:43,433 --> 00:02:45,500
弥合 React Native 中图形 API 的一个重要差距
52
00:02:45,500 --> 00:02:47,566
。 我们取得了令人难以置信的
53
00:02:47,566 --> 00:02:49,866
进步,并将重点转移到
54
00:02:49,900 --> 00:02:52,533
性能和稳定性上。 这促使
55
00:02:52,533 --> 00:02:55,000
我们开发了 WebGPU,这是一个令人兴奋的
56
00:02:55,033 --> 00:02:57,500
2D 和 3D 图形新 Web 标准,
57
00:02:57,500 --> 00:02:59,833
已经被核心 Skia 库所采用
58
00:02:59,866 --> 00:03:02,300
。 我们对持续改进的追求为
59
00:03:02,466 --> 00:03:06,700
React Native 中的一流 3D 图形打开了大门
60
00:03:06,700 --> 00:03:09,233
。 我们已经释放了
61
00:03:09,266 --> 00:03:11,733
令人惊叹的 3D 体验的潜力,其中一些
62
00:03:11,733 --> 00:03:13,233
已由 Shopify 团队完美地实现
63
00:03:13,266 --> 00:03:16,133
。 我们的愿景是让
64
00:03:16,133 --> 00:03:18,266
这些 2D 和 3D 功能能够
65
00:03:18,300 --> 00:03:21,033
以零成本进行组合,就像在网络上一样
66
00:03:21,066 --> 00:03:23,400
。 这些公告始终是
67
00:03:23,433 --> 00:03:25,100
68
00:03:25,100 --> 00:03:26,933
向 React Native 社区表达衷心感谢的重要机会
69
00:03:26,933 --> 00:03:29,000
。 如果没有你们的大力支持,我们的进步就不可能
70
00:03:29,033 --> 00:03:31,033
实现
71
00:03:31,033 --> 00:03:34,633
。 您在代码贡献
72
00:03:34,633 --> 00:03:36,933
请求、深刻的讨论和
73
00:03:36,933 --> 00:03:38,600
勤奋的错误报告中所做的贡献非常
74
00:03:38,633 --> 00:03:41,433
宝贵。 因此,Shopify 的全体员工向
75
00:03:41,433 --> 00:03:42,933
你们表示感谢。 感谢那些
76
00:03:42,933 --> 00:03:45,566
让 React Native Skia 成为今天的样子的人。
77
00:03:45,566 --> 00:03:47,633
现在,事不宜迟,让我们看看
78
00:03:47,666 --> 00:03:49,733
使用 WebGPU 和 React Native Skia 可以创造什么新的体验
79
00:03:49,733 --> 00:03:52,433
。 回到
80
00:03:52,466 --> 00:03:55,500
你身边,威廉。 因此,WebGPU,我们将
81
00:03:55,500 --> 00:03:57,900
全新的、但已经深受喜爱的
82
00:03:57,900 --> 00:04:00,533
Web 标准引入 React Native。 从
83
00:04:00,533 --> 00:04:02,366
本质上讲,此 API 允许您执行两
84
00:04:02,400 --> 00:04:05,100
件事。 绘制和着色三角形
85
00:04:05,100 --> 00:04:07,366
以及运行通用 GPU
86
00:04:07,400 --> 00:04:09,833
计算。 当我们研究该
87
00:04:09,833 --> 00:04:12,466
模块时,我们考虑了两个设计目标。
88
00:04:12,466 --> 00:04:14,466
首先,我们希望确保
89
00:04:14,466 --> 00:04:16,200
API 完全相同,您
90
00:04:16,233 --> 00:04:19,033
可以简单地将示例从网络复制粘贴
91
00:04:19,033 --> 00:04:21,100
到 React Native 上。 这意味着
92
00:04:21,100 --> 00:04:23,000
拥有一个
93
00:04:23,033 --> 00:04:25,966
与 Web Canva API 完全对称的 Canva API。 我们
94
00:04:26,000 --> 00:04:27,666
希望与
95
00:04:27,666 --> 00:04:30,266
React Native 平台紧密集成,特别是与
96
00:04:30,266 --> 00:04:32,533
reanimated 紧密集成。 例如,我
97
00:04:32,533 --> 00:04:34,266
可以方便地在这里做的一件事是
98
00:04:34,300 --> 00:04:36,933
在 UI 线程上运行一个重新动画的示例,
99
00:04:36,933 --> 00:04:38,666
并且我可以使用手势处理程序
100
00:04:38,700 --> 00:04:41,866
用手指操纵立方体。 我
101
00:04:41,900 --> 00:04:44,200
可以完全阻止 UI 线程,但
102
00:04:44,233 --> 00:04:46,066
仍然以全帧速率与立方体交互
103
00:04:47,700 --> 00:04:50,433
。 并且 React Native WebGPU 还
104
00:04:50,466 --> 00:04:54,066
支持 Mac OS 和 Vision Pro OS。
105
00:04:54,066 --> 00:04:57,400
WebGPU 是一个非常令人愉快的 API。
106
00:04:57,433 --> 00:04:59,333
开发人员的体验与 WebGL 有很大不同
107
00:04:59,333 --> 00:05:02,433
。 WebGL 是一对一移植到 JavaScript 的 C API
108
00:05:02,466 --> 00:05:04,933
。 但是 WebGPU 是
109
00:05:04,933 --> 00:05:07,000
完全
110
00:05:07,033 --> 00:05:09,566
围绕现代 JavaScript 功能从头开始设计的。
111
00:05:09,600 --> 00:05:11,600
我们希望开发者社区能够以
112
00:05:11,866 --> 00:05:16,133
与 WebGL 完全不同的方式与这一新标准进行互动
113
00:05:16,133 --> 00:05:17,633
114
00:05:17,666 --> 00:05:20,933
现在,提到的软件工程师团队
115
00:05:20,933 --> 00:05:23,466
提出了一个问题,
116
00:05:23,500 --> 00:05:26,366
如果从头开始输入 API,它会是什么样子
117
00:05:26,400 --> 00:05:28,866
118
00:05:28,866 --> 00:05:32,466
软件公司的 Evo Plaza 将为我们解答这个问题。
119
00:05:32,466 --> 00:05:40,366
[音乐]
120
00:05:41,100 --> 00:05:43,400
介绍 typeGPU,一组类型安全的
121
00:05:43,433 --> 00:05:45,000
原语,用于弥合
122
00:05:45,033 --> 00:05:47,900
TypeScript 和 WebGPU 之间的差距。 我们的数据模式
123
00:05:47,900 --> 00:05:49,566
反映了 WGSL 语法,您可以使用
124
00:05:49,600 --> 00:05:51,733
它们在 JS 端创建类型缓冲区
125
00:05:51,733 --> 00:05:54,666
并生成匹配的着色器代码。
126
00:05:54,700 --> 00:05:57,166
您只需将 JS 对象和数组传递
127
00:05:57,166 --> 00:05:59,300
给 GPU,而不必担心
128
00:05:59,333 --> 00:06:01,633
它们如何以二进制表示。 并且
129
00:06:01,666 --> 00:06:03,100
不必担心必须重写
130
00:06:03,100 --> 00:06:05,166
整个应用程序。 我们在设计 API 时考虑到了
131
00:06:05,166 --> 00:06:06,666
渐进式采用,这意味着
132
00:06:06,700 --> 00:06:08,133
您可以选择要
133
00:06:08,133 --> 00:06:09,700
键入
134
00:06:09,733 --> 00:06:12,133
GPUi 的代码库部分。 为了测试这一点,我们挑选了
135
00:06:12,133 --> 00:06:14,533
一些开源项目并将
136
00:06:14,533 --> 00:06:17,000
GPU 类型集成到其中,而无需改变
137
00:06:17,033 --> 00:06:19,033
整体代码结构。 我们还从头开始了
138
00:06:19,033 --> 00:06:20,866
一些项目,例如
139
00:06:20,866 --> 00:06:23,400
wayfare 游戏引擎。 请查看
140
00:06:23,433 --> 00:06:26,466
typgu.com 上的 WebGPU 互操作性指南以了解
141
00:06:26,466 --> 00:06:29,166
更多详细信息。 哦,那些 JS 函数
142
00:06:29,166 --> 00:06:30,900
实际上是在 GPU 上运行的
143
00:06:30,933 --> 00:06:32,933
。 我们在 typeGPU.com 上已经有一些正在运行的演示,
144
00:06:32,933 --> 00:06:35,400
隐藏在
145
00:06:35,433 --> 00:06:37,566
实验性的开关下。 检查一下。 向
146
00:06:37,600 --> 00:06:39,666
我们提供反馈并帮助我们阅读
147
00:06:39,666 --> 00:06:42,666
稳定性。
148
00:06:46,000 --> 00:06:48,700
今天就尝试一下。
149
00:06:48,700 --> 00:06:51,233
谢谢。 Evo Evo 提到了一些
150
00:06:51,266 --> 00:06:53,900
有趣的事情。 首先,虽然 WebGPU
151
00:06:53,900 --> 00:06:56,433
是一个很棒的 AP​​I,但有些方面还是
152
00:06:56,466 --> 00:06:58,933
很底层的,比如统一咬合
153
00:06:58,933 --> 00:07:01,800
对齐和填充,而 GPU 类型
154
00:07:01,833 --> 00:07:03,666
确实可以帮到你。 与
155
00:07:03,666 --> 00:07:05,500
TypeScript 一样,您只能从
156
00:07:05,500 --> 00:07:07,866
几种类型开始,然后逐步将类型添加到
157
00:07:07,900 --> 00:07:09,233
您的系统中。 您不需要
158
00:07:09,266 --> 00:07:11,900
从头开始输入所有内容。 现在,我
159
00:07:11,900 --> 00:07:14,133
想向您介绍一个令
160
00:07:14,133 --> 00:07:16,033
我非常兴奋的 WebGPU 功能,因为它将
161
00:07:16,066 --> 00:07:18,366
成为今天上午的一个常见主题。
162
00:07:18,400 --> 00:07:20,300
这个主题就是运行
163
00:07:20,300 --> 00:07:23,500
函数接口的成本。 借助 WebGPU,我们可以运行速度
164
00:07:23,500 --> 00:07:26,200
极快的 GPU 计算。
165
00:07:26,233 --> 00:07:29,000
虽然 JavaScript 也非常快,但
166
00:07:29,033 --> 00:07:31,333
相对而言它实际上可能相当
167
00:07:31,333 --> 00:07:33,333
慢。 这里我们有我们的小立方体。
168
00:07:33,333 --> 00:07:34,766
我想要做的就是画出
169
00:07:34,800 --> 00:07:36,933
成千上万幅这样的画。 在这种情况下,
170
00:07:36,933 --> 00:07:38,533
在每个帧上运行 JavaScript 的成本
171
00:07:38,533 --> 00:07:40,200
以及
172
00:07:40,233 --> 00:07:43,433
在 C++ 中与 JavaScript 交互的成本变得太高。
173
00:07:43,433 --> 00:07:44,866
我们可以做的第一件事就是使用
174
00:07:44,866 --> 00:07:47,000
实例。 现在,我们不再需要进行数千次
175
00:07:47,033 --> 00:07:49,100
绘制调用,而是对所有这些实例进行一次调用,
176
00:07:49,100 --> 00:07:51,966
从而
177
00:07:52,000 --> 00:07:54,633
降低外部函数接口的成本。 但是
178
00:07:54,633 --> 00:07:57,166
对于像
179
00:07:57,166 --> 00:07:59,233
这样有大量不同
180
00:07:59,266 --> 00:08:02,066
物体的异质场景,该怎么办呢? 这就是渲染包的
181
00:08:02,066 --> 00:08:04,300
用武之地。WebGPU 允许您创建
182
00:08:04,300 --> 00:08:06,300
场景的记录。 该记录
183
00:08:06,300 --> 00:08:08,433
可能像您想要的那样复杂。 在
184
00:08:08,466 --> 00:08:10,866
动画时,您可以简单地设置
185
00:08:10,866 --> 00:08:13,266
统一缓冲区并使用单个绘制
186
00:08:13,266 --> 00:08:15,500
调用渲染场景,同时保持
187
00:08:15,500 --> 00:08:17,866
外部函数接口的成本非常低
188
00:08:17,900 --> 00:08:20,300
。 渲染包是一个非常
189
00:08:20,300 --> 00:08:22,133
优雅的概念,可以
190
00:08:22,133 --> 00:08:25,066
降低函数接口的成本,我们
191
00:08:25,100 --> 00:08:27,700
可能会在稍后的演示中再次提到它
192
00:08:27,700 --> 00:08:30,133
。 所以 JavaScript API
193
00:08:30,133 --> 00:08:32,366
非常优雅。 GPU API 怎么样?
194
00:08:32,366 --> 00:08:34,600
WebGPU 有一种新型着色器,即
195
00:08:34,633 --> 00:08:36,766
计算着色器,它允许您
196
00:08:36,800 --> 00:08:39,900
在设备上运行通用 GPU 计算,
197
00:08:39,900 --> 00:08:42,600
并且其中的几个示例
198
00:08:42,633 --> 00:08:44,700
确实引起了我们的注意。 你们中的一些人
199
00:08:44,700 --> 00:08:46,600
非常熟悉 Sheder Toy,
200
00:08:46,633 --> 00:08:48,866
数字艺术家基于 WebGL 片段渲染器构建了令人难以置信的
201
00:08:48,866 --> 00:08:51,166
演示场景,
202
00:08:51,200 --> 00:08:53,666
并且大多数渲染器当然可以
203
00:08:53,666 --> 00:08:55,800
在 React Native Skia 上运行,
204
00:08:55,833 --> 00:08:58,300
只需进行最少的更改。 Compute Toys 是一个
205
00:08:58,300 --> 00:08:59,966
类似的项目,但它属于 WebGPU
206
00:09:00,000 --> 00:09:01,733
社区,并且使用计算
207
00:09:01,733 --> 00:09:03,566
着色器而不是片段着色器。
208
00:09:03,600 --> 00:09:05,433
计算着色器允许艺术家
209
00:09:05,433 --> 00:09:07,933
将像素值写入不同的
210
00:09:07,933 --> 00:09:10,366
缓冲区。 这意味着每个
211
00:09:10,366 --> 00:09:12,600
线程不仅可以影响
212
00:09:12,633 --> 00:09:14,933
其指定像素的颜色,还可以将
213
00:09:14,933 --> 00:09:17,000
值写入影响整个帧中
214
00:09:17,033 --> 00:09:19,266
许多像素颜色的数组
215
00:09:19,266 --> 00:09:21,733
。 为
216
00:09:21,733 --> 00:09:23,866
计算玩具提供支持的开源 JavaScript 引擎
217
00:09:23,900 --> 00:09:25,566
在 React Native 上完全开箱即用
218
00:09:25,600 --> 00:09:28,233
。 我们将
219
00:09:28,233 --> 00:09:30,933
时间和手势的动画值重新集成
220
00:09:30,933 --> 00:09:33,966
到计算引擎中。 我们还构建了
221
00:09:34,000 --> 00:09:36,066
一个小型实用程序来直接查看
222
00:09:36,066 --> 00:09:38,600
React Native 中现有的计算玩具。
223
00:09:38,633 --> 00:09:41,266
计算着色器的另一个引人注目的例子
224
00:09:41,266 --> 00:09:44,300
是 tensorflow.js,它
225
00:09:44,533 --> 00:09:49,266
使用 react native webpu 后端在 react native 中完全开箱即用
226
00:09:49,266 --> 00:09:51,266
。 例如,在这个演示中,我们
227
00:09:51,266 --> 00:09:54,533
甚至没有使用 canva,我们只是使用了
228
00:09:54,533 --> 00:09:57,566
计算着色器。 现在向我们展示
229
00:09:57,766 --> 00:10:02,833
来自 typeGPU 团队 Marin Horac 和
230
00:10:02,866 --> 00:10:05,666
软件 manion 的 Conrad Resko 的更引人注目的计算着色器示例。
231
00:10:05,666 --> 00:10:07,400
计算着色器
232
00:10:07,433 --> 00:10:09,566
在各种项目中非常强大且有用。 现在,
233
00:10:09,600 --> 00:10:11,733
借助基于
234
00:10:11,733 --> 00:10:14,200
WebGPU 构建的库,我们希望能够比以往更轻松地定义和
235
00:10:14,233 --> 00:10:15,966
执行您自己的计算管道
236
00:10:16,000 --> 00:10:17,600
。 在
237
00:10:17,600 --> 00:10:19,833
开发我们的库时,我们很高兴地
238
00:10:19,833 --> 00:10:21,700
创建了一些
239
00:10:21,700 --> 00:10:24,200
可视化示例,这些示例使用计算
240
00:10:24,233 --> 00:10:26,866
着色器的功能来计算一些数据,
241
00:10:26,866 --> 00:10:29,233
然后这些数据也
242
00:10:29,266 --> 00:10:31,900
通过 React Native WebGPU 和 typeGPU 用于渲染,
243
00:10:31,900 --> 00:10:34,600
如下所示。 这些
244
00:10:34,633 --> 00:10:37,033
最初为 Web 创建的示例现在可以
245
00:10:37,266 --> 00:10:41,966
通过 React Native WebGPU 轻松在 React Native 应用程序上运行,
246
00:10:42,000 --> 00:10:44,066
几乎不需要修改。 您可以
247
00:10:44,133 --> 00:10:48,133
在我们的网站 typgpu.com 上找到我们所有的示例及其代码实现
248
00:10:48,133 --> 00:10:49,866
249
00:10:49,900 --> 00:10:52,366
机器学习工作负载是
250
00:10:52,366 --> 00:10:55,066
GPU 加速的完美选择,而 typeGPU
251
00:10:55,100 --> 00:10:56,966
使得实现这些工作负载变得更加
252
00:10:57,000 --> 00:10:59,433
容易。 我们设计 TypeGPU 作为
253
00:10:59,433 --> 00:11:01,500
基础。 我们自己并不提供
254
00:11:01,500 --> 00:11:03,333
特定于人工智能的抽象,而是
255
00:11:03,333 --> 00:11:05,233
256
00:11:05,266 --> 00:11:07,266
模块化推理库生态系统的
257
00:11:07,266 --> 00:11:10,300
出现创造条件。 TypeGPU 通过
258
00:11:10,300 --> 00:11:11,800
提供构建块来实现这一点,这些构建块让
259
00:11:11,833 --> 00:11:13,433
开发人员能够精确地制作他们
260
00:11:13,433 --> 00:11:15,166
需要的东西,并且类型安全可以弥合
261
00:11:15,200 --> 00:11:17,266
Typ GPU 和 WGSL 世界之间的差距。 我们
262
00:11:17,266 --> 00:11:18,766
通过
263
00:11:18,800 --> 00:11:20,800
在 GPU 上实现 MINIST 数字识别证明了这种潜力
264
00:11:20,800 --> 00:11:23,500
。 突出的是数据结构如何
265
00:11:23,666 --> 00:11:27,733
在整个管道中保持人类可读性。 即使以 GPU 速度执行,神经网络
266
00:11:27,733 --> 00:11:29,466
操作仍然清晰且
267
00:11:29,500 --> 00:11:31,966
可维护
268
00:11:32,000 --> 00:11:33,833
。 我们还在开发一种新的
269
00:11:33,833 --> 00:11:35,733
React Native 包,用于
270
00:11:35,733 --> 00:11:38,900
专门在 GPU 上运行五彩纸屑动画。
271
00:11:38,933 --> 00:11:41,033
计算着色器是实现的核心部分,
272
00:11:41,066 --> 00:11:43,333
因为每个粒子的位置都是
273
00:11:43,433 --> 00:11:48,300
在计算管道内并行计算的。 我们
274
00:11:48,300 --> 00:11:50,300
设法让用户能够
275
00:11:50,300 --> 00:11:52,533
深度定制模拟。
276
00:11:52,533 --> 00:11:53,966
配置不仅仅是
277
00:11:54,000 --> 00:11:56,000
数字参数。 这是一种行为上的改变
278
00:11:56,000 --> 00:11:58,366
。 例如,重力
279
00:11:58,366 --> 00:12:00,433
不仅仅是一个静态矢量。 它可以
280
00:12:00,466 --> 00:12:02,133
取决于每个粒子的当前位置
281
00:12:02,133 --> 00:12:04,200
。 与仅使用常规的 WebGPU API 相比,TypeGPU 使我们更容易
282
00:12:04,233 --> 00:12:05,900
创建和扩展
283
00:12:05,900 --> 00:12:07,900
模拟
284
00:12:07,900 --> 00:12:10,366
。 用户也可以更
285
00:12:10,366 --> 00:12:12,033
轻松地贡献自己的
286
00:12:12,066 --> 00:12:14,533
逻辑。 用户传递给 comparing
287
00:12:14,533 --> 00:12:16,666
组件的本质上只是一个标记的
288
00:12:16,700 --> 00:12:18,933
TypeScript 函数,可以无缝
289
00:12:18,933 --> 00:12:20,933
集成到 GPU 上的并行计算中
290
00:12:20,933 --> 00:12:24,033
。 这有点像
291
00:12:24,066 --> 00:12:26,300
提到的软件在重新动画中所做的事情,其
292
00:12:26,300 --> 00:12:28,833
功能可以在 UI 线程上运行。
293
00:12:28,866 --> 00:12:31,000
我们使 TypeScript 函数能够
294
00:12:31,033 --> 00:12:33,266
在 GPU 上运行。 如果您想关注我们的
295
00:12:33,266 --> 00:12:35,400
进展,您可以查看我们的 Discord
296
00:12:35,433 --> 00:12:37,900
服务器、GitHub 存储库和我们的
297
00:12:37,900 --> 00:12:40,033
网站 typgpu.com。
298
00:12:40,066 --> 00:12:43,366
到时候见。
299
00:12:43,866 --> 00:12:47,900
与 typeGPU 团队一样,我
300
00:12:47,900 --> 00:12:51,100
对 Web GPU API 感到非常兴奋,但我们
301
00:12:51,100 --> 00:12:53,166
预计很多 React Native
302
00:12:53,200 --> 00:12:55,300
开发人员将使用 React Native
303
00:12:55,300 --> 00:12:57,800
WebGPU 而不直接与其交互
304
00:12:57,833 --> 00:13:00,466
。 相反,我们认为您
305
00:13:00,466 --> 00:13:02,200
将利用
306
00:13:02,233 --> 00:13:06,066
three.js 等网络生态系统巨头。 three.js 彻底
307
00:13:06,066 --> 00:13:08,700
改变了网络的 3D 图形,
308
00:13:08,700 --> 00:13:10,833
并使数百万开发人员
309
00:13:10,866 --> 00:13:13,900
能够构建令人惊叹的 3D 体验。
310
00:13:13,900 --> 00:13:15,566
当我们开始使用 React Native
311
00:13:15,600 --> 00:13:18,133
WebGPU 时,我们想了解
312
00:13:18,133 --> 00:13:21,333
three.js 社区对 WebGPU
313
00:13:21,333 --> 00:13:24,033
支持的兴奋程度。 我们看到了一些非常
314
00:13:24,066 --> 00:13:26,533
积极的信号,令人惊叹的社区
315
00:13:26,533 --> 00:13:29,200
成员正在推动 three.js 中的 Web GPU 支持
316
00:13:29,233 --> 00:13:32,933
。 three.js 中的 WebGPU 支持是一个双重
317
00:13:32,933 --> 00:13:35,800
问题。 首先,three.js 的 WebGPU 后端
318
00:13:35,833 --> 00:13:38,866
和 TSL 的引入,TSL 是一种
319
00:13:38,866 --> 00:13:40,300
TypeScript 着色语言,可以
320
00:13:40,300 --> 00:13:43,233
从 GLSL(
321
00:13:43,266 --> 00:13:47,666
WebGPU 的着色语言)和 WGSL(WebGPU
322
00:13:47,666 --> 00:13:49,966
着色语言)中抽象出来。 如果我们做得好,
323
00:13:50,000 --> 00:13:52,066
这些 three.js 示例应该可以
324
00:13:52,066 --> 00:13:55,266
在 React Native WebGPU 上完全开箱即用。
325
00:13:55,266 --> 00:13:57,800
他们确实这么做了。 一些示例
326
00:13:57,833 --> 00:14:00,066
与网络上的示例完全相同。
327
00:14:00,066 --> 00:14:02,133
有些示例依赖外部 Web
328
00:14:02,133 --> 00:14:04,666
API 来加载模型。 这里我们
329
00:14:04,700 --> 00:14:06,700
提供了与这些示例类似的 React Native 等效版本
330
00:14:06,700 --> 00:14:09,000
。 在最新的
331
00:14:09,033 --> 00:14:10,600
贡献者提交中,React Native
332
00:14:10,633 --> 00:14:12,366
贡献者提出了将
333
00:14:12,366 --> 00:14:14,600
一部分 Web API 引入 React
334
00:14:14,633 --> 00:14:16,933
Native 的想法。 我们认为这些例子
335
00:14:16,933 --> 00:14:19,066
很好地展示了
336
00:14:19,100 --> 00:14:21,100
遵循 Web 一致性有多么有益
337
00:14:21,100 --> 00:14:23,900
。 这些在
338
00:14:23,900 --> 00:14:25,633
React Native WebGPU 上运行的 three.js 示例
339
00:14:25,666 --> 00:14:27,966
与 WebGL 示例有很大不同
340
00:14:28,000 --> 00:14:30,000
。 首先,他们在 Android 上使用 Vulkan
341
00:14:30,000 --> 00:14:32,800
,在 iOS 上使用 Metal。 OpenGL
342
00:14:32,800 --> 00:14:35,866
在 iOS 上已被弃用,并且它们支持
343
00:14:35,866 --> 00:14:38,033
重新动画。 我们想进行一个小
344
00:14:38,066 --> 00:14:40,300
实验,看看是否能够
345
00:14:40,300 --> 00:14:42,833
在工作线程上完全运行 three.js 因此,
346
00:14:42,866 --> 00:14:44,700
我们构建了一个小型实用程序,要求
347
00:14:44,700 --> 00:14:46,933
Metro Bundler 为我们制作一个特殊的 3GS
348
00:14:46,933 --> 00:14:49,233
捆绑包,以便我们可以在 UI 线程上使用
349
00:14:49,266 --> 00:14:51,333
。 我们可以用它来运行我们的 three.js
350
00:14:51,333 --> 00:14:53,966
场景。 看起来不错。 我甚至可以使用
351
00:14:54,000 --> 00:14:56,466
手势处理程序。 如果我们
352
00:14:56,466 --> 00:14:58,600
像这样完全阻止 JavaScript 线程,
353
00:14:58,633 --> 00:15:02,566
场景仍然会完全
354
00:15:02,600 --> 00:15:05,500
流畅地运行。 这个 three.js 场景在
355
00:15:05,500 --> 00:15:08,766
Vulkan 和 Metal 等现代 GPU API 上运行,
356
00:15:08,800 --> 00:15:10,300
并且
357
00:15:10,300 --> 00:15:13,233
与 Reanimated 完全集成,这
358
00:15:13,266 --> 00:15:16,066
对于 React Native 来说确实是首创。 那么
359
00:15:16,066 --> 00:15:19,666
Skia 的故事是怎样的呢?例如,它为
360
00:15:20,033 --> 00:15:23,733
路径几何、布尔路径运算符、
361
00:15:23,733 --> 00:15:25,900
文本布局、磁吸技巧
362
00:15:25,933 --> 00:15:29,166
计算等提供了大量的实用工具,我们不需要
363
00:15:29,166 --> 00:15:32,100
在工作线程上运行那么多复杂的 npm 包
364
00:15:32,133 --> 00:15:34,533
。 但是对于 WebGPU(
365
00:15:34,533 --> 00:15:37,066
一种更低级别的 API),
366
00:15:37,066 --> 00:15:41,966
在工作台上运行 three.js 等成熟的 npm 包的需求
367
00:15:42,000 --> 00:15:45,833
变得更大。 您刚才
368
00:15:45,833 --> 00:15:48,700
看到的只是概念证明,但我们预计
369
00:15:48,700 --> 00:15:50,933
这种做法将在
370
00:15:50,933 --> 00:15:54,533
不久的将来成为主流。 说到 three.js
371
00:15:54,533 --> 00:15:57,866
和 React,生态系统的另一个重要部分
372
00:15:57,900 --> 00:16:00,533
是 React three fiber
373
00:16:00,533 --> 00:16:03,333
three fiber 是 three.js 的 react reconciliate
374
00:16:03,333 --> 00:16:05,166
与 skia 一样,
375
00:16:05,166 --> 00:16:08,033
在 React 编程模型中使用时,其图形 API 的功能会被放大
376
00:16:08,066 --> 00:16:10,300
377
00:16:10,300 --> 00:16:12,033
能够
378
00:16:12,066 --> 00:16:14,066
轻松地组成强大的图形
379
00:16:14,066 --> 00:16:17,000
基元真是令人高兴的事。 因此,我们想知道谁能
380
00:16:17,033 --> 00:16:19,100
利用 three fiber 做出真正酷的东西
381
00:16:19,100 --> 00:16:21,966
? 首先,是
382
00:16:22,000 --> 00:16:24,533
来自 Shopify 的 Daniel Bosch。 大家好,
383
00:16:24,533 --> 00:16:26,600
我是 Daniel Bosch,Shopify 的软件工程师
384
00:16:26,633 --> 00:16:28,633
,我很乐意向你们展示
385
00:16:28,633 --> 00:16:30,333
我们在 3D 领域的创新成果
386
00:16:30,333 --> 00:16:33,233
。 欢迎来到 Shopify Live Globe
387
00:16:33,266 --> 00:16:35,000
Mothership。 现在,您首先会
388
00:16:35,033 --> 00:16:36,600
注意到这不是一段录制的
389
00:16:36,633 --> 00:16:38,933
视频。 这是一个完全交互式的 3D
390
00:16:38,933 --> 00:16:41,166
场景。 它是
391
00:16:41,166 --> 00:16:43,700
使用 React three fiber(
392
00:16:43,733 --> 00:16:46,533
React 的流行 three.js 包装器)从头开始构建的。 一切都是
393
00:16:46,533 --> 00:16:49,000
互动的。 我可以放大这里来查看
394
00:16:49,033 --> 00:16:51,500
这些订单的发生情况。 这是 2024 年
395
00:16:51,500 --> 00:16:53,500
黑色星期五高峰期订单的重演。
396
00:16:53,500 --> 00:16:55,900
每一个弧线都是真实的
397
00:16:55,900 --> 00:16:58,133
订单。 我可以尝试
398
00:16:58,133 --> 00:17:01,233
改变艺术颜色或粒子颜色。 我
399
00:17:01,266 --> 00:17:03,100
可以玩摇头娃娃,
400
00:17:03,100 --> 00:17:05,866
关闭重力,并移动这些物理
401
00:17:05,900 --> 00:17:08,133
物体。 这里甚至还有一个
402
00:17:08,133 --> 00:17:10,433
令人愉快的小电缆,我可以通过它切换
403
00:17:10,466 --> 00:17:13,100
到不同的数据源来查看
404
00:17:13,100 --> 00:17:15,166
Shopify 在黑色星期五期间如何推动商业发展
405
00:17:15,166 --> 00:17:17,700
。 这里我最喜欢的
406
00:17:17,733 --> 00:17:19,766
功能之一就是这个音乐
407
00:17:19,766 --> 00:17:22,266
合成器。 所以,我可以打开它,然后
408
00:17:22,300 --> 00:17:24,533
就可以收听“黑色星期五”了。 当
409
00:17:24,533 --> 00:17:26,833
这些弧线碰到音乐网格时,它会
410
00:17:26,866 --> 00:17:29,333
发出不同的声音。 所以,我可以
411
00:17:29,333 --> 00:17:31,733
去南美洲,将其改为
412
00:17:31,733 --> 00:17:33,633
方波,调整一些
413
00:17:33,666 --> 00:17:35,733
设置,然后立即开始
414
00:17:35,733 --> 00:17:38,666
创作音乐。 它甚至有一个网络 MIDI
415
00:17:38,700 --> 00:17:40,433
输出,如果你有
416
00:17:40,466 --> 00:17:43,000
一个物理设备可以输出的话,这非常棒。 如果
417
00:17:43,033 --> 00:17:45,100
您有 Vision Pro 或 Quest,您
418
00:17:45,100 --> 00:17:48,133
可以在这些设备上的网络上体验完整的空间 3D 体验
419
00:17:48,133 --> 00:17:50,666
420
00:17:50,700 --> 00:17:53,000
很酷吧? 每年我们都试图超越
421
00:17:53,033 --> 00:17:54,700
自己,今年我们计划
422
00:17:54,700 --> 00:17:57,000
使用 WebGPU 真正将我们的世界提升到一个新的
423
00:17:57,033 --> 00:17:59,266
水平。 去年的 React three
424
00:17:59,266 --> 00:18:02,366
Fiber 采用了 WebGL2,这
425
00:18:02,400 --> 00:18:03,933
意味着我们所有的着色器都是用
426
00:18:03,933 --> 00:18:06,766
GLSL 编写的。 为了使用 WebGPU,我们必须使用
427
00:18:06,766 --> 00:18:07,800
不同的着色
428
00:18:07,833 --> 00:18:09,900
语言来编写,而同时支持这两种语言会很
429
00:18:09,900 --> 00:18:12,300
麻烦。 这就是 TSL 的用武之地。它是
430
00:18:12,300 --> 00:18:14,600
three.js 着色语言。 您只需编写
431
00:18:14,633 --> 00:18:16,466
一次即可支持
432
00:18:16,466 --> 00:18:19,333
WebGPU 和传统 WebGL 目标。
433
00:18:19,333 --> 00:18:21,333
现在有了 Skia,我们实际上可以
434
00:18:21,333 --> 00:18:23,966
直接在 React
435
00:18:24,000 --> 00:18:26,700
Native 应用程序中运行 WebGPU。 在 Shopify,我们所有的移动
436
00:18:26,700 --> 00:18:29,100
应用程序都是用 React Native 编写的。 因此,现在
437
00:18:29,100 --> 00:18:31,566
我们只需编写一次代码,
438
00:18:31,600 --> 00:18:33,833
无需额外代码,即可
439
00:18:33,833 --> 00:18:36,466
直接在我们的移动应用程序中运行我们的地球。
440
00:18:36,466 --> 00:18:38,600
这是我们制作的快速原型,
441
00:18:38,633 --> 00:18:40,466
实际
442
00:18:40,466 --> 00:18:43,733
在 WebGPU 中运行了去年地球仪的一些着色器。 正如
443
00:18:43,733 --> 00:18:46,933
您在此处看到的,结果是
444
00:18:46,933 --> 00:18:49,333
相同的。 不需要额外的代码即可
445
00:18:49,333 --> 00:18:51,333
在 React Native 应用程序中实际本地运行它
446
00:18:51,333 --> 00:18:54,366
。 这只是
447
00:18:54,400 --> 00:18:56,400
我们迈向
448
00:18:56,400 --> 00:18:58,466
WebGPU 和
449
00:18:58,466 --> 00:19:01,100
直接在原生应用内运行地球仪等事物的旅程的开始。 我们
450
00:19:01,100 --> 00:19:03,400
对 Skia 提供的可能性感到非常兴奋,它让
451
00:19:03,433 --> 00:19:05,566
我们
452
00:19:05,600 --> 00:19:08,066
无需额外的代码就可以运行这些东西。 谢谢
453
00:19:08,066 --> 00:19:09,866
你,丹妮尔。 这绝对令人
454
00:19:09,866 --> 00:19:12,066
难以置信。 如果您有兴趣
455
00:19:12,066 --> 00:19:14,366
了解有关 Shopify 黑色星期五
456
00:19:14,400 --> 00:19:16,300
地球仪是如何构建的更多信息,可以参阅
457
00:19:16,366 --> 00:19:21,400
Diego Mario 创建的精彩交互式教程,我强烈
458
00:19:21,400 --> 00:19:23,733
推荐。 还有谁
459
00:19:23,733 --> 00:19:25,966
在 React Native 上使用 3D 做很酷的事情?
460
00:19:26,000 --> 00:19:28,766
当然是来自 SpaceX 的 Haron Grider。
461
00:19:28,766 --> 00:19:30,666
three fiber 是 StarLink 应用程序的核心,
462
00:19:30,700 --> 00:19:32,366
我们希望与 AORN 一起进行一项小型
463
00:19:32,400 --> 00:19:34,700
实验,将部分
464
00:19:34,700 --> 00:19:37,866
GLSL 代码迁移到 TSL,看看我们是否
465
00:19:37,900 --> 00:19:39,733
可以在 React Native WebGPU 上运行该体验
466
00:19:39,733 --> 00:19:42,766
。 目标是首先
467
00:19:42,766 --> 00:19:46,200
在现代 GPU API 上运行体验,
468
00:19:46,233 --> 00:19:47,966
并为与 Reanimated 的更深层次集成奠定基础
469
00:19:48,000 --> 00:19:50,866
。 这就是
470
00:19:50,866 --> 00:19:52,200
我今天早上想向你们展示的第一件事
471
00:19:52,233 --> 00:19:53,366
472
00:19:53,400 --> 00:19:56,000
WebGPU 是一个全新但已广
473
00:19:56,000 --> 00:19:58,400
受喜爱的网络标准。 我们正在以
474
00:19:58,400 --> 00:20:00,133
我们认为非常引人注目的方式将其与 React Native 进行集成
475
00:20:00,133 --> 00:20:02,366
。 这使
476
00:20:02,400 --> 00:20:05,266
我们能够利用现有的 Web 生态系统,
477
00:20:05,266 --> 00:20:08,566
例如 Compute Toys、TypeGPU、
478
00:20:08,600 --> 00:20:11,900
TensorflowJS,并且我们认为 three.js 和
479
00:20:11,900 --> 00:20:13,966
React three fiber 将成为
480
00:20:14,000 --> 00:20:18,300
React Native WebGPU 的主要关注点。 现在让我们来
481
00:20:18,300 --> 00:20:21,333
谈谈我们
482
00:20:21,333 --> 00:20:23,400
首先研究 WebGPU 的原因,那
483
00:20:23,433 --> 00:20:25,733
当然是 React Native Skia。
484
00:20:25,733 --> 00:20:28,500
Skia 当然是
485
00:20:28,533 --> 00:20:30,933
React Native 上 2D 图形的宠儿,您已经
486
00:20:30,933 --> 00:20:33,966
使用它来带来 Juno Sequa 来
487
00:20:34,000 --> 00:20:36,766
取悦您的用户,就像在 OnSphere
488
00:20:36,766 --> 00:20:39,166
应用程序中一样。 您已经使用 Skia 将
489
00:20:39,200 --> 00:20:41,500
游戏化的含义提升到了一个全新
490
00:20:41,500 --> 00:20:44,300
的水平,就像独一无二的 Dion Moon 制作的 Callie 应用程序一样
491
00:20:44,300 --> 00:20:46,833
。 您已经
492
00:20:46,866 --> 00:20:49,900
使用 Skia 构建了
493
00:20:49,900 --> 00:20:53,166
类似 daze app 的全新级别的聊天应用程序。
494
00:20:53,200 --> 00:20:54,633
您已经使用 Skia 构建了
495
00:20:54,766 --> 00:21:00,766
类似 azzapp 的一流视频编辑器和导出器,并构建了
496
00:21:00,766 --> 00:21:03,866
类似 Phomo 和 Blindsoot 的最先进的照片编辑器。 您
497
00:21:03,900 --> 00:21:06,433
已经使用 Skia 构建了
498
00:21:06,466 --> 00:21:09,100
像 Prado 这样的沉浸式游戏,并让学习变得像
499
00:21:09,100 --> 00:21:11,633
Gecko Med 一样有趣。 您已经使用它来让
500
00:21:11,666 --> 00:21:13,666
用户参与健身之
501
00:21:13,666 --> 00:21:17,400
旅,就像在 Runna 和 B42 应用程序中一样。
502
00:21:17,433 --> 00:21:19,100
这些是您
503
00:21:19,100 --> 00:21:21,633
使用 React Native Skia 构建的一些应用程序。
504
00:21:21,666 --> 00:21:23,733
您对这个项目的支持和贡献
505
00:21:23,733 --> 00:21:25,666
确实令人感到
506
00:21:25,700 --> 00:21:28,433
温暖。 所以今天早上我们想
507
00:21:28,466 --> 00:21:30,866
宣布一些
508
00:21:30,866 --> 00:21:34,733
我们非常自豪的新功能。
509
00:21:34,733 --> 00:21:38,100
请击鼓。 零。 这是正确的。 零新
510
00:21:38,133 --> 00:21:40,366
功能。 在构建任何新
511
00:21:40,400 --> 00:21:42,400
功能之前,我们想要做的是
512
00:21:42,400 --> 00:21:44,533
让 React Skia 上的动画时间
513
00:21:44,533 --> 00:21:47,866
在 iOS 上加快 50%,
514
00:21:47,900 --> 00:21:50,600
在 Android 上加快近 200%。 我们还将 Android 和 iOS 上的
515
00:21:50,633 --> 00:21:53,900
第一个动画帧的时间缩短了近
516
00:21:53,900 --> 00:21:57,800
200%。 我们
517
00:21:57,833 --> 00:22:00,233
只是渴望让 React native skia 变得
518
00:22:00,233 --> 00:22:02,766
更精简、更强大。 事实上,我们甚至将
519
00:22:02,766 --> 00:22:05,866
代码库减少了 13%。 但更
520
00:22:05,900 --> 00:22:08,433
重要的是,我们通过偿还技术债务修复了 98%
521
00:22:08,466 --> 00:22:11,500
报告给我们的 Android 崩溃问题
522
00:22:11,500 --> 00:22:13,333
。 我们正在
523
00:22:13,333 --> 00:22:15,000
使 React native Skia 能够
524
00:22:15,033 --> 00:22:17,033
在三个新平台上使用,并
525
00:22:17,033 --> 00:22:19,100
为 Skia Graphite(
526
00:22:19,100 --> 00:22:22,766
使用 WebGPU 的 Skia 新后端)做好准备。 在开发
527
00:22:22,766 --> 00:22:24,666
React Native Skia 的过程中,我们一直有关于
528
00:22:24,700 --> 00:22:27,333
如何改进它的想法。 当我们
529
00:22:27,333 --> 00:22:29,166
开始研究 React Native WebGPU 时,
530
00:22:29,200 --> 00:22:31,033
我们有一个绿地项目,我们
531
00:22:31,033 --> 00:22:33,433
可以在其中测试这些想法,一旦它们得到
532
00:22:33,433 --> 00:22:36,233
验证,我们就可以将它们运送到
533
00:22:36,233 --> 00:22:38,466
Skia。 那么,让我们来讨论一下其中的一些
534
00:22:38,466 --> 00:22:40,300
架构改进,
535
00:22:40,300 --> 00:22:42,033
今天早上我为你们挑选了三个。
536
00:22:42,066 --> 00:22:43,966
Skia 连接到
537
00:22:44,000 --> 00:22:46,533
底层 3D API 的后端 API、
538
00:22:46,533 --> 00:22:48,033
利用 React
539
00:22:48,066 --> 00:22:50,466
编程模型和协调器的声明性 API 以及使
540
00:22:50,466 --> 00:22:52,200
该库能够
541
00:22:52,233 --> 00:22:55,433
在 Android、iOS、Web 等上运行的平台 API。 对于
542
00:22:55,433 --> 00:22:57,566
后端 API,我们目前
543
00:22:57,600 --> 00:23:00,066
在 Android 上使用 OpenGL,在 iOS 上使用 Metal。 OpenGL 和
544
00:23:00,066 --> 00:23:01,800
Metal 是完全不同的 API,
545
00:23:01,833 --> 00:23:03,266
我们编写了两个完全不同的
546
00:23:03,266 --> 00:23:05,333
后端,每次我们想要
547
00:23:05,333 --> 00:23:07,233
构建一个新的后端相关功能时,我们都
548
00:23:07,266 --> 00:23:09,566
需要构建两次,而这
549
00:23:09,600 --> 00:23:11,600
很快就会让事情变得混乱。
550
00:23:11,600 --> 00:23:13,733
随着即将迁移到 WebGPU,我们
551
00:23:13,733 --> 00:23:15,333
知道我们需要消除
552
00:23:15,333 --> 00:23:17,400
后端 API 之间的这些差异,以便
553
00:23:17,433 --> 00:23:19,433
我们可以轻松插入新的统一
554
00:23:19,433 --> 00:23:22,866
后端 WebGPU。 尽管 OpenGL
555
00:23:22,866 --> 00:23:24,933
和 Metal 是非常不同的 API,但我们
556
00:23:24,933 --> 00:23:26,666
确实找到了一种
557
00:23:26,700 --> 00:23:29,333
非常适合我们的通用后端模型。 通过调整这些
558
00:23:29,333 --> 00:23:32,366
后端 API,我们为用户修复了大量错误,
559
00:23:32,400 --> 00:23:34,866
尤其是在 OpenGL 和 Android 上
560
00:23:34,866 --> 00:23:37,966
。 我们正在
561
00:23:38,000 --> 00:23:41,200
通过
562
00:23:41,200 --> 00:23:43,433
开关的翻转来启用 Graphite 后端实验。 它还
563
00:23:43,433 --> 00:23:47,100
为视频和摄像头馈送实现了一些更复杂的用例
564
00:23:47,100 --> 00:23:50,133
565
00:23:50,133 --> 00:23:53,633
来自 Azzapp 的 Francois 将为您详细介绍这一点。
566
00:23:53,666 --> 00:23:57,500
大家好。 我是 Francois,azzapp 的首席技术官,azzapp 是一家
567
00:23:57,500 --> 00:24:00,133
初创公司,致力于开发数字网络
568
00:24:00,133 --> 00:24:02,600
移动应用程序,将数字
569
00:24:02,633 --> 00:24:05,100
名片与我们所谓的网络
570
00:24:05,100 --> 00:24:08,033
名片(一种时尚的交互式数字
571
00:24:08,066 --> 00:24:09,366
演示
572
00:24:09,400 --> 00:24:12,633
页面)相结合。 Azzapp 的一个突出特点
573
00:24:12,633 --> 00:24:15,833
是封面。
574
00:24:15,833 --> 00:24:18,366
当您使用应用程序共享您的联系人时人们首先看到的东西
575
00:24:18,400 --> 00:24:21,333
。 我们希望用户
576
00:24:21,333 --> 00:24:23,466
在分享他们的联系信息时感到自豪。
577
00:24:23,500 --> 00:24:26,033
为了实现这一点,封面必须
578
00:24:26,066 --> 00:24:29,400
尽可能具有视觉吸引力。 我们
579
00:24:29,433 --> 00:24:31,566
希望我们的用户能够使用
580
00:24:31,600 --> 00:24:34,600
多种媒体、应用过滤器、添加
581
00:24:34,600 --> 00:24:37,100
动画并生成
582
00:24:37,100 --> 00:24:39,566
可在所有
583
00:24:39,600 --> 00:24:42,400
社交媒体平台上轻松分享的视频。
584
00:24:42,400 --> 00:24:44,866
在早期开发阶段,我们
585
00:24:44,866 --> 00:24:46,933
意识到唯一能够提供
586
00:24:47,133 --> 00:24:52,033
实现我们愿景所需的容量和性能的解决方案是 React native
587
00:24:52,066 --> 00:24:55,233
skia 但是,为了满足我们的特定
588
00:24:55,266 --> 00:24:57,733
要求,我们必须开发一个
589
00:24:57,733 --> 00:25:00,933
名为 React native skia video 的自定义模块。 该
590
00:25:00,933 --> 00:25:03,966
模块允许我们提取视频帧
591
00:25:04,000 --> 00:25:06,700
并将它们无缝集成到
592
00:25:06,700 --> 00:25:09,333
清晰绘制管道中,同时还
593
00:25:09,333 --> 00:25:11,466
支持从单独的线程导出视频
594
00:25:11,500 --> 00:25:13,800
。 我们为该库做出了贡献,
595
00:25:13,833 --> 00:25:16,766
并实现了
596
00:25:16,766 --> 00:25:19,633
原生纹理的直接传输系统以
597
00:25:19,666 --> 00:25:22,300
react native skia,从而使我们能够直接
598
00:25:22,300 --> 00:25:25,566
在 iOS 上使用 metal 纹理,
599
00:25:25,600 --> 00:25:28,766
在 Android 上使用 OpenGL 纹理。 这种方法
600
00:25:28,766 --> 00:25:31,566
不仅优化了内存使用,而且
601
00:25:31,600 --> 00:25:34,533
提高了渲染速度。 我们相信
602
00:25:34,533 --> 00:25:36,933
该解决方案对于
603
00:25:36,933 --> 00:25:39,166
在 React Native 应用程序中利用视频内容具有真正的作用,
604
00:25:39,200 --> 00:25:41,833
我们很高兴分享
605
00:25:41,833 --> 00:25:44,066
有关这一创新的更多信息以及它如何使
606
00:25:44,066 --> 00:25:47,500
其他开发人员受益。 谢谢。
607
00:25:47,500 --> 00:25:48,933
谢谢你,Francois。 这看起来
608
00:25:48,933 --> 00:25:51,000
令人难以置信。 React Native Skia 视频是
609
00:25:51,033 --> 00:25:53,500
一个令人难以置信的开源项目,它使用
610
00:25:53,500 --> 00:25:56,033
React Native Skia 处理视频,
611
00:25:56,066 --> 00:25:58,933
并且还有 React Native Vision
612
00:25:58,933 --> 00:26:01,866
摄像头用于摄像头支持,而 React
613
00:26:01,900 --> 00:26:04,300
Native 视频在其即将推出的版本 7 中
614
00:26:04,300 --> 00:26:07,800
也支持 Skia。 现在让我们进入
615
00:26:07,833 --> 00:26:09,900
更高一层,
616
00:26:09,900 --> 00:26:11,733
讨论声明性 API。
617
00:26:11,733 --> 00:26:13,800
声明性 API 是奇迹
618
00:26:13,833 --> 00:26:15,733
发生的地方。
619
00:26:15,733 --> 00:26:18,500
能够
620
00:26:18,533 --> 00:26:22,200
在 React 的组合模型中使用 Skia 是一件非常令人愉快的事情。 我们添加了
621
00:26:22,233 --> 00:26:24,933
一个名为 Skia DOM 的精简的图。 我们将其称为
622
00:26:24,933 --> 00:26:26,766
Skia DOM,因为像 DOM 一样,它是
623
00:26:26,766 --> 00:26:30,433
完全可变的,并且我们
624
00:26:30,466 --> 00:26:33,800
用 C++ 编写了它。 因此它非常快,但有
625
00:26:33,833 --> 00:26:36,533
一个致命的设计流程。 我们平等对待
626
00:26:36,533 --> 00:26:38,033
来自 JavaScript 线程
627
00:26:38,066 --> 00:26:40,066
和 UI 线程的更新。 即使
628
00:26:40,066 --> 00:26:41,500
在动画时我们希望速度
629
00:26:41,500 --> 00:26:43,100
非常快,但如果 JavaScript 线程想要更​​新树,我们真的无法
630
00:26:43,100 --> 00:26:45,000
承受任何类型的锁定
631
00:26:45,233 --> 00:26:48,366
。 最重要的是,我们使用了
632
00:26:48,400 --> 00:26:49,900
reanimated 来进行线程
633
00:26:49,900 --> 00:26:51,566
调度,这在
634
00:26:51,600 --> 00:26:53,266
基准测试中出现,我们可以看到我们
635
00:26:53,266 --> 00:26:55,266
支付了两次 线程调度,
636
00:26:55,266 --> 00:26:57,566
一次是在 reanimated 中,另一次是在
637
00:26:57,600 --> 00:26:59,733
Skia DOM 中。 我们所做的是,我们
638
00:26:59,733 --> 00:27:01,633
从完全可变的线程调节器转向
639
00:27:01,800 --> 00:27:08,766
不可变的 fabric 调节器,并且在动画时事情
640
00:27:08,766 --> 00:27:10,500
会非常快,因为我们不需要
641
00:27:10,533 --> 00:27:11,666
处理
642
00:27:11,700 --> 00:27:13,866
并发。 通过实施这一新
643
00:27:13,900 --> 00:27:16,033
模型,我们将 Android
644
00:27:16,066 --> 00:27:19,000
上的动画时间性能提高了近 200%,并将
645
00:27:19,233 --> 00:27:26,066
iOS 和 Android 上的第一帧动画时间提高了近 200%
646
00:27:26,066 --> 00:27:29,166
。 我们最终在
647
00:27:29,200 --> 00:27:32,133
这里实现的是一个支持动画值的不可变显示列表
648
00:27:32,133 --> 00:27:34,200
649
00:27:34,233 --> 00:27:36,133
值得庆幸的是,Fabric Reconciler
650
00:27:36,133 --> 00:27:40,033
完全支持这一点。 它的
651
00:27:40,066 --> 00:27:42,300
概念与 WebGPU 中的渲染包非常相似
652
00:27:42,300 --> 00:27:45,633
。 我真的很喜欢我们
653
00:27:45,666 --> 00:27:47,500
在图形堆栈的不同部分移动,
654
00:27:47,500 --> 00:27:49,733
并且事物看起来非常
655
00:27:49,733 --> 00:27:51,966
不同,但在抽象层面上,它们
656
00:27:52,000 --> 00:27:54,366
经常尝试解决类似的问题。 在
657
00:27:54,366 --> 00:27:56,200
这个特定的例子中,
658
00:27:56,233 --> 00:27:58,633
外部函数接口的成本。 那么,让我们来
659
00:27:58,633 --> 00:28:00,700
看看。 这是
660
00:28:00,700 --> 00:28:03,233
通过 GLSL 向 JavaScript 公开的 Skia 的示例。
661
00:28:03,266 --> 00:28:05,500
很快。 它确实很快,但是
662
00:28:05,500 --> 00:28:07,500
我们现在变得太贪心了,所以它
663
00:28:07,500 --> 00:28:09,500
有点慢。 有两件事我们
664
00:28:09,500 --> 00:28:11,166
想要摆脱。 首先,所有
665
00:28:11,200 --> 00:28:13,600
对象实例实际上都是
666
00:28:13,600 --> 00:28:16,633
JSI 中的热点。 最重要的是,
667
00:28:16,633 --> 00:28:19,333
即使它们速度很快,这些对象的生命周期也
668
00:28:19,333 --> 00:28:21,866
只有一个动画帧,
669
00:28:21,900 --> 00:28:23,400
这意味着您要么需要
670
00:28:23,433 --> 00:28:25,100
明确删除它们,要么让
671
00:28:25,100 --> 00:28:26,766
垃圾收集器来处理它们。
672
00:28:26,766 --> 00:28:28,833
Skia 绘图彼此深度嵌套
673
00:28:28,866 --> 00:28:30,533
,我们提出了一个
674
00:28:30,533 --> 00:28:32,033
指令集,允许您
675
00:28:32,066 --> 00:28:34,300
表达任何 Skia 绘图,但无需
676
00:28:34,300 --> 00:28:36,700
任何新的对象实例,从而大大降低了
677
00:28:36,700 --> 00:28:38,933
函数接口的成本
678
00:28:38,933 --> 00:28:42,033
。 这是一个
679
00:28:42,066 --> 00:28:44,133
深度嵌套 Skia 绘图的示例,它
680
00:28:44,133 --> 00:28:46,266
等效于使用我们的指令集。
681
00:28:46,500 --> 00:28:51,166
在某些示例中,这个新 API 的速度提高了三倍。 但是当然在
682
00:28:51,200 --> 00:28:53,733
动画时我们希望
683
00:28:53,733 --> 00:28:55,166
函数接口的成本尽可能低
684
00:28:55,200 --> 00:28:57,266
。 因此,我们所做的就是
685
00:28:57,266 --> 00:29:01,433
在绘图中添加对重新动画值的本机支持。 您记录您的
686
00:29:01,433 --> 00:29:02,533
绘图,并且在
687
00:29:02,533 --> 00:29:04,933
动画时您所要做的就是
688
00:29:04,933 --> 00:29:07,333
从重新动画中设置新值并执行绘图。
689
00:29:07,333 --> 00:29:09,466
除了我们
690
00:29:09,500 --> 00:29:11,333
从 rean animated 中获取新值之外,我们已经完全消除了
691
00:29:11,333 --> 00:29:12,733
框架函数接口的成本
692
00:29:12,733 --> 00:29:15,800
。 Skia 带有 React 声明式
693
00:29:15,833 --> 00:29:18,300
模型,使用起来极其优雅且功能强大
694
00:29:18,300 --> 00:29:21,233
。 因此,社区
695
00:29:21,266 --> 00:29:24,600
成员希望在 iOS、
696
00:29:24,633 --> 00:29:27,433
Android 和 Web 之外使用它也就不足为奇了。
697
00:29:27,433 --> 00:29:30,633
微软的 Saad Najmi、
698
00:29:30,633 --> 00:29:33,500
Swsh 的 Nathan Ahn 和 Plex 的 Ruud Berg 将向我们详细介绍这一点
699
00:29:33,500 --> 00:29:36,500
700
00:29:36,533 --> 00:29:38,933
您好,我叫 Assad Najimi。 我是
701
00:29:38,933 --> 00:29:40,500
React Native Mac OS 的维护者之一
702
00:29:40,533 --> 00:29:43,800
。 我最近致力于将
703
00:29:43,833 --> 00:29:46,066
React Native WebGPU 和 React Native
704
00:29:46,066 --> 00:29:48,866
Skia 移植到 React Native MacOS。 我这样做
705
00:29:48,866 --> 00:29:51,166
主要有两个原因。 第一个原因是
706
00:29:51,200 --> 00:29:52,533
我想更多地了解这些
707
00:29:52,533 --> 00:29:54,200
类库。 它们有点超出我
708
00:29:54,233 --> 00:29:56,700
正常的知识范围,我想
709
00:29:56,700 --> 00:29:59,566
通过将
710
00:29:59,600 --> 00:30:01,600
其移植到我工作的平台上来以我所知道的最佳方式学习
711
00:30:01,600 --> 00:30:04,233
。 呃,其次,如果您正在制作 React Native MacOS 应用程序,我想
712
00:30:04,233 --> 00:30:07,666
确保作为库开发人员的您拥有
713
00:30:07,666 --> 00:30:09,966
可用的最好的库。
714
00:30:10,266 --> 00:30:13,900
所以,我希望你能玩得开心
715
00:30:13,900 --> 00:30:17,100
。 嘿,我叫 Ritz。 我是
716
00:30:17,100 --> 00:30:18,600
Plex 的一名软件工程师。
717
00:30:18,633 --> 00:30:20,133
在过去的两年里,我们一直在
718
00:30:20,133 --> 00:30:22,133
使用 React Native 重写 Plex 应用程序
719
00:30:22,133 --> 00:30:24,133
。 我们一直在使用 React Native
720
00:30:24,133 --> 00:30:26,133
Skia
721
00:30:26,133 --> 00:30:27,966
根据您在屏幕上看到的艺术品生成背景。
722
00:30:28,000 --> 00:30:30,000
当您浏览应用程序时,艺术品
723
00:30:30,000 --> 00:30:32,700
和背景都会发生变化。
724
00:30:32,700 --> 00:30:34,533
之前我们使用 SVG 和遮罩
725
00:30:34,533 --> 00:30:36,200
视图,但它们的性能不够
726
00:30:36,233 --> 00:30:38,700
好。 嗯,React Native Skia 在这里帮助了我们
727
00:30:38,700 --> 00:30:41,633
。 嗯,它还允许我们
728
00:30:41,666 --> 00:30:44,466
添加更多功能。 例如,我们在
729
00:30:44,666 --> 00:30:48,833
渐变顶部有一个噪声着色器,有助于防止色带
730
00:30:48,866 --> 00:30:51,000
。 在接下来的几个月里,我们将
731
00:30:51,333 --> 00:30:53,100
在构建
732
00:30:53,300 --> 00:30:57,733
应用程序时使用 React Native Skia 来实现更多的动画。 大家好,我是 Nathan,
733
00:30:57,733 --> 00:30:59,233
从纽约打来电话。 很高兴讨论
734
00:30:59,266 --> 00:31:01,333
我们如何使用 React Native Skia 来
735
00:31:01,333 --> 00:31:02,933
增强开放图表的用户和开发人员
736
00:31:02,933 --> 00:31:05,233
体验。 在 Swsh,
737
00:31:05,266 --> 00:31:07,100
我们正在构建一个由人工智能驱动的相册,
738
00:31:07,100 --> 00:31:08,700
让您可以分享
739
00:31:08,700 --> 00:31:10,533
任何活动的照片和视频,从
740
00:31:10,533 --> 00:31:12,266
大学派对到 Rolling Loud 等音乐节
741
00:31:12,300 --> 00:31:14,833
。 用户
742
00:31:14,866 --> 00:31:16,066
邀请朋友访问
743
00:31:16,066 --> 00:31:18,133
相册的主要方式是分享链接,以确保
744
00:31:18,133 --> 00:31:19,633
客人能够获得相册的最佳预览
745
00:31:19,666 --> 00:31:21,500
。 我们在服务器环境中
746
00:31:21,500 --> 00:31:23,866
使用 React Native Skia 的
747
00:31:23,900 --> 00:31:25,733
无头支持实现了开放图形标准。
748
00:31:25,733 --> 00:31:27,233
我们能够在几秒钟内
749
00:31:27,266 --> 00:31:30,100
使用专辑的名称和内容动态呈现开放图形预览
750
00:31:30,333 --> 00:31:33,866
。 这些动态视频是
751
00:31:33,900 --> 00:31:35,733
通过将
752
00:31:35,733 --> 00:31:37,966
各个帧和渲染的图像组合
753
00:31:38,000 --> 00:31:40,233
成无缝视频来按需渲染的。 作为前端
754
00:31:40,233 --> 00:31:42,133
开发人员,我们需要能够看到
755
00:31:42,133 --> 00:31:43,800
我们正在进行的工作,以确保干净地
756
00:31:43,833 --> 00:31:46,233
实现我们梦想的设计。
757
00:31:46,233 --> 00:31:48,933
通过跨平台网络支持的 React
758
00:31:48,933 --> 00:31:51,566
使我们能够在故事书中设计开放图形图像
759
00:31:51,600 --> 00:31:54,366
并进行实时编辑预览。
760
00:31:54,366 --> 00:31:56,433
然后,一旦预览在前端看起来很完美
761
00:31:56,466 --> 00:31:58,300
,我们就可以将相同的
762
00:31:58,300 --> 00:31:59,966
代码发送到后端,在那里它将以与
763
00:32:00,233 --> 00:32:03,833
开发人员环境中完全相同的方式呈现。 此外,我们
764
00:32:03,833 --> 00:32:05,666
可以使用
765
00:32:05,666 --> 00:32:07,966
与 React native 应用程序相同的工具套件来
766
00:32:08,000 --> 00:32:09,900
设计通常的后端
767
00:32:09,900 --> 00:32:11,900
功能。
768
00:32:11,900 --> 00:32:15,233
MacOS、tvOS 和 Node 是三个
769
00:32:15,266 --> 00:32:17,266
支持 React Native
770
00:32:17,266 --> 00:32:19,900
Skia 的新平台。
771
00:32:19,900 --> 00:32:22,700
Reactive Skia 变得如此多功能,我一点也不感到惊讶。 举个
772
00:32:22,700 --> 00:32:25,233
例子,这个视频本身,所有的
773
00:32:25,266 --> 00:32:27,666
图形动作都是使用
774
00:32:27,666 --> 00:32:30,600
React Native Skia 和 Remotion 生成的。 因此,我们
775
00:32:30,633 --> 00:32:33,500
使用 React Native web 来开发
776
00:32:33,500 --> 00:32:36,300
图形运动并使用无头支持来
777
00:32:36,300 --> 00:32:38,700
导出视频。 因此,我们可以
778
00:32:38,866 --> 00:32:43,400
使用 React Native Skia 本身来讲述有关 React Native Skia 的故事。
779
00:32:43,433 --> 00:32:46,766
这是一件非常有趣的事情。 现在
780
00:32:46,766 --> 00:32:48,366
我们来谈谈 React
781
00:32:48,366 --> 00:32:51,300
Native Skia 的未来,也就是 Graphite。 我们有
782
00:32:51,333 --> 00:32:53,633
一个支持
783
00:32:53,666 --> 00:32:56,133
Skia Graphite 的实验分支。 这还没有准备好迎接
784
00:32:56,133 --> 00:32:57,966
黄金时段,但今天早上我
785
00:32:58,000 --> 00:32:59,666
想向你们展示 Skia Graphite 的三个演示
786
00:32:59,666 --> 00:33:01,900
。 这是
787
00:33:01,900 --> 00:33:04,200
我们熟悉并喜爱的在 Skia Graphite 上运行的 Ski IO 世界示例
788
00:33:04,233 --> 00:33:06,700
。 这意味着在
789
00:33:06,700 --> 00:33:08,733
Android 上使用的是 Vulkan 而不是
790
00:33:08,733 --> 00:33:11,566
OpenGL。 最大的区别是,现在
791
00:33:11,600 --> 00:33:13,900
这个例子完全在专用线程上运行
792
00:33:13,900 --> 00:33:15,900
。 您
793
00:33:15,900 --> 00:33:18,300
不需要在 Canva 中更改任何内容。
794
00:33:18,300 --> 00:33:19,966
React Native Skia 将
795
00:33:20,000 --> 00:33:22,300
自动在专用线程上运行它,我们
796
00:33:22,300 --> 00:33:24,433
在 UI 线程上进行同步以进行
797
00:33:24,466 --> 00:33:27,566
屏幕渲染。 沒有問題。
798
00:33:27,600 --> 00:33:30,766
Skia 在 2D 任务方面表现最佳,例如
799
00:33:30,766 --> 00:33:33,066
路径几何、布尔路径运算符、
800
00:33:33,100 --> 00:33:36,200
文本布局等等。 现在您
801
00:33:36,233 --> 00:33:38,466
可以零成本将这些图元带入您的 3D
802
00:33:38,466 --> 00:33:41,733
场景。 这是在
803
00:33:41,733 --> 00:33:43,566
WebGPU 上运行的 3D 场景。 我们使用两个
804
00:33:43,600 --> 00:33:45,600
WebGPU 纹理来实现路径动画
805
00:33:45,600 --> 00:33:47,600
和文本布局。 但这里它们是
806
00:33:47,600 --> 00:33:50,300
使用 Skia 编写的。 借助 Graphite,
807
00:33:50,300 --> 00:33:53,233
我们可以将 3D 和 2D 场景
808
00:33:53,266 --> 00:33:56,133
相互组合。 我们也可以
809
00:33:56,133 --> 00:33:57,800
反过来做。 这里我们直接
810
00:33:57,833 --> 00:33:59,733
使用 WebGPU 纹理绘制了一幅疤痕
811
00:33:59,733 --> 00:34:02,100
。 这里的着色是使用
812
00:34:02,133 --> 00:34:04,366
计算玩具的计算着色器完成的。
813
00:34:04,433 --> 00:34:05,533
能够
814
00:34:05,766 --> 00:34:10,133
使用零成本 API 组成一流的 2D 和 3D 基元真是令人高兴
815
00:34:10,133 --> 00:34:12,600
。 这就是
816
00:34:12,633 --> 00:34:14,700
在 Graphite 上运行的 React Native Skia。 这
817
00:34:14,700 --> 00:34:17,500
还没有准备好在黄金时段播出,但我们正在
818
00:34:17,500 --> 00:34:20,033
努力。 这就是
819
00:34:20,066 --> 00:34:21,166
我今天早上想要向你们展示的两件事
820
00:34:21,200 --> 00:34:23,733
。 WebGPU 和 Skia 是
821
00:34:23,733 --> 00:34:25,633
同一枚硬币的两面。 我们遵循
822
00:34:25,666 --> 00:34:27,166
Google Chrome 图形堆栈的对称性,
823
00:34:27,433 --> 00:34:31,033
在其上运行 WebGPU 和 Skia graphite,并使
824
00:34:31,033 --> 00:34:32,866
这两个原语很好地
825
00:34:32,866 --> 00:34:35,000
相互组合。 感谢
826
00:34:35,033 --> 00:34:37,033
谷歌
827
00:34:37,033 --> 00:34:39,900
对这些开源项目的出色管理。
828
00:34:40,233 --> 00:34:41,066
能够
829
00:34:41,400 --> 00:34:46,000
在 React 的声明模型中使用这些强大的原语是一件非常令人愉快的事情
830
00:34:46,033 --> 00:34:48,600
。 然后就是我们,React
831
00:34:48,633 --> 00:34:50,533
Native 社区。 我们要尝试
832
00:34:50,533 --> 00:34:52,933
并开发像这样的社区驱动的解决方案
833
00:34:52,933 --> 00:34:55,866
。 而这只是
834
00:34:55,900 --> 00:34:57,566
谜团的一小部分。 目前正在开发许多令人
835
00:34:57,566 --> 00:34:59,566
兴奋的基层项目
836
00:34:59,566 --> 00:35:01,966
。 我想到的一个名字
837
00:35:02,000 --> 00:35:04,566
是 nitro
838
00:35:04,566 --> 00:35:07,400
模块。 现在,我
839
00:35:07,433 --> 00:35:09,300
今天早上向你们展示的很多东西都是相当
840
00:35:09,300 --> 00:35:11,633
实验性的。 所以,我们需要多给
841
00:35:11,666 --> 00:35:14,700
章鱼按摩一下。 我们会的。 在此
842
00:35:14,700 --> 00:35:16,533
过程中,我们会
843
00:35:16,533 --> 00:35:18,833
随时向您通报进展情况。 因此
844
00:35:18,866 --> 00:35:21,166
我确实期待着
845
00:35:21,200 --> 00:35:23,033
很快与您交谈。 直到下次,祝您
846
00:35:23,033 --> 00:35:25,300
happy hacking
847
00:35:25,300 --> 00:35:29,233
[音乐]
848
00:35:29,266 --> 00:35:31,300
我所有的烦恼都
849
00:35:31,300 --> 00:35:33,766
消失了,
850
00:35:33,800 --> 00:35:38,500
看着星星撞到
851
00:35:38,500 --> 00:35:41,733
天花板上。 心碎只是一种
852
00:35:41,733 --> 00:35:44,933
感觉。 基线蓝色让你想要
853
00:35:44,933 --> 00:35:48,200
动起来。
854
00:35:48,266 --> 00:35:52,933
哦。 我没有打架。 我想相信
855
00:35:52,933 --> 00:35:56,200
这一点。 心碎。 这只是一种
856
00:35:56,233 --> 00:35:59,100
感觉。 跳舞来克服
857
00:35:59,100 --> 00:36:03,033
你所经历的所有痛苦。 你经历过。
858
00:36:03,066 --> 00:36:04,333
哦。
859
00:36:04,366 --> 00:36:06,833
[音乐]
860
00:36:06,833 --> 00:36:11,766
N. 心碎。 心碎。
861
00:36:11,766 --> 00:36:17,066
[音乐]
862
00:36:17,133 --> 00:36:21,066
Heartbe 看着星星碰撞到
863
00:36:21,100 --> 00:36:25,100
天花板。 心碎只是一种
864
00:36:25,100 --> 00:36:28,200
感觉。 基线蓝色让你想要
865
00:36:28,666 --> 00:36:38,800
动起来。 我想相信这一点。 心高气昂。
866
00:36:38,800 --> 00:36:42,000
这只是一种在
867
00:36:42,000 --> 00:36:44,433
你所经历的所有痛苦中翩翩起舞的感觉。
868
00:36:44,433 --> 00:36:47,500
[音乐]
869
00:36:51,200 --> 00:36:58,200
[音乐]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment