DeviceFeatures
设备能力的集合式查询对象:判断某项特性是否存在,或遍历当前全部可用特性。
由设备创建时确定,运行期不变。
方法
| 方法 | 返回 | 说明 |
|---|---|---|
has(feature) | boolean | 指定特性是否可用 |
[Symbol.iterator]() | 迭代器 | 遍历当前全部可用特性 |
特性名来自 DeviceFeature 类型,涵盖纹理压缩、浮点渲染、
多画布等后端能力。具体名称以所用版本的声明文件为准,
不要在代码里凭记忆拼字符串。
按能力分支
function requireFeatures(device, required) {
const missing = required.filter(function (feature) {
return !device.features.has(feature);
});
if (missing.length) {
console.warn('缺少设备特性', missing);
return false;
}
return true;
}
/* 需要的特性名从配置或常量表里读,不在这里硬编码 */
const ok = requireFeatures(device, config.requiredFeatures);
分支的目的不是拿到某个固定格式,而是避免在不支持的设备上创建失败。
特性名必须与 DeviceFeature 类型里的字面量一致,
拼错时 has 只会返回 false,不会提示拼写错误。
列出全部特性
const list = [];
for (const feature of device.features) {
list.push(feature);
}
console.log(list.length, list);
排查「为什么这台机器上纹理是黑的」时,先把完整列表打出来, 对照代码里依赖的特性逐项确认,比逐条猜要快。
能力与上限的分工
| 对象 | 回答的问题 |
|---|---|
device.features | 某项功能是否可用,布尔判断 |
device.limits | 尺寸、数量、绑定槽位的上限数值 |
device.info | 显卡型号、版本、着色语言等描述信息 |
有特性不等于能直接用:压缩纹理还需要检查具体格式是否支持,
用 device.isTextureFormatSupported 再确认一次。
WebGL 与 WebGPU 的差异
同一项能力在两种后端上的判定方式不同:WebGPU 看设备请求到的特性,
WebGL 看扩展是否存在。应用层用同一套 has 调用,
但要知道某些特性只在其中一种后端上为真。
不要在模块顶层做能力判断。 设备是异步创建的,模块加载时还没有实例。 能力分支放在设备创建后的初始化函数里,或延迟到首次使用时。
经纬志(2026)。《DeviceFeatures》。https://www.jingweizhi.com/lumagl/api/device-features.html(访问日期 2026-11-03)。