영상 캐시 기능 추가: 시작 시 미리받기 + 동적 재생 + FIFO 축출 + 주소 / 자동제거

- config 에 preload(미리받기 갯수)/keep(유지 갯수) 추가
- 시작 시 1..preload 캐시 미리받기, 재생 중에도 preload 개 앞까지 롤링 prefetch
- 재생 시 캐시 있으면 video_N, 없으면 전체 URL 로 동적 선택(데이터팩 self-tracking)
- keep 초과 시 가장 먼저 받은 캐시부터 삭제(FIFO)
- namespace 끝 / 자동 제거(normalize)
- command_block 한 tick 1회 발동 제약 회피: cache add/remove 직접 실행, clear 는 schedule

Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
This commit is contained in:
Claude (owner)
2026-06-04 22:28:29 +09:00
parent 5e9e810e56
commit f98dd9952b
18 changed files with 85 additions and 25 deletions

View File

@@ -1,9 +1,12 @@
data modify storage mq:tmp video set from storage mq:main video
# 재생 진행에 맞춰 항상 preload 개 앞까지 캐시를 채운다.
# 현재 index 에서 (preload-1) 만큼 앞선 영상을 받아두면 시작 시 preload(1..N)
# 와 합쳐져 N개 버퍼가 굴러간다.
execute store result score cache_preload func.temp run data get storage mq:main video.preload
execute if score cache_preload func.temp matches ..0 run return 0
scoreboard players operation cache_idx func.temp = index main
scoreboard players add cache_idx func.temp 1
execute store result storage mq:tmp video.cache_num int 1 run scoreboard players get cache_idx func.temp
scoreboard players operation cache_target func.temp = index main
scoreboard players operation cache_target func.temp += cache_preload func.temp
scoreboard players remove cache_target func.temp 1
execute if score cache_target func.temp > max_index main run return 0
execute store result storage mq:tmp video.num int 1 run scoreboard players get index main
data modify storage mq:tmp video.cmd set value "cache"
function mq:videos/macro/cmd with storage mq:tmp video
function mq:videos/cache/add_one

View File

@@ -0,0 +1,4 @@
# cache_target(func.temp) 번 영상을 캐시에 추가. 매크로로 넘겨 등록/추적/축출.
data modify storage mq:tmp video set from storage mq:main video
execute store result storage mq:tmp video.num int 1 run scoreboard players get cache_target func.temp
function mq:videos/cache/macro/add_one with storage mq:tmp video

View File

@@ -1 +1,5 @@
function mq:videos/macro/custom {cmd: "videoCache clear"}
# 추적 목록을 비우고, 다음 tick 에 서버 소스로 전체 캐시 wipe.
# (videoCache clear 를 호출자 소스에서 바로 실행하면 player/비OP 소스일 때
# 권한 문제가 날 수 있어 schedule 로 서버 소스 보장.)
data modify storage mq:main video.cached set value []
schedule function mq:videos/cache/clear_run 1t

View File

@@ -0,0 +1 @@
videoCache clear

View File

@@ -0,0 +1,4 @@
# 캐시 갯수가 keep 을 넘으면 가장 먼저 받은 것부터(FIFO) 삭제.
execute store result score cache_len func.temp run data get storage mq:main video.cached
execute store result score cache_keep func.temp run data get storage mq:main video.keep
execute if score cache_len func.temp > cache_keep func.temp run function mq:videos/cache/evict_one

View File

@@ -0,0 +1,5 @@
execute store result storage mq:tmp evict_num int 1 run data get storage mq:main video.cached[0].i
function mq:videos/cache/macro/evict_one with storage mq:tmp
data remove storage mq:main video.cached[0]
# keep 보다 여러 개 초과해 있을 수 있으니 재귀로 다시 검사.
function mq:videos/cache/evict

View File

@@ -0,0 +1,7 @@
# 이미 받은 영상이면(추적 목록에 {i:num} 존재) 건너뜀.
$execute if data storage mq:main video.cached[{i:$(num)}] run return 0
# videoCache add 는 서버 소스(또는 OP)에서 직접 실행. preload/select 모두 서버
# 소스이므로 command_block 우회 없이 바로 호출 가능.
$videoCache add video_$(num) $(namespace)/$(num)
$data modify storage mq:main video.cached append value {i:$(num)}
function mq:videos/cache/evict

View File

@@ -0,0 +1 @@
$videoCache remove video_$(evict_num)

View File

@@ -0,0 +1,5 @@
# 게임 시작 시 1번부터 preload 번까지 캐시를 미리 받는다 (max_index 로 상한).
scoreboard players set cache_i func.temp 1
execute store result score cache_max func.temp run data get storage mq:main video.preload
execute if score cache_max func.temp > max_index main run scoreboard players operation cache_max func.temp = max_index main
function mq:videos/cache/preload_loop

View File

@@ -0,0 +1,5 @@
execute if score cache_i func.temp > cache_max func.temp run return 0
scoreboard players operation cache_target func.temp = cache_i func.temp
function mq:videos/cache/add_one
scoreboard players add cache_i func.temp 1
function mq:videos/cache/preload_loop