Reduce mobile canvas memory usage
This commit is contained in:
parent
da8ae49a72
commit
c0f7f5fbd8
|
|
@ -2,6 +2,8 @@
|
||||||
const GRID_SIZE = 50;
|
const GRID_SIZE = 50;
|
||||||
const TILE_SIZE = 64;
|
const TILE_SIZE = 64;
|
||||||
const ARENA_SIZE = GRID_SIZE * TILE_SIZE;
|
const ARENA_SIZE = GRID_SIZE * TILE_SIZE;
|
||||||
|
const VIEWPORT_SIZE = 1600;
|
||||||
|
const CAMERA_ZOOM_SCALE = VIEWPORT_SIZE / ARENA_SIZE;
|
||||||
|
|
||||||
export const ARENA = {
|
export const ARENA = {
|
||||||
GRID_SIZE,
|
GRID_SIZE,
|
||||||
|
|
@ -9,6 +11,11 @@ export const ARENA = {
|
||||||
SIZE: ARENA_SIZE,
|
SIZE: ARENA_SIZE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const RENDER = {
|
||||||
|
VIEWPORT_SIZE,
|
||||||
|
CAMERA_ZOOM_SCALE,
|
||||||
|
};
|
||||||
|
|
||||||
// 2. FIGHTER 도메인
|
// 2. FIGHTER 도메인
|
||||||
export const FIGHTER = {
|
export const FIGHTER = {
|
||||||
SCALE: 3,
|
SCALE: 3,
|
||||||
|
|
@ -235,13 +242,13 @@ export const SPECIAL_EFFECT = {
|
||||||
alpha: 1,
|
alpha: 1,
|
||||||
},
|
},
|
||||||
CAMERA: {
|
CAMERA: {
|
||||||
ZOOM: 3,
|
ZOOM: 3 * CAMERA_ZOOM_SCALE,
|
||||||
CENTER_ON_CASTER_AT_START: true,
|
CENTER_ON_CASTER_AT_START: true,
|
||||||
ZOOM_IN_MS: 720,
|
ZOOM_IN_MS: 720,
|
||||||
HOLD_MS: 1100,
|
HOLD_MS: 1100,
|
||||||
ZOOM_OUT_MS: 1300,
|
ZOOM_OUT_MS: 1300,
|
||||||
LERP: 0.045,
|
LERP: 0.045,
|
||||||
PROJECTILE_VIEW_ZOOM: 1,
|
PROJECTILE_VIEW_ZOOM: 1 * CAMERA_ZOOM_SCALE,
|
||||||
PROJECTILE_ZOOM_OUT_MS: 300,
|
PROJECTILE_ZOOM_OUT_MS: 300,
|
||||||
},
|
},
|
||||||
FOCUS_LAYER: {
|
FOCUS_LAYER: {
|
||||||
|
|
@ -330,31 +337,31 @@ export const WORLD_EFFECT = {
|
||||||
|
|
||||||
// 7. CAMERA 도메인
|
// 7. CAMERA 도메인
|
||||||
export const CAMERA = {
|
export const CAMERA = {
|
||||||
MIN_ZOOM: 1,
|
MIN_ZOOM: 1 * CAMERA_ZOOM_SCALE,
|
||||||
MAX_ZOOM: 3,
|
MAX_ZOOM: 3 * CAMERA_ZOOM_SCALE,
|
||||||
ZOOM_STEP: 0.1,
|
ZOOM_STEP: 0.1 * CAMERA_ZOOM_SCALE,
|
||||||
// 자동 관전 진입 전 화염/냉기 메테오 낙하 위치를 임시로 확대 추적합니다.
|
// 자동 관전 진입 전 화염/냉기 메테오 낙하 위치를 임시로 확대 추적합니다.
|
||||||
METEOR_FOCUS_ENABLED: false,
|
METEOR_FOCUS_ENABLED: false,
|
||||||
METEOR_FOCUS_ZOOM: 2,
|
METEOR_FOCUS_ZOOM: 2 * CAMERA_ZOOM_SCALE,
|
||||||
SPECTATOR_LERP: 0.01,
|
SPECTATOR_LERP: 0.01,
|
||||||
// 메테오 착탄 후 카메라를 해당 위치에 유지하는 시간(ms)입니다.
|
// 메테오 착탄 후 카메라를 해당 위치에 유지하는 시간(ms)입니다.
|
||||||
METEOR_FOCUS_HOLD_DURATION: 1200,
|
METEOR_FOCUS_HOLD_DURATION: 1200,
|
||||||
SPECTATOR_FINAL_FIGHTER_THRESHOLD: 5,
|
SPECTATOR_FINAL_FIGHTER_THRESHOLD: 5,
|
||||||
SPECTATOR_FINAL_FIGHT_ZOOM: 3,
|
SPECTATOR_FINAL_FIGHT_ZOOM: 3 * CAMERA_ZOOM_SCALE,
|
||||||
SPECTATOR_FINAL_TEAM_COUNT: 2,
|
SPECTATOR_FINAL_TEAM_COUNT: 2,
|
||||||
SPECTATOR_FINAL_TEAM_TOTAL_THRESHOLD: 8,
|
SPECTATOR_FINAL_TEAM_TOTAL_THRESHOLD: 8,
|
||||||
SPECTATOR_RANDOM_FOCUS_INTERVAL: 10000,
|
SPECTATOR_RANDOM_FOCUS_INTERVAL: 10000,
|
||||||
SPECTATOR_LATE_FIGHTER_THRESHOLD: 500,
|
SPECTATOR_LATE_FIGHTER_THRESHOLD: 500,
|
||||||
SPECTATOR_LATE_FIGHT_ZOOM: 2,
|
SPECTATOR_LATE_FIGHT_ZOOM: 2 * CAMERA_ZOOM_SCALE,
|
||||||
SELECTED_FIGHTER_ZOOM: 2,
|
SELECTED_FIGHTER_ZOOM: 2 * CAMERA_ZOOM_SCALE,
|
||||||
};
|
};
|
||||||
|
|
||||||
// 8. UI 도메인
|
// 8. UI 도메인
|
||||||
export const UI = {
|
export const UI = {
|
||||||
MINIMAP_ALPHA: 0.8,
|
MINIMAP_ALPHA: 0.8,
|
||||||
MINIMAP_MARGIN: Math.round(ARENA_SIZE * 0.016),
|
MINIMAP_MARGIN: Math.round(VIEWPORT_SIZE * 0.016),
|
||||||
MINIMAP_VIEWPORT_SIZE: Math.round(ARENA_SIZE * 0.22),
|
MINIMAP_VIEWPORT_SIZE: Math.round(VIEWPORT_SIZE * 0.22),
|
||||||
MINIMAP_VIEW_FRAME_STROKE: 10,
|
MINIMAP_VIEW_FRAME_STROKE: Math.max(4, Math.round(VIEWPORT_SIZE * 0.003125)),
|
||||||
SELECTED_FIGHTER_OUTLINE_GAP: 1,
|
SELECTED_FIGHTER_OUTLINE_GAP: 1,
|
||||||
SELECTED_FIGHTER_OUTLINE_WIDTH: 1,
|
SELECTED_FIGHTER_OUTLINE_WIDTH: 1,
|
||||||
SELECTED_FIGHTER_OUTLINE_RED: 255,
|
SELECTED_FIGHTER_OUTLINE_RED: 255,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import Phaser from "phaser";
|
import Phaser from "phaser";
|
||||||
import { ARENA, FIGHTER, SPECIAL_EFFECT } from "../../constants.js";
|
import { ARENA, FIGHTER, RENDER, SPECIAL_EFFECT } from "../../constants.js";
|
||||||
import {
|
import {
|
||||||
applySpecialEffectInstantKill,
|
applySpecialEffectInstantKill,
|
||||||
disposeCombatObject,
|
disposeCombatObject,
|
||||||
|
|
@ -1032,6 +1032,13 @@ function shouldDrawInSpecialFocusSnapshot(
|
||||||
}
|
}
|
||||||
|
|
||||||
function canCreateArenaRenderTexture(scene) {
|
function canCreateArenaRenderTexture(scene) {
|
||||||
|
if (
|
||||||
|
isMobileRuntime()
|
||||||
|
&& ARENA.SIZE * ARENA.SIZE > RENDER.VIEWPORT_SIZE * RENDER.VIEWPORT_SIZE
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
const renderer = scene.game?.renderer;
|
const renderer = scene.game?.renderer;
|
||||||
const gl = renderer?.gl;
|
const gl = renderer?.gl;
|
||||||
|
|
||||||
|
|
@ -1039,7 +1046,21 @@ function canCreateArenaRenderTexture(scene) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return gl.getParameter(gl.MAX_TEXTURE_SIZE) >= ARENA.SIZE;
|
return Math.min(
|
||||||
|
gl.getParameter(gl.MAX_TEXTURE_SIZE),
|
||||||
|
gl.getParameter(gl.MAX_RENDERBUFFER_SIZE),
|
||||||
|
) >= ARENA.SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isMobileRuntime() {
|
||||||
|
const navigator = globalThis.navigator;
|
||||||
|
const userAgent = navigator?.userAgent ?? "";
|
||||||
|
|
||||||
|
return Boolean(
|
||||||
|
navigator?.userAgentData?.mobile
|
||||||
|
|| /Android|iPhone|iPad|iPod/i.test(userAgent)
|
||||||
|
|| globalThis.matchMedia?.("(pointer: coarse) and (max-width: 960px)")?.matches,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function destroySpecialFocusLayer(scene, state) {
|
function destroySpecialFocusLayer(scene, state) {
|
||||||
|
|
|
||||||
11
src/main.js
11
src/main.js
|
|
@ -1,7 +1,7 @@
|
||||||
import Phaser from "phaser";
|
import Phaser from "phaser";
|
||||||
import { ArenaScene } from "./game/arena/ArenaScene.js";
|
import { ArenaScene } from "./game/arena/ArenaScene.js";
|
||||||
import {
|
import {
|
||||||
ARENA,
|
RENDER,
|
||||||
SPAWN,
|
SPAWN,
|
||||||
} from "./constants.js";
|
} from "./constants.js";
|
||||||
import { createMatchForm } from "./ui/matchForm.js";
|
import { createMatchForm } from "./ui/matchForm.js";
|
||||||
|
|
@ -181,10 +181,15 @@ const arenaScene = new ArenaScene({
|
||||||
const game = new Phaser.Game({
|
const game = new Phaser.Game({
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
parent: "game",
|
parent: "game",
|
||||||
width: ARENA.SIZE,
|
width: RENDER.VIEWPORT_SIZE,
|
||||||
height: ARENA.SIZE,
|
height: RENDER.VIEWPORT_SIZE,
|
||||||
pixelArt: true,
|
pixelArt: true,
|
||||||
backgroundColor: "#282819",
|
backgroundColor: "#282819",
|
||||||
|
render: {
|
||||||
|
antialias: false,
|
||||||
|
pixelArt: true,
|
||||||
|
roundPixels: true,
|
||||||
|
},
|
||||||
physics: {
|
physics: {
|
||||||
default: "arcade",
|
default: "arcade",
|
||||||
arcade: {
|
arcade: {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue