Comunidade

Otimização 1: pré-carregamento e cache — não prepare no momento da reprodução

O texto destaca que o problema mais crítico no gifting em tempo real é iniciar o download/parse de um ativo apenas quando o usuário clica no presente. A solução envolve pré-carregar e armazenar os presentes frequentemente usados localmente e usar uma cache em memória com desalojamento LRU para evitar a re-análise dos objetos de efeito. Além disso, sugere-se um sistema de cache em disco como suporte adicional para itens que não cabem na memória.

Compartilhar
Medium

3. Otimização 1: pré-carregamento e cache — não prepare no momento da reprodução

O pior anti-padrão na doação em tempo real é iniciar o download/parsing de um ativo apenas após o usuário tocar a doação. Uma interrupção na rede ou um arquivo grande podem fazer com que o efeito chegue tarde ou pare no seu primeiro frame.

A solução é totalmente dissociar “preparo do ativo” de “reprodução”:

1. Pré-carregamento. Ao entrar na sala, puxe as doações de alta frequência da sala e as doações frequentemente enviadas pelo usuário para o armazenamento local antes do tempo. O backend geralmente pode fornecer uma lista de prioridades.

2. Cache em memória com expurgo LRU. Armazene os objetos de efeito parsing (não arquivos brutos) na memória para que as reprises pulam o parsing novamente. A memória é finita, então limite-a com um LRU:

public class EffectCache {
// Limite pela quantidade de memória ocupada pelos objetos parseados, não pelo número.
private final LruCache<String, EffectEntity> cache;
    public EffectCache(int maxMemoryBytes) {
cache = new LruCache<String, EffectEntity>(maxMemoryBytes) {
@Override
protected int sizeOf(String key, EffectEntity entity) {
return entity.estimateBytes(); // memória estimada para este efeito parseado
}
@Override
protected void entryRemoved(boolean evicted, String key,
EffectEntity oldValue, EffectEntity newValue) {
if (evicted) {
oldValue.release(); // libere os recursos subjacentes (bitmaps/texturas) ao expurgo
}
}
public EffectEntity get(String giftId) {
return cache.get(giftId);
}
public void put(String giftId, EffectEntity entity) {
cache.put(giftId, entity);
}
}

O ponto-chave: limite o cache por bytes, não pelo número de itens — uma cena inteira pode pesar tanto quanto dez pequenas doações. E você deve chamar release() dentro de entryRemoved, ou o LRU perde a referência enquanto os bitmaps e texturas subjacentes permanecem em uso — o que não libera nada.

3. Cache no disco como um suporte. O que não cabe na memória vai para o disco, então a próxima entrada de sala lê do disco ao invés de rebaixar novamente.

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa