B. 二分定位 + 邻域采样(我推荐) 把配置的语义从"这就是要生成的 10 档"改成"允许搜索的参数梯度"(比如分辨率梯度、帧率梯度、质量梯度三张表)。运行时: 1. 用每个组合只编 2 帧的方式粗估体积(很便宜); 2. 靠单调性做二分,几轮就找到"体积刚好不超过目标"的参数点; 3. 在这个点周围取 10 个组合(略高、略低各几个),完整生成。 成本大概是十几次估算编码 + 10 档完整编码,和现在基本持平甚至更省(估算只编 2 帧)。效果是候选真正围绕你输入的目标分布——比如你填 30 KB,出来的就是 22、26、29、31、35 KB 这种,而不是 5 KB 和 300 KB 各一个。 代价是你现在这套配置格式要推翻重做——从"精确档位表"变成"参数范围表"
147 lines
9.1 KiB
JSON
147 lines
9.1 KiB
JSON
{
|
||
"manifest": {
|
||
"app": {
|
||
"name": "SpineViewer"
|
||
}
|
||
},
|
||
"viewer": {
|
||
"title": "Spine Preview",
|
||
"skin": "Skin",
|
||
"play": "▶ Play",
|
||
"pause": "⏸ Pause",
|
||
"static": "▮ Still",
|
||
"staticLabel": "Still",
|
||
"playPauseTitle": "Play / pause (Space)",
|
||
"loop": "Loop",
|
||
"speed": "Speed",
|
||
"pma": "Premultiplied",
|
||
"pmaTitle": "For textures exported with Premultiplied Alpha (PMA)",
|
||
"background": "Background",
|
||
"backgroundTitle": "50×50 checkerboard that pans and zooms with the canvas and participates in blend modes",
|
||
"thumbnail": "Set current item thumbnail",
|
||
"thumbnailTitle": "Left-click to generate a static thumbnail; right-click to generate an animated thumbnail",
|
||
"animatedThumbnailTitle": "Generate animated thumbnail",
|
||
"animatedThumbnailAttention": "Warning:",
|
||
"animatedThumbnailNote": "The generated thumbnail replaces the existing thumbnail. This cannot be undone and ",
|
||
"animatedThumbnailDanger": "the original thumbnail cannot be restored",
|
||
"animatedThumbnailSizeNote": ". To prevent animated thumbnail data from becoming too large, the file will be reduced below the configured size.",
|
||
"animatedFormat": "Output format",
|
||
"animatedRange": "Animation range",
|
||
"animatedStart": "Start",
|
||
"animatedEnd": "End",
|
||
"framesUnit": "frames",
|
||
"animatedQuality": "Thumbnail quality",
|
||
"animatedMaxSize": "Thumbnail size",
|
||
"animatedInvalidSize": "Enter a whole number between 10 and 1024 KB",
|
||
"animatedCompressing": "Compressing animated thumbnail {current}/{total}…",
|
||
"animatedWebpUnavailable": "This environment cannot encode WebP. Choose APNG instead.",
|
||
"animatedCannotFit": "The animation cannot be reduced to {target} KB (minimum about {actual} KB). Increase the limit or shorten the frame range.",
|
||
"animatedPickTitle": "Pick a thumbnail",
|
||
"animatedPickHint": "Every result keeps a 400×400 canvas; the label shows detail resolution@fps/quality/file size. Select one and press Confirm to replace the thumbnail, or cancel to discard them all.",
|
||
"animatedPickConfirm": "Confirm",
|
||
"animatedPriority": "Priority",
|
||
"priorityResolution": "Resolution first",
|
||
"priorityFramerate": "Frame rate first",
|
||
"priorityBalanced": "Alternate resolution and frame rate",
|
||
"qualityLow": "Low",
|
||
"qualityMedium": "Medium",
|
||
"qualityHigh": "High",
|
||
"animatedConfirm": "Generate and replace",
|
||
"animatedInvalidRange": "Enter a valid whole-frame range between 0 and {duration}",
|
||
"animatedGenerating": "Generating animated thumbnail {current}/{total}…",
|
||
"animatedTooLarge": "The animated thumbnail exceeds 50 MB. Shorten the range or select a lower quality.",
|
||
"animatedThumbUpdated": "Animated thumbnail updated · {frames} frames · {size} KB",
|
||
"groupThumbnail": "Generate thumbnails for related assets",
|
||
"groupThumbnailTitle": "Left-click to generate a static thumbnail; right-click to generate an animated thumbnail",
|
||
"groupDialogTitle": "Generate thumbnails for related assets",
|
||
"groupDialogSummary": "Generate {generate} item(s) and skip {skip} item(s).",
|
||
"groupDialogNote": "Only checked related assets will receive thumbnails. Images and assets with custom thumbnails are unchecked by default. Selecting the latter replaces the existing thumbnail, which the plugin cannot automatically restore.",
|
||
"cancel": "Cancel",
|
||
"groupConfirm": "Generate",
|
||
"groupWillGenerate": "Will generate",
|
||
"groupWillReplaceCustom": "Will replace existing custom thumbnail",
|
||
"groupCustomNotSelected": "Custom thumbnail exists (not selected)",
|
||
"groupNotSelected": "Not selected",
|
||
"groupSkipCustom": "Skipped: custom thumbnail exists",
|
||
"groupUnavailable": "Skipped: could not verify",
|
||
"groupNoTargets": "There are no eligible thumbnails in the current asset group.",
|
||
"groupGenerating": "Generating asset-group thumbnails {current}/{total}…",
|
||
"groupApplyNotConfirmed": "Eagle did not confirm that the thumbnail was applied",
|
||
"groupComplete": "Asset-group thumbnails complete: {success} succeeded, {skip} skipped, {failed} failed.",
|
||
"versionTitle": "Spine version",
|
||
"reloadTitle": "Reload folder",
|
||
"animationList": "Animation list",
|
||
"animations": "Animations",
|
||
"setupPose": "Setup Pose",
|
||
"errorTitle": "Cannot preview",
|
||
"durationPlaceholder": "Duration --",
|
||
"keyframesLegend": "Blue ticks: keyframes",
|
||
"keyframesLegendTitle": "A blue tick marks a time where at least one bone, slot or constraint property has a keyframe",
|
||
"keyframesHint": "Blue ticks mark animation keyframes; hover a tick to see its time and frame",
|
||
"timePlaceholder": "0.00 / 0.00 s · 0 / 0 frames",
|
||
"staticPoseTitle": "Still pose · frame 1",
|
||
"keyframeTitle": "Keyframe · {time} · frame {frame}",
|
||
"timelineStatic": "Still · 1 frame",
|
||
"timelineDuration": "Duration {time} · {frames} frames",
|
||
"readoutStatic": "Still · 1 / 1 frames",
|
||
"readout": "{time} / {total} · {frame} / {totalFrames} frames",
|
||
"rulerStatic": "0 s (still)",
|
||
"seconds": "{value} s",
|
||
"imagePreview": "Image preview (no matching Spine assets found)",
|
||
"generating": "Generating and updating the Eagle thumbnail…",
|
||
"thumbUpdated": "Eagle thumbnail updated · {format} {size}KB",
|
||
"thumbWrittenNoRefresh": "Thumbnail written, but auto-refresh failed: {error}",
|
||
"recentered": "Canvas re-centered",
|
||
"pmaOn": "Premultiplied alpha on",
|
||
"pmaOff": "Premultiplied alpha off",
|
||
"pmaRemembered": "{state} · saved for this asset",
|
||
"pmaSaveFailed": "Toggled, but saving the setting failed: {error}",
|
||
"badgeFailed": "Failed to load the Spine badge",
|
||
"runtimeFailed": "Cannot load the Spine runtime: {file}",
|
||
"compoundName": "Eagle has not synced the compound extension yet; please reopen the library",
|
||
"txtRegistered": "This item is still registered as TXT. Regenerate the thumbnail in Eagle and reopen the library",
|
||
"apiHttp": "Eagle API returned HTTP {status}",
|
||
"noSkeletonForThumb": "No skeleton loaded; cannot generate a thumbnail",
|
||
"noItemId": "Cannot determine the Eagle item ID from the asset path",
|
||
"itemMismatch": "The preview file does not match the Eagle item; the thumbnail update was cancelled",
|
||
"replaceCustomThumbnailConfirm": "This item already has a custom thumbnail. Continuing will replace it, and the plugin cannot automatically restore the previous image. Continue?",
|
||
"thumbnailFailed": "Failed to generate the thumbnail: {error}",
|
||
"imageLoadFailed": "Failed to load the image",
|
||
"settingsNotReady": "Asset settings are not ready",
|
||
"noSkeletonFile": "Skeleton file not found",
|
||
"noSkeletonFileMsg": "Could not locate the Spine skeleton file (.skel / .skel.bytes / .json) that matches the selected file.\n\nPlease import the whole Spine export into Eagle.",
|
||
"noAtlas": "Atlas not found",
|
||
"noAtlasMsg": "Could not locate the matching .atlas / .atlas.txt file.",
|
||
"unsupportedVersion": "Unsupported version",
|
||
"unsupportedVersionMsg": "Unrecognized Spine version: {version}\nSupported versions: {list}",
|
||
"unknownVersion": "unknown",
|
||
"runtimeLoadFailed": "Failed to load the runtime",
|
||
"atlasLoadFailed": "Failed to load the atlas",
|
||
"emptySkeleton": "Empty skeleton data",
|
||
"emptySkeletonMsg": "No valid skeleton data could be read.",
|
||
"missingFile": "Missing file",
|
||
"missingFileMsg": "No file path parameter was provided.",
|
||
"fileNotExist": "File not found",
|
||
"loadFailed": "Failed to load",
|
||
"notSpineText": "This file is not a .atlas.txt or .skel.bytes Spine asset.",
|
||
"truncated256": "\n\n(only the first 256 KB is shown)",
|
||
"suffix": "Suffix",
|
||
"suffixTitle": "Filename suffixes are ignored when matching, so hero-mesh.skel pairs with hero.atlas",
|
||
"suffixManage": "Manage suffixes…",
|
||
"suffixAdd": "+ Add suffix…",
|
||
"suffixDefaults": "Built-in suffixes",
|
||
"suffixCustom": "Custom suffixes (select to remove)",
|
||
"suffixAddTitle": "Add a suffix",
|
||
"suffixAddNote": "Suffixes are ignored when matching filenames: after adding hover, hero-hover.skel pairs with hero.atlas. Letters, digits, - and _ only, up to 50 characters.",
|
||
"suffixPlaceholder": "e.g. hover",
|
||
"suffixInvalid": "Use letters, digits, - and _ only, and start with a letter or digit",
|
||
"suffixDuplicate": "That suffix already exists",
|
||
"suffixConfirm": "Add",
|
||
"suffixRemoveTitle": "Remove a suffix",
|
||
"suffixRemoveNote": "After removing “{name}”, files carrying that suffix will no longer be paired automatically.",
|
||
"suffixRemove": "Remove",
|
||
"suffixSaveFailed": "Saving the suffix list failed: {error}",
|
||
"truncated1m": "\n\n(large file, only the first 1 MB is shown)"
|
||
}
|
||
}
|