forked from Bitcoindefi/OpenAO
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhardware-acceleration.ts
More file actions
180 lines (159 loc) · 5.03 KB
/
Copy pathhardware-acceleration.ts
File metadata and controls
180 lines (159 loc) · 5.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
export type BrowserHardwareAccelerationHelp = {
browserLabel: string;
steps: string[];
};
export type HardwareAccelerationDiagnostics = {
enabled: boolean | null;
renderer: string | null;
details: string | null;
browserHelp: BrowserHardwareAccelerationHelp | null;
};
const SOFTWARE_RENDERER_PATTERN =
/swiftshader|llvmpipe|softpipe|software rasterizer|software|basic render/i;
export function getBrowserHardwareAccelerationHelp(
userAgent: string,
): BrowserHardwareAccelerationHelp | null {
const normalizedUserAgent = userAgent.toLowerCase();
if (/android|iphone|ipad|ipod|mobile/.test(normalizedUserAgent)) {
return null;
}
if (/firefox\//.test(normalizedUserAgent)) {
return {
browserLabel: "Firefox",
steps: [
"Abrí Configuración > General > Rendimiento.",
"Desactivá 'Usar la configuración de rendimiento recomendada' si hace falta.",
"Activá 'Usar aceleración de hardware cuando esté disponible' y reiniciá Firefox.",
],
};
}
if (/edg\//.test(normalizedUserAgent)) {
return {
browserLabel: "Edge",
steps: [
"Abrí Configuración > Sistema y rendimiento.",
"Activá 'Usar aceleración de gráficos cuando esté disponible'.",
"Reiniciá Edge para aplicar el cambio.",
],
};
}
if (
/opr\//.test(normalizedUserAgent) ||
/opera\//.test(normalizedUserAgent)
) {
return {
browserLabel: "Opera",
steps: [
"Abrí Configuración > Avanzado > Sistema.",
"Activá 'Usar aceleración de hardware cuando esté disponible'.",
"Reiniciá Opera para aplicar el cambio.",
],
};
}
if (
/chrome\//.test(normalizedUserAgent) ||
/chromium\//.test(normalizedUserAgent)
) {
return {
browserLabel: "Chrome o un navegador compatible",
steps: [
"Abrí Configuración > Sistema.",
"Activá 'Usar aceleración gráfica cuando esté disponible'.",
"Reiniciá el navegador para aplicar el cambio.",
],
};
}
return {
browserLabel: "tu navegador",
steps: [
"Abrí la configuración del navegador.",
"Buscá 'aceleración por hardware' o 'graphics acceleration' y activala.",
"Reiniciá el navegador para aplicar el cambio.",
],
};
}
function getWebGlContext(
canvas: HTMLCanvasElement,
attributes?: WebGLContextAttributes,
): WebGLRenderingContext | null {
return (
(canvas.getContext(
"webgl",
attributes,
) as WebGLRenderingContext | null) ??
(canvas.getContext(
"experimental-webgl",
attributes,
) as WebGLRenderingContext | null)
);
}
export function detectHardwareAccelerationDiagnostics(): HardwareAccelerationDiagnostics {
if (typeof window === "undefined") {
return {
enabled: null,
renderer: null,
details: null,
browserHelp: null,
};
}
const browserHelp = getBrowserHardwareAccelerationHelp(
window.navigator.userAgent,
);
if (!browserHelp) {
return {
enabled: null,
renderer: null,
details: null,
browserHelp: null,
};
}
const canvas = document.createElement("canvas");
const preferredContext = getWebGlContext(canvas, {
failIfMajorPerformanceCaveat: true,
});
const fallbackContext = preferredContext ?? getWebGlContext(canvas);
if (!fallbackContext) {
return {
enabled: false,
renderer: null,
details:
"El navegador no pudo iniciar WebGL para el render del juego.",
browserHelp,
};
}
let renderer = "";
try {
const debugInfo = fallbackContext.getExtension(
"WEBGL_debug_renderer_info",
);
const rawRenderer = debugInfo
? fallbackContext.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)
: fallbackContext.getParameter(fallbackContext.RENDERER);
renderer = typeof rawRenderer === "string" ? rawRenderer : "";
} catch {
renderer = "";
}
if (!preferredContext) {
return {
enabled: false,
renderer: renderer || null,
details:
"El navegador está usando una ruta gráfica degradada y puede perder FPS o fluidez.",
browserHelp,
};
}
if (renderer && SOFTWARE_RENDERER_PATTERN.test(renderer)) {
return {
enabled: false,
renderer,
details: `El navegador está renderizando con ${renderer}.`,
browserHelp,
};
}
return {
enabled: true,
renderer: renderer || null,
details: null,
browserHelp,
};
}