Преглед изворни кода

Optimize ReferenceImageDatabase

customisations
alemart пре 9 месеци
родитељ
комит
770fa8940e
1 измењених фајлова са 26 додато и 21 уклоњено
  1. 26
    21
      src/trackers/image-tracker/reference-image-database.ts

+ 26
- 21
src/trackers/image-tracker/reference-image-database.ts Прегледај датотеку

@@ -54,7 +54,7 @@ interface ReferenceImageDatabaseEntry
54 54
 export class ReferenceImageDatabase implements Iterable<ReferenceImage>
55 55
 {
56 56
     /** Entries */
57
-    private _entries: ReferenceImageDatabaseEntry[];
57
+    private _entries: Map<string, ReferenceImageDatabaseEntry>;
58 58
 
59 59
     /** Maximum number of entries */
60 60
     private _capacity: number;
@@ -73,7 +73,7 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
73 73
     constructor()
74 74
     {
75 75
         this._capacity = DEFAULT_CAPACITY;
76
-        this._entries = [];
76
+        this._entries = new Map();
77 77
         this._locked = false;
78 78
         this._busy = false;
79 79
     }
@@ -83,7 +83,7 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
83 83
      */
84 84
     get count(): number
85 85
     {
86
-        return this._entries.length;
86
+        return this._entries.size;
87 87
     }
88 88
 
89 89
     /**
@@ -113,7 +113,8 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
113 113
      */
114 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 118
         yield* ref;
118 119
     }
119 120
 
@@ -127,14 +128,20 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
127 128
      */
128 129
     add(referenceImages: ReferenceImage[]): SpeedyPromise<void>
129 130
     {
131
+        const n = referenceImages.length;
132
+
130 133
         // handle no input
131
-        if(referenceImages.length == 0)
134
+        if(n == 0)
132 135
             return Speedy.Promise.resolve();
133 136
 
134 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 147
         // handle a single image as input
@@ -157,19 +164,17 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
157 164
             throw new IllegalArgumentError(`Can't add reference image "${referenceImage.name}" to the database: invalid image`);
158 165
 
159 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 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 172
         this._busy = true;
166 173
         return Speedy.load(referenceImage.image).then(media => {
174
+            const name = referenceImage.name || generateUniqueName();
167 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 178
                 media: media
174 179
             });
175 180
         });
@@ -195,11 +200,11 @@ export class ReferenceImageDatabase implements Iterable<ReferenceImage>
195 200
      */
196 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…
Откажи
Сачувај