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.

