Browse Source

Optimize ReferenceImageDatabase

customisations
alemart 9 months ago
parent
commit
770fa8940e
1 changed files with 26 additions and 21 deletions
  1. 26
    21
      src/trackers/image-tracker/reference-image-database.ts

+ 26
- 21
src/trackers/image-tracker/reference-image-database.ts View File

54
 export class ReferenceImageDatabase implements Iterable<ReferenceImage>
54
 export class ReferenceImageDatabase implements Iterable<ReferenceImage>
55
 {
55
 {
56
     /** Entries */
56
     /** Entries */
57
-    private _entries: ReferenceImageDatabaseEntry[];
57
+    private _entries: Map<string, ReferenceImageDatabaseEntry>;
58
 
58
 
59
     /** Maximum number of entries */
59
     /** Maximum number of entries */
60
     private _capacity: number;
60
     private _capacity: number;
73
     constructor()
73
     constructor()
74
     {
74
     {
75
         this._capacity = DEFAULT_CAPACITY;
75
         this._capacity = DEFAULT_CAPACITY;
76
-        this._entries = [];
76
+        this._entries = new Map();
77
         this._locked = false;
77
         this._locked = false;
78
         this._busy = false;
78
         this._busy = false;
79
     }
79
     }
83
      */
83
      */
84
     get count(): number
84
     get count(): number
85
     {
85
     {
86
-        return this._entries.length;
86
+        return this._entries.size;
87
     }
87
     }
88
 
88
 
89
     /**
89
     /**
113
      */
113
      */
114
     *[Symbol.iterator](): Iterator<ReferenceImage>
114
     *[Symbol.iterator](): Iterator<ReferenceImage>
115
     {
115
     {
116
-        const ref = this._entries.map(entry => entry.referenceImage);
116
+        const arr = Array.from(this._entries.values());
117
+        const ref = arr.map(entry => entry.referenceImage);
117
         yield* ref;
118
         yield* ref;
118
     }
119
     }
119
 
120
 
127
      */
128
      */
128
     add(referenceImages: ReferenceImage[]): SpeedyPromise<void>
129
     add(referenceImages: ReferenceImage[]): SpeedyPromise<void>
129
     {
130
     {
131
+        const n = referenceImages.length;
132
+
130
         // handle no input
133
         // handle no input
131
-        if(referenceImages.length == 0)
134
+        if(n == 0)
132
             return Speedy.Promise.resolve();
135
             return Speedy.Promise.resolve();
133
 
136
 
134
         // handle multiple images as input
137
         // handle multiple images as input
135
-        if(referenceImages.length > 1) {
136
-            const promises = referenceImages.map(image => this.add([ image ]));
137
-            return Utils.runInSequence(promises);
138
+        if(n > 1) {
139
+            Utils.log(`Loading ${n} reference image${n != 1 ? 's' : ''}...`);
140
+            const preloadMedias = referenceImages.map(referenceImage => Speedy.load(referenceImage.image));
141
+            return Speedy.Promise.all(preloadMedias).then(() => {
142
+                const promises = referenceImages.map(referenceImage => this.add([ referenceImage ]));
143
+                return Utils.runInSequence(promises);
144
+            });
138
         }
145
         }
139
 
146
 
140
         // handle a single image as input
147
         // handle a single image as input
157
             throw new IllegalArgumentError(`Can't add reference image "${referenceImage.name}" to the database: invalid image`);
164
             throw new IllegalArgumentError(`Can't add reference image "${referenceImage.name}" to the database: invalid image`);
158
 
165
 
159
         // check for duplicate names
166
         // check for duplicate names
160
-        if(this._entries.find(entry => entry.referenceImage.name === referenceImage.name) !== undefined)
167
+        if(this._entries.has(referenceImage.name))
161
             throw new IllegalArgumentError(`Can't add reference image "${referenceImage.name}" to the database: found duplicated name`);
168
             throw new IllegalArgumentError(`Can't add reference image "${referenceImage.name}" to the database: found duplicated name`);
162
 
169
 
163
-        // load the media and add the reference image to the database
164
-        Utils.log(`Loading reference image "${referenceImage.name}"...`);
170
+        // add the reference image to the database
171
+        Utils.log(`Adding reference image "${referenceImage.name}" to the database...`);
165
         this._busy = true;
172
         this._busy = true;
166
         return Speedy.load(referenceImage.image).then(media => {
173
         return Speedy.load(referenceImage.image).then(media => {
174
+            const name = referenceImage.name || generateUniqueName();
167
             this._busy = false;
175
             this._busy = false;
168
-            this._entries.push({
169
-                referenceImage: Object.freeze({
170
-                    ...referenceImage,
171
-                    name: referenceImage.name || generateUniqueName()
172
-                }),
176
+            this._entries.set(name, {
177
+                referenceImage: Object.freeze(Object.assign({ }, referenceImage, { name })),
173
                 media: media
178
                 media: media
174
             });
179
             });
175
         });
180
         });
195
      */
200
      */
196
     _findMedia(name: string): SpeedyMedia
201
     _findMedia(name: string): SpeedyMedia
197
     {
202
     {
198
-        for(let i = 0; i < this._entries.length; i++) {
199
-            if(this._entries[i].referenceImage.name === name)
200
-                return this._entries[i].media;
201
-        }
203
+        const entry = this._entries.get(name);
204
+
205
+        if(!entry)
206
+            throw new IllegalArgumentError(`Can't find reference image "${name}"`);
202
 
207
 
203
-        throw new IllegalArgumentError(`Can't find reference image "${name}"`);
208
+        return entry.media;
204
     }
209
     }
205
 }
210
 }

Loading…
Cancel
Save