PlayerSkinRenderCache.java

net.minecraft.client.renderer.PlayerSkinRenderCache

信息

  • 全限定名:net.minecraft.client.renderer.PlayerSkinRenderCache
  • 类型:public class
  • 包:net.minecraft.client.renderer
  • 源码路径:src/main/java/net/minecraft/client/renderer/PlayerSkinRenderCache.java
  • 起始行号:L27
  • 职责:

    TODO

字段/常量

  • DEFAULT_PLAYER_SKIN_RENDER_TYPE

    • 类型: RenderType
    • 修饰符: public static final
    • 源码定位: L28
    • 说明:

      TODO

  • CACHE_DURATION

    • 类型: Duration
    • 修饰符: public static final
    • 源码定位: L29
    • 说明:

      TODO

  • renderInfoCache

    • 类型: LoadingCache<ResolvableProfile,CompletableFuture<Optional<PlayerSkinRenderCache.RenderInfo>>>
    • 修饰符: private final public
    • 源码定位: L30
    • 说明:

      TODO

  • defaultSkinCache

    • 类型: LoadingCache<ResolvableProfile,PlayerSkinRenderCache.RenderInfo>
    • 修饰符: private final public
    • 源码定位: L50
    • 说明:

      TODO

  • textureManager

    • 类型: TextureManager
    • 修饰符: private final
    • 源码定位: L62
    • 说明:

      TODO

  • skinManager

    • 类型: SkinManager
    • 修饰符: private final
    • 源码定位: L63
    • 说明:

      TODO

  • profileResolver

    • 类型: ProfileResolver
    • 修饰符: private final
    • 源码定位: L64
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.renderer.PlayerSkinRenderCache.RenderInfo
    • 类型: class
    • 修饰符: public final
    • 源码定位: L98
    • 说明:

      TODO

构造器

public PlayerSkinRenderCache(TextureManager textureManager, SkinManager skinManager, ProfileResolver profileResolver) @ L66

  • 构造器名:PlayerSkinRenderCache
  • 源码定位:L66
  • 修饰符:public

参数:

  • textureManager: TextureManager
  • skinManager: SkinManager
  • profileResolver: ProfileResolver

说明:

TODO

方法

下面的方法块按源码顺序生成。

public PlayerSkinRenderCache.RenderInfo getOrDefault(ResolvableProfile profile) @ L72

  • 方法名:getOrDefault
  • 源码定位:L72
  • 返回类型:PlayerSkinRenderCache.RenderInfo
  • 修饰符:public

参数:

  • profile: ResolvableProfile

说明:

TODO

public Supplier<PlayerSkinRenderCache.RenderInfo> createLookup(ResolvableProfile profile) @ L77

  • 方法名:createLookup
  • 源码定位:L77
  • 返回类型:Supplier<PlayerSkinRenderCache.RenderInfo>
  • 修饰符:public

参数:

  • profile: ResolvableProfile

说明:

TODO

public CompletableFuture<Optional<PlayerSkinRenderCache.RenderInfo>> lookup(ResolvableProfile profile) @ L89

  • 方法名:lookup
  • 源码定位:L89
  • 返回类型:CompletableFuture<Optional<PlayerSkinRenderCache.RenderInfo>>
  • 修饰符:public

参数:

  • profile: ResolvableProfile

说明:

TODO

private static RenderType playerSkinRenderType(PlayerSkin playerSkin) @ L93

  • 方法名:playerSkinRenderType
  • 源码定位:L93
  • 返回类型:RenderType
  • 修饰符:private static

参数:

  • playerSkin: PlayerSkin

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class PlayerSkinRenderCache {
    public static final RenderType DEFAULT_PLAYER_SKIN_RENDER_TYPE = playerSkinRenderType(DefaultPlayerSkin.getDefaultSkin());
    public static final Duration CACHE_DURATION = Duration.ofMinutes(5L);
    private final LoadingCache<ResolvableProfile, CompletableFuture<Optional<PlayerSkinRenderCache.RenderInfo>>> renderInfoCache = CacheBuilder.newBuilder()
        .expireAfterAccess(CACHE_DURATION)
        .build(
            new CacheLoader<ResolvableProfile, CompletableFuture<Optional<PlayerSkinRenderCache.RenderInfo>>>() {
                {
                    Objects.requireNonNull(PlayerSkinRenderCache.this);
                }
 
                public CompletableFuture<Optional<PlayerSkinRenderCache.RenderInfo>> load(ResolvableProfile profile) {
                    return profile.resolveProfile(PlayerSkinRenderCache.this.profileResolver)
                        .thenCompose(
                            resolvedProfile -> PlayerSkinRenderCache.this.skinManager
                                .get(resolvedProfile)
                                .thenApply(
                                    playerSkin -> playerSkin.map(skin -> PlayerSkinRenderCache.this.new RenderInfo(resolvedProfile, skin, profile.skinPatch()))
                                )
                        );
                }
            }
        );
    private final LoadingCache<ResolvableProfile, PlayerSkinRenderCache.RenderInfo> defaultSkinCache = CacheBuilder.newBuilder()
        .expireAfterAccess(CACHE_DURATION)
        .build(new CacheLoader<ResolvableProfile, PlayerSkinRenderCache.RenderInfo>() {
            {
                Objects.requireNonNull(PlayerSkinRenderCache.this);
            }
 
            public PlayerSkinRenderCache.RenderInfo load(ResolvableProfile profile) {
                GameProfile temporaryProfile = profile.partialProfile();
                return PlayerSkinRenderCache.this.new RenderInfo(temporaryProfile, DefaultPlayerSkin.get(temporaryProfile), profile.skinPatch());
            }
        });
    private final TextureManager textureManager;
    private final SkinManager skinManager;
    private final ProfileResolver profileResolver;
 
    public PlayerSkinRenderCache(TextureManager textureManager, SkinManager skinManager, ProfileResolver profileResolver) {
        this.textureManager = textureManager;
        this.skinManager = skinManager;
        this.profileResolver = profileResolver;
    }
 
    public PlayerSkinRenderCache.RenderInfo getOrDefault(ResolvableProfile profile) {
        PlayerSkinRenderCache.RenderInfo result = this.lookup(profile).getNow(Optional.empty()).orElse(null);
        return result != null ? result : this.defaultSkinCache.getUnchecked(profile);
    }
 
    public Supplier<PlayerSkinRenderCache.RenderInfo> createLookup(ResolvableProfile profile) {
        PlayerSkinRenderCache.RenderInfo defaultForProfile = this.defaultSkinCache.getUnchecked(profile);
        CompletableFuture<Optional<PlayerSkinRenderCache.RenderInfo>> future = this.renderInfoCache.getUnchecked(profile);
        Optional<PlayerSkinRenderCache.RenderInfo> currentValue = future.getNow(null);
        if (currentValue != null) {
            PlayerSkinRenderCache.RenderInfo finalValue = currentValue.orElse(defaultForProfile);
            return () -> finalValue;
        } else {
            return () -> future.getNow(Optional.empty()).orElse(defaultForProfile);
        }
    }
 
    public CompletableFuture<Optional<PlayerSkinRenderCache.RenderInfo>> lookup(ResolvableProfile profile) {
        return this.renderInfoCache.getUnchecked(profile);
    }
 
    private static RenderType playerSkinRenderType(PlayerSkin playerSkin) {
        return SkullBlockRenderer.getPlayerSkinRenderType(playerSkin.body().texturePath());
    }
 
    @OnlyIn(Dist.CLIENT)
    public final class RenderInfo {
        private final GameProfile gameProfile;
        private final PlayerSkin playerSkin;
        private @Nullable RenderType itemRenderType;
        private @Nullable GpuTextureView textureView;
        private @Nullable GlyphRenderTypes glyphRenderTypes;
 
        public RenderInfo(GameProfile gameProfile, PlayerSkin playerSkin, PlayerSkin.Patch patch) {
            Objects.requireNonNull(PlayerSkinRenderCache.this);
            super();
            this.gameProfile = gameProfile;
            this.playerSkin = playerSkin.with(patch);
        }
 
        public GameProfile gameProfile() {
            return this.gameProfile;
        }
 
        public PlayerSkin playerSkin() {
            return this.playerSkin;
        }
 
        public RenderType renderType() {
            if (this.itemRenderType == null) {
                this.itemRenderType = PlayerSkinRenderCache.playerSkinRenderType(this.playerSkin);
            }
 
            return this.itemRenderType;
        }
 
        public GpuTextureView textureView() {
            if (this.textureView == null) {
                this.textureView = PlayerSkinRenderCache.this.textureManager.getTexture(this.playerSkin.body().texturePath()).getTextureView();
            }
 
            return this.textureView;
        }
 
        public GlyphRenderTypes glyphRenderTypes() {
            if (this.glyphRenderTypes == null) {
                this.glyphRenderTypes = GlyphRenderTypes.createForColorTexture(this.playerSkin.body().texturePath());
            }
 
            return this.glyphRenderTypes;
        }
 
        @Override
        public boolean equals(Object o) {
            return this == o
                || o instanceof PlayerSkinRenderCache.RenderInfo that && this.gameProfile.equals(that.gameProfile) && this.playerSkin.equals(that.playerSkin);
        }
 
        @Override
        public int hashCode() {
            int result = 1;
            result = 31 * result + this.gameProfile.hashCode();
            return 31 * result + this.playerSkin.hashCode();
        }
    }
}

引用的其他类