feat: complete 2.0.7.12 platform overhaul

This commit is contained in:
2026-08-16 19:33:03 +08:00
parent 73555cd04c
commit c9fa6f7a88
159 changed files with 13243 additions and 2539 deletions
@@ -0,0 +1,34 @@
{
"schemaVersion": 1,
"kind": "cpu",
"version": "2026.08",
"generatedAt": "2026-08-16T00:00:00Z",
"source": {
"name": "YMhut Box hardware reference",
"url": "https://update.ymhut.cn/api/client/reference-data/cpu",
"disclaimer": "Relative scores summarize public multi-core and gaming results. Actual performance depends on power limits, memory, cooling and workload."
},
"checksum": "sha256:eca642fe4223c6fc53cf9fabce94d905cfcecc878d5ebd403fd66e1b06de429c",
"items": [
{ "rank": 1, "vendor": "AMD", "model": "Ryzen 9 9950X3D", "score": 100, "tier": "旗舰", "segment": "desktop" },
{ "rank": 2, "vendor": "AMD", "model": "Ryzen 9 9950X", "score": 96, "tier": "旗舰", "segment": "desktop" },
{ "rank": 3, "vendor": "Intel", "model": "Core Ultra 9 285K", "score": 90, "tier": "旗舰", "segment": "desktop" },
{ "rank": 4, "vendor": "AMD", "model": "Ryzen 9 9900X3D", "score": 86, "tier": "高端", "segment": "desktop" },
{ "rank": 5, "vendor": "AMD", "model": "Ryzen 7 9800X3D", "score": 81, "tier": "高端", "segment": "desktop" },
{ "rank": 6, "vendor": "Intel", "model": "Core i9-14900KS", "score": 79, "tier": "高端", "segment": "desktop" },
{ "rank": 7, "vendor": "AMD", "model": "Ryzen 9 7950X3D", "score": 77, "tier": "高端", "segment": "desktop" },
{ "rank": 8, "vendor": "Intel", "model": "Core i9-14900K", "score": 75, "tier": "高端", "segment": "desktop" },
{ "rank": 9, "vendor": "AMD", "model": "Ryzen 9 9900X", "score": 73, "tier": "高端", "segment": "desktop" },
{ "rank": 10, "vendor": "Intel", "model": "Core Ultra 7 265K", "score": 69, "tier": "中高端", "segment": "desktop" },
{ "rank": 11, "vendor": "AMD", "model": "Ryzen 7 9700X", "score": 64, "tier": "中高端", "segment": "desktop" },
{ "rank": 12, "vendor": "Intel", "model": "Core i7-14700K", "score": 62, "tier": "中高端", "segment": "desktop" },
{ "rank": 13, "vendor": "AMD", "model": "Ryzen 7 7800X3D", "score": 60, "tier": "中高端", "segment": "desktop" },
{ "rank": 14, "vendor": "AMD", "model": "Ryzen AI 9 HX 370", "score": 54, "tier": "移动高端", "segment": "mobile" },
{ "rank": 15, "vendor": "Intel", "model": "Core Ultra 9 185H", "score": 50, "tier": "移动高端", "segment": "mobile" },
{ "rank": 16, "vendor": "AMD", "model": "Ryzen 5 9600X", "score": 47, "tier": "主流", "segment": "desktop" },
{ "rank": 17, "vendor": "Intel", "model": "Core Ultra 5 245K", "score": 46, "tier": "主流", "segment": "desktop" },
{ "rank": 18, "vendor": "Intel", "model": "Core i5-14600K", "score": 44, "tier": "主流", "segment": "desktop" },
{ "rank": 19, "vendor": "AMD", "model": "Ryzen 5 7600", "score": 36, "tier": "主流", "segment": "desktop" },
{ "rank": 20, "vendor": "Intel", "model": "Core Ultra 7 155H", "score": 35, "tier": "移动主流", "segment": "mobile" }
]
}
@@ -0,0 +1,34 @@
{
"schemaVersion": 1,
"kind": "gpu",
"version": "2026.08",
"generatedAt": "2026-08-16T00:00:00Z",
"source": {
"name": "YMhut Box hardware reference",
"url": "https://update.ymhut.cn/api/client/reference-data/gpu",
"disclaimer": "Relative scores summarize public gaming and compute results. Actual performance depends on power, cooling, drivers and workload."
},
"checksum": "sha256:a8258fa438b830446322750cd71435fd8e0ff65102eede3ca006bea6b61f3361",
"items": [
{ "rank": 1, "vendor": "NVIDIA", "model": "GeForce RTX 5090", "score": 100, "tier": "旗舰", "segment": "desktop" },
{ "rank": 2, "vendor": "NVIDIA", "model": "GeForce RTX 4090", "score": 82, "tier": "旗舰", "segment": "desktop" },
{ "rank": 3, "vendor": "NVIDIA", "model": "GeForce RTX 5080", "score": 78, "tier": "旗舰", "segment": "desktop" },
{ "rank": 4, "vendor": "AMD", "model": "Radeon RX 9070 XT", "score": 67, "tier": "高端", "segment": "desktop" },
{ "rank": 5, "vendor": "NVIDIA", "model": "GeForce RTX 5070 Ti", "score": 65, "tier": "高端", "segment": "desktop" },
{ "rank": 6, "vendor": "AMD", "model": "Radeon RX 7900 XTX", "score": 63, "tier": "高端", "segment": "desktop" },
{ "rank": 7, "vendor": "NVIDIA", "model": "GeForce RTX 4080 SUPER", "score": 62, "tier": "高端", "segment": "desktop" },
{ "rank": 8, "vendor": "AMD", "model": "Radeon RX 9070", "score": 57, "tier": "高端", "segment": "desktop" },
{ "rank": 9, "vendor": "NVIDIA", "model": "GeForce RTX 5070", "score": 52, "tier": "中高端", "segment": "desktop" },
{ "rank": 10, "vendor": "AMD", "model": "Radeon RX 7900 XT", "score": 51, "tier": "中高端", "segment": "desktop" },
{ "rank": 11, "vendor": "NVIDIA", "model": "GeForce RTX 4070 Ti SUPER", "score": 49, "tier": "中高端", "segment": "desktop" },
{ "rank": 12, "vendor": "Intel", "model": "Arc B580", "score": 31, "tier": "主流", "segment": "desktop" },
{ "rank": 13, "vendor": "NVIDIA", "model": "GeForce RTX 5060 Ti", "score": 30, "tier": "主流", "segment": "desktop" },
{ "rank": 14, "vendor": "AMD", "model": "Radeon RX 7800 XT", "score": 29, "tier": "主流", "segment": "desktop" },
{ "rank": 15, "vendor": "NVIDIA", "model": "GeForce RTX 4060 Ti", "score": 24, "tier": "主流", "segment": "desktop" },
{ "rank": 16, "vendor": "Intel", "model": "Arc B570", "score": 23, "tier": "主流", "segment": "desktop" },
{ "rank": 17, "vendor": "AMD", "model": "Radeon RX 7700 XT", "score": 22, "tier": "主流", "segment": "desktop" },
{ "rank": 18, "vendor": "NVIDIA", "model": "GeForce RTX 5060 Laptop", "score": 20, "tier": "移动主流", "segment": "mobile" },
{ "rank": 19, "vendor": "AMD", "model": "Radeon RX 7600", "score": 17, "tier": "入门", "segment": "desktop" },
{ "rank": 20, "vendor": "NVIDIA", "model": "GeForce RTX 4060 Laptop", "score": 16, "tier": "移动主流", "segment": "mobile" }
]
}
@@ -0,0 +1,76 @@
package reference
import (
"embed"
"encoding/json"
"errors"
"os"
"path/filepath"
"strings"
)
//go:embed data/*.json
var bundled embed.FS
var ErrNotFound = errors.New("reference data not found")
type Service struct {
overrideRoot string
}
func NewService(overrideRoot string) *Service {
return &Service{overrideRoot: strings.TrimSpace(overrideRoot)}
}
func (s *Service) Read(kind string) (map[string]any, error) {
name, ok := fileName(kind)
if !ok {
return nil, ErrNotFound
}
var data []byte
var err error
if s.overrideRoot != "" {
data, err = os.ReadFile(filepath.Join(s.overrideRoot, "reference-data", name))
if err != nil && !errors.Is(err, os.ErrNotExist) {
return nil, err
}
}
if len(data) == 0 {
data, err = bundled.ReadFile("data/" + name)
if err != nil {
return nil, err
}
}
var payload map[string]any
if err := json.Unmarshal(data, &payload); err != nil {
return nil, err
}
if payload["schemaVersion"] == nil || payload["items"] == nil {
return nil, errors.New("reference data schema is invalid")
}
return payload, nil
}
func (s *Service) Descriptors() map[string]any {
return map[string]any{
"cpu": map[string]any{
"url": "/api/client/reference-data/cpu",
"bundledFallback": true,
},
"gpu": map[string]any{
"url": "/api/client/reference-data/gpu",
"bundledFallback": true,
},
}
}
func fileName(kind string) (string, bool) {
switch strings.ToLower(strings.TrimSpace(kind)) {
case "cpu", "cpu-ranking":
return "cpu-ranking.json", true
case "gpu", "gpu-ranking":
return "gpu-ranking.json", true
default:
return "", false
}
}
@@ -0,0 +1,46 @@
package reference
import (
"os"
"path/filepath"
"testing"
)
func TestReadUsesBundledSnapshot(t *testing.T) {
service := NewService(t.TempDir())
payload, err := service.Read("gpu")
if err != nil {
t.Fatal(err)
}
if payload["kind"] != "gpu" {
t.Fatalf("kind = %#v", payload["kind"])
}
items, ok := payload["items"].([]any)
if !ok || len(items) < 10 {
t.Fatalf("unexpected items: %#v", payload["items"])
}
}
func TestReadPrefersValidOverride(t *testing.T) {
root := t.TempDir()
dir := filepath.Join(root, "reference-data")
if err := os.MkdirAll(dir, 0o750); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(dir, "cpu-ranking.json"), []byte(`{"schemaVersion":1,"kind":"cpu","version":"override","items":[]}`), 0o640); err != nil {
t.Fatal(err)
}
payload, err := NewService(root).Read("cpu")
if err != nil {
t.Fatal(err)
}
if payload["version"] != "override" {
t.Fatalf("version = %#v", payload["version"])
}
}
func TestReadRejectsUnknownKind(t *testing.T) {
if _, err := NewService("").Read("unknown"); err != ErrNotFound {
t.Fatalf("err = %v", err)
}
}