Skip to content

Commit 1f11108

Browse files
committed
perf: more improvements
1 parent 91c2dde commit 1f11108

4 files changed

Lines changed: 277 additions & 16 deletions

File tree

src/lib/custom_resources.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ var renderedSkyBlockIndexMu sync.RWMutex
2525
var renderedTextureIndexReloadMu sync.Mutex
2626
var renderedTextureIndexCacheDir string
2727
var renderedTextureIndexLastLazyReload time.Time
28+
var renderedTextureIndexLastDirModTime time.Time
29+
var renderedTextureIndexReloadInFlight bool
2830
var customResourcesOnce sync.Once
2931
var customResourcesErr error
3032
var customResourceRendererMu sync.Mutex
@@ -40,6 +42,7 @@ var vanillaModelTextureCache sync.Map
4042
var vanillaItemExistsCache sync.Map
4143

4244
var renderedTextureIndexLazyReloadInterval = 5 * time.Second
45+
var loadRenderedTextureIndexForRefresh = LoadRenderedTextureIndex
4346

4447
const (
4548
renderedResourcePackManifestSchemaVersion = 1

src/lib/custom_resources_cache.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,7 @@ func cachedTextureForStableKey(stableKey string, packSignature string, enabledPa
178178
if texture, ok := cachedTextureForStableKeyInMemory(stableKey, packSignature, enabledPackIDs, enabledPacks, legacyKeys...); ok {
179179
return texture, true
180180
}
181-
if lazyReloadRenderedTextureIndex() {
182-
if texture, ok := cachedTextureForStableKeyInMemory(stableKey, packSignature, enabledPackIDs, enabledPacks, legacyKeys...); ok {
183-
return texture, true
184-
}
185-
}
181+
scheduleRenderedTextureIndexRefresh()
186182

187183
return AppliedItemTexture{}, false
188184
}

src/lib/custom_resources_manifest.go

Lines changed: 75 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,12 @@ func resetRenderedTextureIndex() {
493493

494494
func reloadRenderedTextureIndex(cacheDir string) (int, error) {
495495
resetRenderedTextureIndex()
496-
return LoadRenderedTextureIndex(cacheDir)
496+
loaded, err := LoadRenderedTextureIndex(cacheDir)
497+
if err != nil {
498+
return 0, err
499+
}
500+
recordRenderedTextureIndexDirectoryState(cacheDir)
501+
return loaded, nil
497502
}
498503

499504
func LoadRenderedTextureIndex(cacheDir string) (int, error) {
@@ -515,6 +520,7 @@ func LoadRenderedTextureIndex(cacheDir string) (int, error) {
515520
return 0, err
516521
}
517522

523+
knownPacks := knownResourcePackAliases()
518524
loaded := 0
519525
for _, file := range files {
520526
if file.IsDir() || !strings.EqualFold(filepath.Ext(file.Name()), ".webp") {
@@ -540,7 +546,7 @@ func LoadRenderedTextureIndex(cacheDir string) (int, error) {
540546
texturePack = strings.TrimSpace(strings.TrimPrefix(part, "pack="))
541547
}
542548
}
543-
if packSegments != 1 || !validRenderedTexturePackID(texturePack) {
549+
if packSegments != 1 || !validRenderedTexturePackID(texturePack, knownPacks) {
544550
continue
545551
}
546552

@@ -568,15 +574,15 @@ func LoadRenderedTextureIndex(cacheDir string) (int, error) {
568574
return loaded, nil
569575
}
570576

571-
func validRenderedTexturePackID(packID string) bool {
577+
func validRenderedTexturePackID(packID string, knownPacks map[string]struct{}) bool {
572578
packID = strings.TrimSpace(packID)
573579
if packID == "" {
574580
return false
575581
}
576582
if strings.EqualFold(packID, "vanilla") {
577583
return true
578584
}
579-
_, known := knownResourcePackAliases()[canonicalPackAlias(packID)]
585+
_, known := knownPacks[canonicalPackAlias(packID)]
580586
return known
581587
}
582588

@@ -590,20 +596,78 @@ func rememberRenderedTextureIndexCacheDir(cacheDir string) {
590596
renderedTextureIndexReloadMu.Unlock()
591597
}
592598

593-
func lazyReloadRenderedTextureIndex() bool {
599+
func recordRenderedTextureIndexDirectoryState(cacheDir string) {
600+
cacheDir = strings.TrimSpace(cacheDir)
601+
modTime := time.Time{}
602+
if cacheDir != "" {
603+
if info, err := os.Stat(filepath.Join(cacheDir, "rendered")); err == nil {
604+
modTime = info.ModTime()
605+
}
606+
}
607+
594608
renderedTextureIndexReloadMu.Lock()
609+
if cacheDir != "" {
610+
renderedTextureIndexCacheDir = cacheDir
611+
}
612+
renderedTextureIndexLastDirModTime = modTime
613+
renderedTextureIndexLastLazyReload = time.Now()
614+
renderedTextureIndexReloadInFlight = false
615+
renderedTextureIndexReloadMu.Unlock()
616+
}
617+
618+
func scheduleRenderedTextureIndexRefresh() {
595619
now := time.Now()
596-
if !renderedTextureIndexLastLazyReload.IsZero() && now.Sub(renderedTextureIndexLastLazyReload) < renderedTextureIndexLazyReloadInterval {
620+
renderedTextureIndexReloadMu.Lock()
621+
if renderedTextureIndexReloadInFlight ||
622+
(!renderedTextureIndexLastLazyReload.IsZero() && now.Sub(renderedTextureIndexLastLazyReload) < renderedTextureIndexLazyReloadInterval) {
597623
renderedTextureIndexReloadMu.Unlock()
598-
return false
624+
return
599625
}
600626
cacheDir := renderedTextureIndexCacheDir
627+
lastModTime := renderedTextureIndexLastDirModTime
601628
renderedTextureIndexLastLazyReload = now
602629
renderedTextureIndexReloadMu.Unlock()
603630

604-
loaded, err := reloadRenderedTextureIndex(cacheDir)
605-
if err != nil {
606-
return false
631+
if strings.TrimSpace(cacheDir) == "" {
632+
return
607633
}
608-
return loaded > 0
634+
renderedDir := filepath.Join(cacheDir, "rendered")
635+
info, err := os.Stat(renderedDir)
636+
if err != nil || !info.IsDir() || !info.ModTime().After(lastModTime) {
637+
return
638+
}
639+
640+
renderedTextureIndexReloadMu.Lock()
641+
if renderedTextureIndexReloadInFlight {
642+
renderedTextureIndexReloadMu.Unlock()
643+
return
644+
}
645+
renderedTextureIndexReloadInFlight = true
646+
renderedTextureIndexReloadMu.Unlock()
647+
648+
go func() {
649+
defer func() {
650+
if recovered := recover(); recovered != nil && (utility.IsVerboseLogging() || strings.EqualFold(os.Getenv("VERBOSE_LOGGING"), "true")) {
651+
logCustomResourceRoutine("[CUSTOM_RESOURCES] Rendered texture index refresh panicked: %v", recovered)
652+
}
653+
renderedTextureIndexReloadMu.Lock()
654+
renderedTextureIndexReloadInFlight = false
655+
renderedTextureIndexReloadMu.Unlock()
656+
}()
657+
658+
if _, err := loadRenderedTextureIndexForRefresh(cacheDir); err != nil {
659+
if utility.IsVerboseLogging() || strings.EqualFold(os.Getenv("VERBOSE_LOGGING"), "true") {
660+
logCustomResourceRoutine("[CUSTOM_RESOURCES] Failed to refresh rendered texture index: %v", err)
661+
}
662+
return
663+
}
664+
665+
modTime := info.ModTime()
666+
if refreshedInfo, err := os.Stat(renderedDir); err == nil {
667+
modTime = refreshedInfo.ModTime()
668+
}
669+
renderedTextureIndexReloadMu.Lock()
670+
renderedTextureIndexLastDirModTime = modTime
671+
renderedTextureIndexReloadMu.Unlock()
672+
}()
609673
}

0 commit comments

Comments
 (0)