optimization mobie

This commit is contained in:
2026-04-26 20:43:36 +07:00
parent de16e11f0e
commit 25f3783f02
2 changed files with 47 additions and 21 deletions
+19 -8
View File
@@ -190,13 +190,13 @@ void main() {
outColor = color; outColor = color;
} }
`.trim(); `.trim();
const postProcessSource = `#version 300 es const postProcessSource = `#version 300 es
precision highp float; precision highp float;
in vec2 v_uv; in vec2 v_uv;
out vec4 outColor; out vec4 outColor;
uniform float u_isLowQuality;
uniform sampler2D u_mainTex; uniform sampler2D u_mainTex;
uniform float u_time; uniform float u_time;
uniform vec2 u_resolution; uniform vec2 u_resolution;
@@ -227,10 +227,11 @@ void main() {
// Если вышли за границы "пузатого" монитора // Если вышли за границы "пузатого" монитора
if (crt_uv.x < 0.0 || crt_uv.x > 1.0 || crt_uv.y < 0.0 || crt_uv.y > 1.0) { if (crt_uv.x < 0.0 || crt_uv.x > 1.0 || crt_uv.y < 0.0 || crt_uv.y > 1.0) {
outColor = vec4(current_bg, 1.0); // Теперь тут будет белый в светлой теме outColor = vec4(current_bg, 1.0);
return; return;
} }
// 1. Сначала считаем все искажения координат (они нужны всегда)
float glitch_trigger = step(1.0 - (0.02 * u_glitch_intensity), sin(u_time * 12.0 + crt_uv.y * 20.0)) * step(0.95, sin(u_time * 25.0)); float glitch_trigger = step(1.0 - (0.02 * u_glitch_intensity), sin(u_time * 12.0 + crt_uv.y * 20.0)) * step(0.95, sin(u_time * 25.0));
float tear_offset = glitch_trigger * 0.05 * sin(u_time * 50.0) * u_glitch_intensity; float tear_offset = glitch_trigger * 0.05 * sin(u_time * 50.0) * u_glitch_intensity;
vec2 final_uv = crt_uv + vec2(tear_offset, 0.0); vec2 final_uv = crt_uv + vec2(tear_offset, 0.0);
@@ -238,15 +239,25 @@ void main() {
float r_offset = u_aberration * (final_uv.x - 0.5); float r_offset = u_aberration * (final_uv.x - 0.5);
float b_offset = -u_aberration * (final_uv.x - 0.5); float b_offset = -u_aberration * (final_uv.x - 0.5);
// 2. Теперь делаем выборку из текстуры в зависимости от качества
vec4 base_color;
if (u_isLowQuality > 0.5) {
// На Xiaomi делаем только один проход (без аберрации)
base_color = texture(u_mainTex, final_uv);
} else {
// На ПК делаем 3 прохода со смещением каналов
float r = texture(u_mainTex, final_uv + vec2(r_offset, 0.0)).r; float r = texture(u_mainTex, final_uv + vec2(r_offset, 0.0)).r;
float g = texture(u_mainTex, final_uv).g; float g = texture(u_mainTex, final_uv).g;
float b = texture(u_mainTex, final_uv + vec2(b_offset, 0.0)).b; float b = texture(u_mainTex, final_uv + vec2(b_offset, 0.0)).b;
vec4 base_color = vec4(r, g, b, 1.0); base_color = vec4(r, g, b, 1.0);
if (glitch_trigger > 0.0) {
base_color.rgb = vec3(g, b, r) + (u_isDarkMode > 0.5 ? vec3(0.2) : vec3(-0.2));
} }
// 3. Применяем цветовые глитчи
if (glitch_trigger > 0.0) {
base_color.rgb = vec3(base_color.g, base_color.b, base_color.r) + (u_isDarkMode > 0.5 ? vec3(0.2) : vec3(-0.2));
}
// 4. Считаем виньетку, сканлайны и шум
float scanline = sin(final_uv.y * u_resolution.y * 3.1415) * 0.5 + 0.5; float scanline = sin(final_uv.y * u_resolution.y * 3.1415) * 0.5 + 0.5;
float vignette = final_uv.x * final_uv.y * (1.0 - final_uv.x) * (1.0 - final_uv.y); float vignette = final_uv.x * final_uv.y * (1.0 - final_uv.x) * (1.0 - final_uv.y);
vignette = clamp(pow(20.0 * vignette, 0.3), 0.0, 1.0); vignette = clamp(pow(20.0 * vignette, 0.3), 0.0, 1.0);
@@ -454,8 +465,8 @@ function updateDynamicScaling(now) {
let needsResize = false; let needsResize = false;
// Если FPS падает ниже ~45-50 (кадр дольше 22 мс) // Если FPS падает ниже ~45-50 (кадр дольше 22 мс)
if (avgDt > 22.0 && currentPixelScale > 0.5) { if (avgDt > 25.0 && currentPixelScale > 0.75) {
currentPixelScale = Math.max(0.5, currentPixelScale - 0.25); currentPixelScale -= 0.1;
needsResize = true; needsResize = true;
} }
// Если летит стабильно 60+ FPS (кадр меньше 15 мс) и мы не на максимуме // Если летит стабильно 60+ FPS (кадр меньше 15 мс) и мы не на максимуме
+25 -10
View File
@@ -62,9 +62,13 @@ struct GlitchBlock {
} }
impl GlitchBlock { impl GlitchBlock {
fn new(x: f32, y: f32, rng: &mut FastRng) -> Self { // Добавили параметр is_mobile
let w = rng.gen_range(20.0, 250.0); fn new(x: f32, y: f32, rng: &mut FastRng, is_mobile: bool) -> Self {
let h = rng.gen_range(5.0, 50.0); // На телефоне делаем глитчи и их разлет в 2.5 раза меньше (scale = 0.4)
let scale = if is_mobile { 0.4 } else { 1.0 };
let w = rng.gen_range(20.0 * scale, 250.0 * scale);
let h = rng.gen_range(5.0 * scale, 50.0 * scale);
let choice = rng.gen_usize(100); let choice = rng.gen_usize(100);
let color_type = match choice { let color_type = match choice {
@@ -75,9 +79,12 @@ impl GlitchBlock {
_ => 4.0, _ => 4.0,
}; };
// Радиус разброса осколков от центра клика
let scatter = 120.0 * scale;
Self { Self {
x: x - w / 2.0 + rng.gen_range(-120.0, 120.0), x: x - w / 2.0 + rng.gen_range(-scatter, scatter),
y: y - h / 2.0 + rng.gen_range(-120.0, 120.0), y: y - h / 2.0 + rng.gen_range(-scatter, scatter),
w, w,
h, h,
life: rng.gen_range(5.0, 25.0), life: rng.gen_range(5.0, 25.0),
@@ -233,7 +240,12 @@ impl MatrixEngine {
for (layer, scale, min_spd, max_spd) in layers.iter() { for (layer, scale, min_spd, max_spd) in layers.iter() {
let spacing = base_spacing * scale; let spacing = base_spacing * scale;
let columns = (self.width as f32 / spacing).ceil() as u32 + 20;
let columns = if self.is_mobile {
(self.width as f32 / spacing).ceil() as u32 + 5 // Меньше запасных колонок
} else {
(self.width as f32 / spacing).ceil() as u32 + 20
};
for i in 0..columns { for i in 0..columns {
let start_x = (i as f32 * spacing) - (10.0 * spacing); let start_x = (i as f32 * spacing) - (10.0 * spacing);
@@ -302,7 +314,7 @@ impl MatrixEngine {
let blocks_count = if self.is_mobile { 4 } else { 12 }; let blocks_count = if self.is_mobile { 4 } else { 12 };
for _ in 0..blocks_count { for _ in 0..blocks_count {
let block = GlitchBlock::new(x, y, &mut self.rng); let block = GlitchBlock::new(x, y, &mut self.rng, self.is_mobile); // Стало
self.glitch_blocks.push(block); self.glitch_blocks.push(block);
} }
} }
@@ -330,7 +342,7 @@ impl MatrixEngine {
let blocks_count = if self.is_mobile { 5 } else { 25 }; let blocks_count = if self.is_mobile { 5 } else { 25 };
for _ in 0..blocks_count { for _ in 0..blocks_count {
let block = GlitchBlock::new(x, y, &mut self.rng); let block = GlitchBlock::new(x, y, &mut self.rng, self.is_mobile); // Стало
self.glitch_blocks.push(block); self.glitch_blocks.push(block);
} }
self.update_mouse(x, y); self.update_mouse(x, y);
@@ -433,8 +445,10 @@ impl MatrixEngine {
if self.rng.gen_bool(0.01) { if self.rng.gen_bool(0.01) {
let rx = self.rng.gen_range(0.0, self.width as f32); let rx = self.rng.gen_range(0.0, self.width as f32);
let ry = self.rng.gen_range(0.0, self.height as f32); let ry = self.rng.gen_range(0.0, self.height as f32);
// Было: self.glitch_blocks.push(GlitchBlock::new(rx, ry, &mut self.rng));
// Стало:
self.glitch_blocks self.glitch_blocks
.push(GlitchBlock::new(rx, ry, &mut self.rng)); .push(GlitchBlock::new(rx, ry, &mut self.rng, self.is_mobile));
} }
if self.rng.gen_bool(0.002) { if self.rng.gen_bool(0.002) {
self.tear_y = self.rng.gen_range(0.0, self.height as f32); self.tear_y = self.rng.gen_range(0.0, self.height as f32);
@@ -519,7 +533,8 @@ impl MatrixEngine {
let dist = (dx * dx + dy * dy).sqrt(); let dist = (dx * dx + dy * dy).sqrt();
if (dist - sw.radius).abs() < 40.0 { if (dist - sw.radius).abs() < 40.0 {
let force = (sw.life / sw.max_life) * 18.0 * parallax_factor; let base_sw_force = if self.is_mobile { 6.0 } else { 18.0 }; // На мобилке импульс в 3 раза слабее
let force = (sw.life / sw.max_life) * base_sw_force * parallax_factor;
drop.vel_x += (dx / dist.max(1.0_f32)) * force; drop.vel_x += (dx / dist.max(1.0_f32)) * force;
force_white = true; force_white = true;
} }