主题
资源管理
Behemiron 提供统一的客户端资源管理系统,支持来自文件系统和压缩包的图片、视频和普通文件、目录资源。GIF使用为 Blaze3D 优化的解码器,视频使用 ffmpeg 硬解,最高支持 8k60 直出
概念导图
资源目录
所有资源位于游戏目录下的 Behemiron/ 文件夹:
.minecraft/
└── Behemiron/
├── textures/ # 图片资源
│ ├── icon.png
│ └── background.gif
├── videos/ # 视频资源
│ └── intro.mp4
├── data/ # 数据文件
│ └── config.json
└── resources.zip # ZIP 资源包基本用法
获取资源
使用 ResourceManager 获取资源:
kotlin
import com.behemiron.engine.forge.core.resource.ResourceManager
// 获取 PNG 图片
val png = ResourceManager.getResource<PngData>("textures/icon.png")
// 获取 GIF 动画
val gif = ResourceManager.getResource<GifData>("textures/loading.gif")
// 获取视频
val video = ResourceManager.getResource<VideoData>("videos/intro.mp4")
// 获取通用文件
val file = ResourceManager.getResource<FileData>("data/config.json")
// 获取目录
val dir = ResourceManager.getResource<DirectoryData>("textures/")获取并绑定纹理
对于需要渲染的资源,使用 getResourceAndBind:
kotlin
// 获取资源并绑定到纹理单元 0
val texture = ResourceManager.getResourceAndBind<PngData>("textures/icon.png")预加载资源
异步预加载资源以提升性能:
kotlin
// 预加载匹配的资源
ResourceManager.preload("textures/*.png")
ResourceManager.preload("videos/*.mp4")资源类型
PngData - PNG 图片
kotlin
val png = ResourceManager.getResource<PngData>("textures/icon.png")
// 获取 ResourceLocation(用于 Minecraft 渲染)
val location = png?.getResourceLocation()
// 绑定纹理
png?.bind()
// 释放资源
png?.unload()GifData - GIF 动画
kotlin
val gif = ResourceManager.getResource<GifData>("textures/loading.gif")
// 获取当前帧的 ResourceLocation(根据时间自动计算)
val currentFrame = gif?.getResourceLocation()
// 绑定当前帧
gif?.bind()VideoData - 视频
视频资源支持完整的播放控制:
kotlin
val video = ResourceManager.getResource<VideoData>("videos/intro.mp4")
// 播放控制
video?.play()
video?.pause()
video?.stop()
// 跳转
video?.seekToTime(5000L) // 跳转到 5 秒
video?.seekToFrame(120) // 跳转到第 120 帧
// 播放速度(0.25 ~ 4.0)
video?.setPlaybackSpeed(1.5f)
// 音量(0.0 ~ 1.0)
video?.setVolume(0.8f)
// 状态查询
video?.isPlaying()
video?.isPaused()
video?.isBuffering()FileData - 通用文件
kotlin
val file = ResourceManager.getResource<FileData>("data/config.json")
// 获取文本内容(UTF-8)
val text = file?.getText()
// 获取字节数组
val bytes = file?.getBytes()
// 获取输入流(可多次读取)
val stream = file?.getInputStream()DirectoryData - 目录
kotlin
val dir = ResourceManager.getResource<DirectoryData>("textures/")
// 列出所有文件
val allFiles = dir?.list()
// 按扩展名过滤
val pngFiles = dir?.list("png", "jpg")
// 打开目录中的文件
val stream = dir?.open("icon.png")ZIP 资源包
基本使用
将资源打包为 ZIP 放入 Behemiron/ 目录,系统会自动识别:
Behemiron/
├── textures/ # 文件系统资源(优先)
└── resources.zip # ZIP 资源包
└── textures/
└── icon.png优先级
文件系统资源优先于 ZIP 资源包。相同路径的资源,文件系统中的版本会覆盖 ZIP 中的版本。
加密 ZIP
支持加密的 ZIP 资源包:
kotlin
// 设置 ZIP 密码
ResourceManager.setZipPasswords(mapOf(
"resources.zip" to "password123",
"dlc.zip" to "dlcPassword"
))最佳实践
1. 使用预加载
kotlin
// ✅ 推荐:预加载常用资源
ResourceManager.preload("textures/ui/*.png")
// ❌ 不推荐:运行时频繁加载
fun render() {
val icon = ResourceManager.getResource<PngData>("textures/icon.png")
// ...
}2. 及时释放资源
kotlin
// 不再需要时释放
video?.stop()
video?.unload()