贴图来源(ITexture)

基本信息

属性 值
接口 lumien.custommainmenu.lib.textures.ITexture(唯一方法 void bind())
分发器 GuiConfig.getWantedTexture(GuiConfig.java:381-387)
实现数 2

解析规则

public static ITexture getWantedTexture(String textureString) {
    if (textureString.startsWith("web:")) {
        return new TextureURL(textureString.substring(4));
    }
    return new TextureResourceLocation(textureString);
}
写法 实现类 说明
web:<URL> TextureURL 后台线程下载图片,异步上传到 GL
domain:path(如 custommainmenu:textures/gui/minecraft.png) TextureResourceLocation 继承原版 ResourceLocation,走游戏资源管线
裸路径(如 texts/splashes.txt 无域) TextureResourceLocation ResourceLocation 默认域为 minecraft

⚠️ 本 mod 不打包任何贴图资源到 ResourceLocation 之外的通道——3 张贴图全在 assets/custommainmenu/textures/gui/ 下(minecraft.png / buttons.png / transparent.png),都靠 TextureResourceLocation 加载,均有引用、无孤儿资源。

三个 bind() 实现路径

状态 行为
textureID != -1 GlStateManager.bindTexture(textureID)
textureID == -1 且 bi != null 先 TextureUtil.uploadTextureImageAllocate(glGenTextures(), bi, ...) 上传,再递归 bind()
textureID == -1 且 bi == null 回退绑 custommainmenu:textures/gui/transparent.png(CustomMainMenu.bindTransparent)

透明回退是本 mod 唯一内建的容错:URL 还没下完(bi 仍为 null)时不会画出错图或崩,而是先显示透明图。这对主菜单启动瞬间很重要。

TextureResourceLocation 的设计

它直接继承 net.minecraft.util.ResourceLocation 并实现 ITexture(TextureResourceLocation.java:6),所以可以直接传给 renderEngine.bindTexture()(TextureResourceLocation.java:12-15)。好处是自动进入 MC 的资源包/资源重载体系,坏处是不能有 web: 前缀。

TextureURL 的异步加载

构造函数就起一个 daemon 线程(TextureURL.java:27-33):

new LoadTextureURL(this).start()      // setDaemon(true)
  → ImageIO.read(url)                // 存进 this.bi
  → finishLoading(bi)

真正的 GL 上传推迟到 bind() 首次发现 bi != null 时,且只上传一次(上传后 textureID != -1,后续走快速路径)。TextureURL.load() 里还有一份独立的下载实现,但它没有任何调用点(构造函数走的是 LoadTextureURL 线程),是死代码。

⚠️ 下载失败时 LoadTextureURL 是空 catch(LoadTextureURL.java:24-26),bi 保持 null,表现就是永远绑透明图 + 控制台无任何提示。 ⚠️ TextureURL 同样没有缓存/去重:同一 URL 写两次会起两个线程、下两次。

适用位置

相关条目