u could possibly shave a little time by doing something like
return (navigator.gpu && await new WebGPUEngine(this.canvas).initAsync ) || new Engine(this.canvas, true, this._option);
the logical or will shortcut and never be evaluated, whereas in ur current one, v8 will prep both branches.
But, one thing to consider is that webgpu and vulkan in general requires you to declare and compile stuff up front, so i think longer init time is probably unavoidable.
Also, the webgpu engine comes with twgsl, and idk if that done sequentially after calling init, but if it is, you’ll be network bound and could benefit from packaging it locally.