optimization mobie
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
float r = texture(u_mainTex, final_uv + vec2(r_offset, 0.0)).r;
|
// 2. Теперь делаем выборку из текстуры в зависимости от качества
|
||||||
float g = texture(u_mainTex, final_uv).g;
|
vec4 base_color;
|
||||||
float b = texture(u_mainTex, final_uv + vec2(b_offset, 0.0)).b;
|
if (u_isLowQuality > 0.5) {
|
||||||
vec4 base_color = vec4(r, g, b, 1.0);
|
// На Xiaomi делаем только один проход (без аберрации)
|
||||||
|
base_color = texture(u_mainTex, final_uv);
|
||||||
if (glitch_trigger > 0.0) {
|
} else {
|
||||||
base_color.rgb = vec3(g, b, r) + (u_isDarkMode > 0.5 ? vec3(0.2) : vec3(-0.2));
|
// На ПК делаем 3 прохода со смещением каналов
|
||||||
|
float r = texture(u_mainTex, final_uv + vec2(r_offset, 0.0)).r;
|
||||||
|
float g = texture(u_mainTex, final_uv).g;
|
||||||
|
float b = texture(u_mainTex, final_uv + vec2(b_offset, 0.0)).b;
|
||||||
|
base_color = vec4(r, g, b, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user