pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 6.34 kB
Source Map (JSON)
{"version":3,"file":"autoDetectRenderer.mjs","sources":["../../../src/rendering/renderers/autoDetectRenderer.ts"],"sourcesContent":["import { isWebGLSupported } from '../../utils/browser/isWebGLSupported';\nimport { isWebGPUSupported } from '../../utils/browser/isWebGPUSupported';\nimport { AbstractRenderer } from './shared/system/AbstractRenderer';\n\nimport type { CanvasOptions } from './canvas/CanvasRenderer';\nimport type { WebGLOptions } from './gl/WebGLRenderer';\nimport type { WebGPUOptions } from './gpu/WebGPURenderer';\nimport type { Renderer, RendererOptions } from './types';\n\n/**\n * Options for {@link autoDetectRenderer}.\n * @category rendering\n * @advanced\n */\nexport interface AutoDetectOptions extends RendererOptions\n{\n /** The preferred renderer type. WebGPU is recommended as its generally faster than WebGL. */\n preference?: 'webgl' | 'webgpu' | 'canvas';\n /** Optional WebGPUOptions to pass only to WebGPU renderer. */\n webgpu?: Partial<WebGPUOptions>;\n /** Optional WebGLOptions to pass only to the WebGL renderer */\n webgl?: Partial<WebGLOptions>;\n /** Optional CanvasOptions to pass only to the Canvas renderer */\n canvasOptions?: Partial<CanvasOptions>;\n}\n\nconst renderPriority = ['webgl', 'webgpu', 'canvas'];\n\n/**\n * Automatically determines the most appropriate renderer for the current environment.\n *\n * The function will prioritize the WebGL renderer as it is the most tested safe API to use.\n * In the near future as WebGPU becomes more stable and ubiquitous, it will be prioritized over WebGL.\n *\n * The selected renderer's code is then dynamically imported to optimize\n * performance and minimize the initial bundle size.\n *\n * To maximize the benefits of dynamic imports, it's recommended to use a modern bundler\n * that supports code splitting. This will place the renderer code in a separate chunk,\n * which is loaded only when needed.\n * @example\n *\n * // create a renderer\n * const renderer = await autoDetectRenderer({\n * width: 800,\n * height: 600,\n * antialias: true,\n * });\n *\n * // custom for each renderer\n * const renderer = await autoDetectRenderer({\n * width: 800,\n * height: 600,\n * webgpu:{\n * antialias: true,\n * backgroundColor: 'red'\n * },\n * webgl:{\n * antialias: true,\n * backgroundColor: 'green'\n * }\n * });\n * @param options - A partial configuration object based on the `AutoDetectOptions` type.\n * @returns A Promise that resolves to an instance of the selected renderer.\n * @category rendering\n * @standard\n */\nexport async function autoDetectRenderer(options: Partial<AutoDetectOptions>): Promise<Renderer>\n{\n let preferredOrder: string[] = [];\n\n if (options.preference)\n {\n preferredOrder.push(options.preference);\n\n renderPriority.forEach((item) =>\n {\n if (item !== options.preference)\n {\n preferredOrder.push(item);\n }\n });\n }\n else\n {\n preferredOrder = renderPriority.slice();\n }\n\n let RendererClass: new () => Renderer;\n let finalOptions: Partial<AutoDetectOptions> = {};\n\n for (let i = 0; i < preferredOrder.length; i++)\n {\n const rendererType = preferredOrder[i];\n\n if (rendererType === 'webgpu' && (await isWebGPUSupported()))\n {\n const { WebGPURenderer } = await import('./gpu/WebGPURenderer');\n\n RendererClass = WebGPURenderer;\n\n finalOptions = { ...options, ...options.webgpu };\n\n break;\n }\n else if (\n rendererType === 'webgl'\n && isWebGLSupported(\n options.failIfMajorPerformanceCaveat\n ?? AbstractRenderer.defaultOptions.failIfMajorPerformanceCaveat\n )\n )\n {\n const { WebGLRenderer } = await import('./gl/WebGLRenderer');\n\n RendererClass = WebGLRenderer;\n\n finalOptions = { ...options, ...options.webgl };\n\n break;\n }\n else if (rendererType === 'canvas')\n {\n const { CanvasRenderer } = await import('./canvas/CanvasRenderer');\n\n RendererClass = CanvasRenderer;\n\n finalOptions = { ...options, ...options.canvasOptions };\n\n break;\n }\n }\n\n delete finalOptions.webgpu;\n delete finalOptions.webgl;\n delete finalOptions.canvasOptions;\n\n if (!RendererClass)\n {\n throw new Error('No available renderer for the current environment');\n }\n\n const renderer = new RendererClass();\n\n await renderer.init(finalOptions);\n\n return renderer;\n}\n"],"names":[],"mappings":";;;;;AA0BA,MAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAA;AAyCnD,eAAsB,mBAAmB,OAAA,EACzC;AACI,EAAA,IAAI,iBAA2B,EAAC;AAEhC,EAAA,IAAI,QAAQ,UAAA,EACZ;AACI,IAAA,cAAA,CAAe,IAAA,CAAK,QAAQ,UAAU,CAAA;AAEtC,IAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,IAAA,KACxB;AACI,MAAA,IAAI,IAAA,KAAS,QAAQ,UAAA,EACrB;AACI,QAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,MAC5B;AAAA,IACJ,CAAC,CAAA;AAAA,EACL,CAAA,MAEA;AACI,IAAA,cAAA,GAAiB,eAAe,KAAA,EAAM;AAAA,EAC1C;AAEA,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,eAA2C,EAAC;AAEhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAC3C;AACI,IAAA,MAAM,YAAA,GAAe,eAAe,CAAC,CAAA;AAErC,IAAA,IAAI,YAAA,KAAiB,QAAA,IAAa,MAAM,iBAAA,EAAkB,EAC1D;AACI,MAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,0BAAsB,CAAA;AAE9D,MAAA,aAAA,GAAgB,cAAA;AAEhB,MAAA,YAAA,GAAe,EAAE,GAAG,OAAA,EAAS,GAAG,QAAQ,MAAA,EAAO;AAE/C,MAAA;AAAA,IACJ,CAAA,MAAA,IAEI,iBAAiB,OAAA,IACd,gBAAA;AAAA,MACC,OAAA,CAAQ,4BAAA,IACD,gBAAA,CAAiB,cAAA,CAAe;AAAA,KAC3C,EAEJ;AACI,MAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,wBAAoB,CAAA;AAE3D,MAAA,aAAA,GAAgB,aAAA;AAEhB,MAAA,YAAA,GAAe,EAAE,GAAG,OAAA,EAAS,GAAG,QAAQ,KAAA,EAAM;AAE9C,MAAA;AAAA,IACJ,CAAA,MAAA,IACS,iBAAiB,QAAA,EAC1B;AACI,MAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,6BAAyB,CAAA;AAEjE,MAAA,aAAA,GAAgB,cAAA;AAEhB,MAAA,YAAA,GAAe,EAAE,GAAG,OAAA,EAAS,GAAG,QAAQ,aAAA,EAAc;AAEtD,MAAA;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,OAAO,YAAA,CAAa,MAAA;AACpB,EAAA,OAAO,YAAA,CAAa,KAAA;AACpB,EAAA,OAAO,YAAA,CAAa,aAAA;AAEpB,EAAA,IAAI,CAAC,aAAA,EACL;AACI,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,aAAA,EAAc;AAEnC,EAAA,MAAM,QAAA,CAAS,KAAK,YAAY,CAAA;AAEhC,EAAA,OAAO,QAAA;AACX;;;;"}