@@ -30,7 +30,8 @@ func (m *ModelService) ReadModelFile(path string) (*COM3D2.Model, error) {
3030 return modelData , nil
3131 }
3232
33- modelData , err := COM3D2 .ReadModel (f ) // .model need seek
33+ br := bufio .NewReaderSize (f , 2 * 1024 * 1024 ) // 需要 Peek 和缓冲
34+ modelData , err := COM3D2 .ReadModel (br ) // 2MB 缓冲区,30091 个样本中 90% 文件小于: 1.94 MB,平均 929.99 KB,中位数 269.53 KB,最大值 117.46 MB
3435 if err != nil {
3536 return nil , fmt .Errorf ("parsing the .model file failed: %w" , err )
3637 }
@@ -76,29 +77,29 @@ func (m *ModelService) ReadModelMetadata(path string) (*COM3D2.ModelMetadata, er
7677 }
7778 defer f .Close ()
7879
79- var modelData * COM3D2.Model
80-
8180 if strings .HasSuffix (path , ".json" ) {
8281 decoder := json .NewDecoder (f )
83- modelData = & COM3D2.Model {}
82+ modelData : = & COM3D2.Model {}
8483 if err = decoder .Decode (modelData ); err != nil {
8584 return nil , fmt .Errorf ("failed to read .model.json file: %w" , err )
8685 }
87- } else {
88- modelData , err = COM3D2 .ReadModel (f )
89- if err != nil {
90- return nil , fmt .Errorf ("parsing the .model file failed: %w" , err )
91- }
86+ return & COM3D2.ModelMetadata {
87+ Signature : modelData .Signature ,
88+ Version : modelData .Version ,
89+ Name : modelData .Name ,
90+ RootBoneName : modelData .RootBoneName ,
91+ ShadowCastingMode : modelData .ShadowCastingMode ,
92+ Materials : modelData .Materials ,
93+ }, nil
94+ }
95+
96+ br := bufio .NewReaderSize (f , 1 * 1024 * 1024 ) // 1MB 缓冲区,因为只读取部分数据
97+ metadata , err := COM3D2 .ReadModelMetadata (br )
98+ if err != nil {
99+ return nil , fmt .Errorf ("parsing the .model metadata failed: %w" , err )
92100 }
93101
94- return & COM3D2.ModelMetadata {
95- Signature : modelData .Signature ,
96- Version : modelData .Version ,
97- Name : modelData .Name ,
98- RootBoneName : modelData .RootBoneName ,
99- ShadowCastingMode : modelData .ShadowCastingMode ,
100- Materials : modelData .Materials ,
101- }, nil
102+ return metadata , nil
102103}
103104
104105// WriteModelMetadata 将元数据写入现有的 .model 文件
@@ -136,27 +137,11 @@ func (m *ModelService) WriteModelMetadata(inputPath string, outputPath string, m
136137
137138// ReadModelMaterial 读取 .model 文件,但只返回其中的材质数据
138139func (m * ModelService ) ReadModelMaterial (path string ) ([]* COM3D2.Material , error ) {
139- f , err := os .Open (path )
140- if err != nil {
141- return nil , fmt .Errorf ("cannot open .model file: %w" , err )
142- }
143- defer f .Close ()
144-
145- if strings .HasSuffix (path , ".json" ) {
146- decoder := json .NewDecoder (f )
147- modelData := & COM3D2.Model {}
148- if err := decoder .Decode (modelData ); err != nil {
149- return nil , fmt .Errorf ("failed to read.model.json file: %w" , err )
150- }
151- return modelData .Materials , nil
152- }
153-
154- modelData , err := COM3D2 .ReadModel (f )
140+ metadata , err := m .ReadModelMetadata (path )
155141 if err != nil {
156- return nil , fmt . Errorf ( "parsing the .model file failed: %w" , err )
142+ return nil , err
157143 }
158-
159- return modelData .Materials , nil
144+ return metadata .Materials , nil
160145}
161146
162147// WriteModelMaterial 接收 Material 数据并写入.model 文件
0 commit comments