Overdraw é um redesenho excessivo dos mesmos pixels várias vezes por quadro. Quando uma interface complexa com muitos elementos sobrepostos é exibida na tela, a GPU é forçada a processar cada pixel repetidamente, o que afeta diretamente a taxa de quadros e o consumo de energia. De acordo com a documentação do Google Android Developer, 2025, reduzir o overdraw em 50% pode aumentar o desempenho de renderização em até 30%. A otimização do overdraw é uma etapa obrigatória ao desenvolver aplicativos com animações suaves e interfaces responsivas.
Pontos principais
Overdraw é uma situação em que o mesmo pixel da tela é redesenhado várias vezes dentro de um único quadro de renderização. Em um cenário ideal, cada pixel deve ser escrito exatamente uma vez, mas em interfaces reais, devido a Views aninhadas, imagens de fundo e camadas transparentes, a GPU realiza escritas repetidas.
Cada redesenho adicional aumenta o tempo de renderização do quadro. A uma taxa padrão de 60 FPS, cada quadro tem aproximadamente 16,6 ms. Se o overdraw fizer com que esse limite seja excedido, a taxa de quadros cai para 30 FPS ou menos, degradando visivelmente a suavidade da interface.
De acordo com Android Performance Patterns do Google, um aplicativo com fator de overdraw 3x gasta três vezes mais tempo no sombreador de fragmentos do que um aplicativo com overdraw 1x. Em dispositivos GPU de baixo desempenho, isso causa atrasos perceptíveis durante a rolagem e animação.
Para desenvolvedores móveis, entender o overdraw é criticamente importante: esse fator é o que mais frequentemente causa rolagem irregular e baixas taxas de quadros em telas aparentemente simples com um grande número de elementos aninhados.
O pipeline da GPU consiste em vários estágios: sombreador de vértices, rasterização e sombreador de fragmentos. O sombreador de fragmentos é a parte mais cara, pois é executado para cada pixel de cada primitiva. Com overdraw 2x, o sombreador de fragmentos processa o dobro de pixels, o que aumenta diretamente o tempo do quadro.
GPUs móveis modernas como Qualcomm Adreno e Apple GPU têm mecanismos de Early-Z Test e Hidden Surface Removal que compensam parcialmente o overdraw. No entanto, essas otimizações funcionam apenas em certas condições, e não se deve confiar apenas na aceleração de hardware.
Por exemplo, ao renderizar elementos semitransparentes, o Early-Z por hardware é ineficaz e cada pixel é processado completamente — o overdraw em tais cenários pode chegar a 5x ou mais.
Fundos multicamadas são uma das principais causas de overdraw em aplicativos móveis. Quando uma Activity ou ViewController define uma cor de fundo, cada View aninhada pode adicionar seu próprio fundo, e o pixel é redesenhado em cada nível da hierarquia.
Um estudo da Uber Engineering mostrou que a remoção de fundos excessivos em seu aplicativo Android reduziu o overdraw em 32% e o tempo de renderização da tela em 25%. Situação similar existe no iOS: definir opaque = true para Views não transparentes elimina a mistura alfa e evita escritas múltiplas de pixels.
Na plataforma iOS, o overdraw ocorre frequentemente devido ao uso de UIStackView transparentes, CALayer com shouldRasterize e UIBlurEffect sobrepostos. A Apple recomenda verificar o overdraw através da ferramenta Core Animation no XCode — ela mostra as zonas de redesenho como uma sobreposição vermelha.
Debug GPU Overdraw é uma ferramenta integrada do Android que colore a tela de diferentes cores dependendo do fator de overdraw. Roxo significa 1x, azul — 2x, verde — 3x, rosa — 4x, vermelho — 5x ou mais. Uma tela ideal deve ser majoritariamente roxa.
No iOS, diagnósticos similares são realizados pela ferramenta Core Animation no XCode Instruments. Ela visualiza as zonas de redesenho e mostra o número exato de escritas de pixels no modo Color Blended Layers. Camadas verdes são opacas (ótimas), as vermelhas contêm transparência e causam overdraw.
Após o diagnóstico, é importante medir o FPS antes e depois da otimização. Uma diferença de 10–15 FPS ao corrigir o overdraw é um resultado normal para uma tela complexa com listas e animação.
Remover fundos excessivos é o método mais simples e eficaz. No Android, basta definir android:windowBackground apenas para a Activity ou tema, não para cada View. No iOS, opaque = true para todos os UIView não transparentes reduz o overdraw a quase zero para esses elementos.
De acordo com Google I/O 2019, a otimização do overdraw no Google Maps permitiu reduzir o tempo de renderização do quadro em 40% através da fusão de camadas e do uso de ClipRect para limitar a área de desenho. Para desenvolvedores Android, o Google recomenda as seguintes práticas:
Em iOS, a otimização é alcançada através da configuração de CALayer: definir masksToBounds = true recorta o conteúdo além dos limites da camada, e shouldRasterize ativa o cache de bitmap para camadas estáticas.
Vamos ver exemplos práticos em Kotlin e Swift demonstrando cenários típicos de eliminação de overdraw. O primeiro exemplo mostra a otimização através de ClipRect no Android:
class OptimizedView@JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : View(context, attrs) {
override fun onDraw(canvas: Canvas) {
canvas.clipRect(
paddingLeft.toFloat(), paddingTop.toFloat(),
width - paddingRight.toFloat(), height - paddingBottom.toFloat()
)
// Draw content only within clipped area
super.onDraw(canvas)
}
}
O segundo exemplo em Swift mostra como desabilitar a transparência de uma camada se o elemento não deve ser semitransparente:
class OpaqueLabel: UILabel {
override var isOpaque: Bool {
get { true }
set { }
}
override func draw(_ rect: CGRect) {
backgroundColor?.setFill()
UIRectFill(rect)
super.draw(rect)
}
}
O terceiro exemplo demonstra o uso de ViewStub para carregamento adiado de mapa no Android. ViewStub não renderiza até se tornar visível, o que elimina o overdraw no estágio de inicialização da tela:
<!-- layout/activity_main.xml -->
<ViewStub
android:id="@+id/map_stub"
android:layout_width="match_parent"
android:layout_height="200dp"
android:inflatedId="@+id/map_container"
android:layout="@layout/map_fragment" />
// Inflate on demand
ViewStub stub = findViewById(R.id.map_stub)
stub?.inflate()
Perguntas frequentes
Overdraw é quando um pixel na tela é redesenhado várias vezes em um quadro. Imagine que você está pintando uma folha de papel e depois colando várias películas transparentes com desenhos por cima — as camadas inferiores têm que ser redesenhadas toda vez que a camada superior muda.
Ative Debug GPU Overdraw nas configurações do desenvolvedor. Elementos com overdraw 1x são coloridos de roxo, 2x — azul, 3x — verde, 4x — rosa, 5x+ — vermelho. Uma tela ideal é majoritariamente roxa sem zonas vermelhas.
Cada redesenho adicional de pixel requer uma chamada ao sombreador de fragmentos, que processa cor, textura e iluminação. A 60 FPS, cada quadro tem 16,6 ms — se o overdraw forçar a GPU a processar 2–3 vezes mais pixels, o limite é excedido e o FPS cai para 30.
Sim, diretamente. Uma GPU realizando trabalho excessivo consome mais energia. De acordo com uma pesquisa do Google, reduzir o overdraw de 4x para 1x diminui o consumo de energia da GPU em 35–50%, o que é especialmente perceptível em telas de alta resolução.
Para telas simples — 1x–1,5x (roxo com uma pequena quantidade de azul). Para interfaces complexas — até 2x. Níveis de 3x e superiores (rosa, vermelho) requerem otimização. O Google recomenda não exceder 2,5x de overdraw em média na tela.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também