- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
WebGL 获取的是 WebGLRenderingContext/WebGLRenderingContext2
对象,必须依赖于有合适宽度和高度的 HTMLCanvasElement
,通常命名为 gl
,gl 变量有非常多方法,允许修改 WebGL 的全局状态
const gl = document.getElementById("id")?.getContext("webgl")
// ...
而 WebGPU 则不依赖具体的 Canvas,它操作的是物理图形卡设备,并使用 ES6/7
的异步语法获取,获取的是 GPUAdapter
和 GPUDevice
,但是与 WebGLRenderingContext
起着类似“发出大多数命令”的大管家式角色的,更多是 GPUDevice
对象
const entryFn = async () => {
if (!navigator.gpu) {
return
}
// 测试版 Chrome 有可能返回 null
const adapter = await navigator.gpu.requestAdapter()
if (!adapter) {
return
}
const device = await adapter.requestDevice()
// ...
}
entryFn()
WebGPU 的入口是 navigator.gpu
对象,这个对象在 WebWorker 中也有,所以对 CPU 端的多线程有良好的支持。使用此对象异步请求适配器后,再使用适配器请求具象化的设备对象即可。
至于“适配器”和“设备”的概念界定,需要读者自行阅读 WebGPU Explainer、WebGPU Specification Core Object 等资料,前者大概是物理设备的一个变量符号,而根据不同的场景、线程需求再次请求“设备”,此设备并非物理设备,只是一个满足代码上下文所需要条件的、更实际的“对象”。
每次请求的适配器对象是不同的,不具备单例特征。
设备对象用于创建 WebGPU 中几乎所有的子类型,包括 GPUBuffer
、GPUTexture
等,以及访问一些自有属性,例如队列属性 device.queue
.
在 WebGLRenderingContext 时,允许传递一些参数:
const gl = canvasEle.getContext("webgl", {
alpha: false, // 是否包含透明度缓存区
antialias: false, // 是否开抗锯齿
depth: false, // 是否包含一个16位的深度缓冲区
stencil: false, // 是否包含一个8位的模板缓冲区
failIfMajorPerformanceCaveat: false, // 在系统性能低的环境中是否创建上下文
powerPreference: "high-performance", // GPU电源配置,"high-performance" 是高性能
preserveDrawingBuffer: false, // 是否保留缓冲区
premultipliedAlpha: false, // 是否预乘透明度通道
})
在请求 WebGPU 的适配器时,保留了性能选项(当前规范)powerPreference:
// in async function
const adapter = await navigator.gpu.requestAdapter({
powerPreference: "high-performance",
})
关于 requestAdapter 方法的参数,其类型 GPURequestAdapterOptions
定义,见下:
dictionary GPURequestAdapterOptions {
GPUPowerPreference powerPreference;
boolean forceFallbackAdapter = false;
};
enum GPUPowerPreference {
"low-power",
"high-performance",
};
forceFallbackAdapter
参数用得不多,有需要的读者可自行查询官方文档。
请求设备对象时,则允许传入 GPUDeviceDescriptor
参数对象,该对象允许有两个可选参数,一个是 requiredFeatures
,类型为 string[]
,另一个是 requiredLimits
,类型是键为 string 值为 number 的对象:
dictionary GPUDeviceDescriptor : GPUObjectDescriptorBase {
sequence<GPUFeatureName> requiredFeatures = [];
record<DOMString, GPUSize64> requiredLimits = {};
};
requireFeatures 数组的元素是字符串,不是随便填的,要参考 WebGPU Spec 24 功能索引表 中的功能。传递这个功能数组,就意味着要向适配器请求有这么多功能的设备对象;
requireLimits 则向图形处理器请求判断,我传递进来的这个要求,你能不能满足。
如果超过了适配器的 limits,那么请求将失败,适配器的 requestDevice 方法将返回一个 reject 的 Promise;
如果传入的限制条目的要求没有比全局默认值更好(有“更大更好”和“更小更好”,参考 WebGPU 第3章 中有关 limits 的表述),那就返回带默认值的设备对象,并 resolve Promise;
其中,限制条目有哪些,默认值是多少,对某个限制条目“更大值更好”还是“更小值更好”,要参考 WebGPU Spec 3.6 限制 中的表格。
上面这么说会比较抽象,下面举例说明。
例如下面这个例子,请求设备对象时,会问适配器能不能满足我要求的条件:
const device = await adapter.requestDevice({
maxBindGroups: 2,
maxUniformBuffersPerShaderStage: 4,
maxTextureDimension2D: 2048,
})
显然,请求的这三个条件都满足要求,返回的设备对象的限制列表都按所有限制条目的默认值来。
console.log(device.limits)
{
maxBindGroup: 4,
maxUniformBuffersPerShaderStage: 12,
maxTextureDimension2D: 8192,
// ...
}
关于这段,requiredLimits 的含义是“我的程序可能要这样的要求,你这个适配器能不能满足”,而不是“我要这么多要求,你给我返回一个这些参数的设备对象”。设备的创建过程,在 WebGPU Specification 的第 3 章,核心对象 - 设备中有详细描述。
WebGL 的请求参数包括了性能参数和功能参数,较为简单。
WebGPU 分成了两个阶段,请求适配器时可以对性能作要求,请求设备对象时可以对使用 GPU 时各个方面的参数作校验能不能满足程序要求。
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!