Skip to content

Commit 4e8ccf7

Browse files
committed
Optimize daily leaderboard account loading
1 parent e97dbad commit 4e8ccf7

1 file changed

Lines changed: 73 additions & 71 deletions

File tree

app/js/engine/daily-leaderboard.js

Lines changed: 73 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ var DailyLeaderboard = (function() {
77
'use strict';
88

99
var WINDOW_BLOCKS = 28800;
10-
var BATCH_SIZE = 20;
11-
var YIELD_MS = 20;
10+
var BATCH_SIZE = 50;
11+
var YIELD_MS = 5;
1212
var _initialized = false;
1313
var _loading = false;
1414
var _subscribers = [];
@@ -131,7 +131,6 @@ var DailyLeaderboard = (function() {
131131
totalBlocks: Math.max(1, endBlock - startBlock + 1),
132132
players: {},
133133
characters: {},
134-
characterFetchCache: {},
135134
processedBlocks: 0
136135
};
137136

@@ -160,7 +159,6 @@ var DailyLeaderboard = (function() {
160159
totalBlocks: Math.max(1, headBlock - _snapshot.windowEndBlock),
161160
players: _cloneObject(_snapshot.players || {}),
162161
characters: _cloneObject(_snapshot.characters || {}),
163-
characterFetchCache: {},
164162
processedBlocks: 0
165163
};
166164

@@ -258,103 +256,107 @@ var DailyLeaderboard = (function() {
258256
blockNum: processed.blockNum,
259257
players: {}
260258
};
261-
var index = 0;
262259

263-
function nextAction() {
264-
if (index >= vmActions.length) {
265-
DailyLeaderboardStorage.putBlockContribution(blockContrib, function() {
266-
callback(null);
267-
});
268-
return;
260+
_primeCharactersForActions(ctx, vmActions, function() {
261+
for (var i = 0; i < vmActions.length; i++) {
262+
_applyVmAction(ctx, processed, vmActions[i], blockContrib);
269263
}
270264

271-
var vmAction = vmActions[index++];
272-
_applyVmAction(ctx, processed, vmAction, blockContrib, nextAction);
273-
}
274-
275-
nextAction();
265+
DailyLeaderboardStorage.putBlockContribution(blockContrib, function() {
266+
callback(null);
267+
});
268+
});
276269
}
277270

278-
function _applyVmAction(ctx, processed, vmAction, blockContrib, callback) {
271+
function _applyVmAction(ctx, processed, vmAction, blockContrib) {
279272
var sender = vmAction.sender;
280273
var action = vmAction.action;
281274

282-
_ensureCharacter(ctx, sender, action, function() {
283-
if (!action) {
284-
callback();
285-
return;
286-
}
287-
288-
if (action.type === VizMagicConfig.ACTION_TYPES.CHAR_ATTUNE) {
289-
_handleCharAttune(ctx, sender, action.data || {});
290-
callback();
291-
return;
292-
}
275+
if (!action) return;
293276

294-
if (action.type === VizMagicConfig.ACTION_TYPES.HUNT) {
295-
_handleHunt(ctx, sender, action.data || {}, processed, blockContrib);
296-
callback();
297-
return;
298-
}
277+
if (action.type === VizMagicConfig.ACTION_TYPES.CHAR_ATTUNE) {
278+
_handleCharAttune(ctx, sender, action.data || {});
279+
return;
280+
}
299281

300-
if (action.type === VizMagicConfig.ACTION_TYPES.HUNT_ARMAGEDDON) {
301-
_handleArmageddon(ctx, sender, action.data || {}, processed, blockContrib);
302-
callback();
303-
return;
304-
}
282+
if (action.type === VizMagicConfig.ACTION_TYPES.HUNT) {
283+
_handleHunt(ctx, sender, action.data || {}, processed, blockContrib);
284+
return;
285+
}
305286

306-
callback();
307-
});
287+
if (action.type === VizMagicConfig.ACTION_TYPES.HUNT_ARMAGEDDON) {
288+
_handleArmageddon(ctx, sender, action.data || {}, processed, blockContrib);
289+
}
308290
}
309291

310-
function _ensureCharacter(ctx, account, action, callback) {
292+
function _primeCharactersForActions(ctx, vmActions, callback) {
311293
callback = callback || function() {};
312-
if (!account) {
313-
callback();
314-
return;
315-
}
316-
if (ctx.characters[account]) {
317-
callback();
318-
return;
319-
}
320294

321-
if (action && action.type === VizMagicConfig.ACTION_TYPES.CHAR_ATTUNE && action.data && action.data.class) {
322-
_handleCharAttune(ctx, account, action.data);
323-
callback();
324-
return;
295+
var accountsToFetch = [];
296+
var seen = {};
297+
298+
for (var i = 0; i < vmActions.length; i++) {
299+
var sender = vmActions[i].sender;
300+
var action = vmActions[i].action;
301+
if (!sender || ctx.characters[sender] || seen[sender]) continue;
302+
303+
if (action && action.type === VizMagicConfig.ACTION_TYPES.CHAR_ATTUNE && action.data && action.data.class) {
304+
_handleCharAttune(ctx, sender, action.data);
305+
continue;
306+
}
307+
308+
seen[sender] = true;
309+
accountsToFetch.push(sender);
325310
}
326311

327-
if (ctx.characterFetchCache[account] === 'pending') {
328-
setTimeout(function() { _ensureCharacter(ctx, account, action, callback); }, 25);
312+
if (!accountsToFetch.length) {
313+
callback();
329314
return;
330315
}
331316

332-
ctx.characterFetchCache[account] = 'pending';
333-
VizAccount.getAccount(account, function(err, accountData) {
334-
var character = null;
335-
if (!err && accountData) {
336-
var grimoire = VizAccount.parseGrimoire(accountData);
337-
if (grimoire && grimoire.class) {
338-
character = CharacterSystem.createCharacter(account, grimoire.name || account, grimoire.class);
339-
if (character) {
340-
character.level = grimoire.level || character.level;
341-
character.xp = grimoire.xp || 0;
342-
character.hp = GameFormulas.calculateMaxHp(character.className, character.level, CharacterSystem.getTotalStat(character, 'res'));
343-
character.maxHp = character.hp;
317+
viz.api.getAccounts(accountsToFetch, function(err, response) {
318+
var byName = {};
319+
var i;
320+
if (!err && response && response.length) {
321+
for (i = 0; i < response.length; i++) {
322+
if (response[i] && response[i].name) {
323+
byName[response[i].name] = response[i];
344324
}
345325
}
346326
}
347327

348-
if (!character) {
349-
character = CharacterSystem.createCharacter(account, account, 'embercaster');
328+
for (i = 0; i < accountsToFetch.length; i++) {
329+
_hydrateCharacter(ctx, accountsToFetch[i], byName[accountsToFetch[i]] || null);
350330
}
351331

352-
ctx.characters[account] = character;
353-
ctx.characterFetchCache[account] = 'done';
354332
callback();
355333
});
356334
}
357335

336+
function _hydrateCharacter(ctx, account, accountData) {
337+
if (!account || ctx.characters[account]) return;
338+
339+
var character = null;
340+
if (accountData) {
341+
var grimoire = VizAccount.parseGrimoire(accountData);
342+
if (grimoire && grimoire.class) {
343+
character = CharacterSystem.createCharacter(account, grimoire.name || account, grimoire.class);
344+
if (character) {
345+
character.level = grimoire.level || character.level;
346+
character.xp = grimoire.xp || 0;
347+
character.hp = GameFormulas.calculateMaxHp(character.className, character.level, CharacterSystem.getTotalStat(character, 'res'));
348+
character.maxHp = character.hp;
349+
}
350+
}
351+
}
352+
353+
if (!character) {
354+
character = CharacterSystem.createCharacter(account, account, 'embercaster');
355+
}
356+
357+
ctx.characters[account] = character;
358+
}
359+
358360
function _handleCharAttune(ctx, account, data) {
359361
var character = CharacterSystem.createCharacter(account, data.name || account, data.class || 'embercaster');
360362
if (character) {

0 commit comments

Comments
 (0)