영상 모드 명령을 전부 command_block 큐로 우회 — 모드 없이도 게임 동작
videoCache add/remove/clear 까지 모든 모드 명령을 mcfunction 에서 직접 실행하지 않고 큐(mq:main video.cmdq)에 문자열로 적재한 뒤, 매 tick videos/drain 이 공용 command_block 으로 하나씩 실행(auto 0→1, 1회 실행 후 off)한다. 데이터팩 로드 시 모드 명령을 파싱하지 않으므로 영상 모드 미설치 상태에서도 데이터팩이 정상 로드/플레이된다. - preload/FIFO 축출 다건도 큐를 tick 당 1개씩 소진해 순서 보장 - cache 캐시 추적/dedup/src 결정(video_N vs 전체 URL)을 macro/cmd 로 통합 - 캐시 관련 파일 정리: add_one/preload_loop/evict_one/clear_run/ macro/add_one/macro/evict_one/resolve_src 제거, fill/drain/drain_off 도입 (videos 15→12 파일, cache/macro 폴더 제거) Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
This commit is contained in:
@@ -1,12 +1,8 @@
|
||||
# 재생 진행에 맞춰 항상 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_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
|
||||
|
||||
function mq:videos/cache/add_one
|
||||
# 라운드 진행 시 preload 윈도우의 맨 앞(index+preload-1) 한 개를 캐시에 추가.
|
||||
# 시작 preload 와 합쳐 항상 preload 개 버퍼가 굴러간다.
|
||||
execute store result score cache_lo func.temp run data get storage mq:main video.preload
|
||||
execute if score cache_lo func.temp matches ..0 run return 0
|
||||
scoreboard players operation cache_lo func.temp += index main
|
||||
scoreboard players remove cache_lo func.temp 1
|
||||
scoreboard players operation cache_hi func.temp = cache_lo func.temp
|
||||
function mq:videos/cache/fill
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
# 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
|
||||
@@ -1,5 +1,5 @@
|
||||
# 추적 목록을 비우고, 다음 tick 에 서버 소스로 전체 캐시 wipe.
|
||||
# (videoCache clear 를 호출자 소스에서 바로 실행하면 player/비OP 소스일 때
|
||||
# 권한 문제가 날 수 있어 schedule 로 서버 소스 보장.)
|
||||
# 추적 목록을 비우고 전체 캐시 wipe 를 큐에 적재 (command_block 으로 실행).
|
||||
data modify storage mq:main video.cached set value []
|
||||
schedule function mq:videos/cache/clear_run 1t
|
||||
data modify storage mq:tmp video set from storage mq:main video
|
||||
data modify storage mq:tmp video.cmd set value "cache_clear"
|
||||
function mq:videos/macro/cmd with storage mq:tmp video
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
videoCache clear
|
||||
@@ -1,4 +1,12 @@
|
||||
# 캐시 갯수가 keep 을 넘으면 가장 먼저 받은 것부터(FIFO) 삭제.
|
||||
execute store result score cache_len func.temp run data get storage mq:main video.cached
|
||||
# 추적 캐시 갯수가 keep 을 넘으면 가장 먼저 받은 것부터(FIFO) 제거 큐에 적재.
|
||||
# keep<=0 이면 무제한으로 보고 축출하지 않는다.
|
||||
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
|
||||
execute if score cache_keep func.temp matches ..0 run return 0
|
||||
execute store result score cache_len func.temp run data get storage mq:main video.cached
|
||||
execute if score cache_len func.temp <= cache_keep func.temp run return 0
|
||||
data modify storage mq:tmp video set from storage mq:main video
|
||||
data modify storage mq:tmp video.num set from storage mq:main video.cached[0].i
|
||||
data modify storage mq:tmp video.cmd set value "cache_remove"
|
||||
function mq:videos/macro/cmd with storage mq:tmp video
|
||||
data remove storage mq:main video.cached[0]
|
||||
function mq:videos/cache/evict
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
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
|
||||
11
music_quiz/data/mq/function/videos/cache/fill.mcfunction
vendored
Normal file
11
music_quiz/data/mq/function/videos/cache/fill.mcfunction
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# cache_lo..cache_hi 범위의 영상을 캐시 큐에 등록한다 (max_index 상한).
|
||||
# 등록 후 keep 초과분은 FIFO 로 축출. 실제 videoCache add/remove 는 큐를 통해
|
||||
# command_block 으로 실행되므로 모드 없이도 로드된다.
|
||||
execute if score cache_lo func.temp > cache_hi func.temp run return run function mq:videos/cache/evict
|
||||
execute if score cache_lo func.temp > max_index main run return run function mq:videos/cache/evict
|
||||
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_lo func.temp
|
||||
data modify storage mq:tmp video.cmd set value "cache_add"
|
||||
function mq:videos/macro/cmd with storage mq:tmp video
|
||||
scoreboard players add cache_lo func.temp 1
|
||||
function mq:videos/cache/fill
|
||||
@@ -1,7 +0,0 @@
|
||||
# 이미 받은 영상이면(추적 목록에 {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
|
||||
@@ -1 +0,0 @@
|
||||
$videoCache remove video_$(evict_num)
|
||||
@@ -1,5 +1,6 @@
|
||||
# 게임 시작 시 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
|
||||
# 게임 시작 시 1번부터 preload 번까지 캐시를 미리 등록한다.
|
||||
execute store result score cache_lo func.temp run data get storage mq:main video.preload
|
||||
execute if score cache_lo func.temp matches ..0 run return 0
|
||||
scoreboard players operation cache_hi func.temp = cache_lo func.temp
|
||||
scoreboard players set cache_lo func.temp 1
|
||||
function mq:videos/cache/fill
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
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
|
||||
Reference in New Issue
Block a user