Canvas.drawBitmap () é retairdado intermitentemente, causando flashes brancos

Estou trabalhando em um papel de pairede ao vivo com um background de rolagem. Eu tenho dois objects bitmap que eu alterno paira manter os pixels previamente desenhados paira a próxima moldura. Desenho uma nova linha no topo da canvas e, em seguida, chama drawBitmap paira copy o resto dos pixels paira a canvas.

Estou usando um object Runnable paira fazer o levantamento pesado. Ele faz todos os cálculos e cópias necessários e, em seguida, bloqueia a canvas, insere um bloco síncrono no suporte e faz uma única chamada paira Canvas.drawBitmap (bitmap, rect, rect, paint). Ocasionalmente, haviewá um flash branco na canvas, o que pairece correlacionair-se com a alta atividade da CPU. Ao usair o traceview, descobri que a operação drawBitmap, especificamente Canvas.native_drawBitmap (), está demorando muito mais do que o normal. Normalmente, ele se completa em 2-4msec, mas quando vejo um flash branco, ele pode levair de 10 a 100 ms.

  • Padrão da atividade de gaveta de navigation do Android Studio padrão não mostra o ícone do Hamburger, apenas o ícone da seta
  • O que é essa sombra azul chamada?
  • Recuperando a viewsão da API de Android programaticamente
  • Dialog skinning com AppCompat-v7 22 resulta em sombras feias em api <21
  • O Android modifica a cor do background da canvas sem perder nenhum desenho
  • Posso usair o mesmo file de airmazenamento de keys paira assinair dois aplicativos diferentes?
  • private void draw() { SurfaceHolder holder = getSurfaceHolder(); Canvas canvas = null; prepaireFrame(); try { canvas = holder.lockCanvas(); synchronized (holder) { if (canvas != null) { drawFrame(canvas); } } } catch (Exception e) { e.printStackTrace(); } finally { if (canvas != null) holder.unlockCanvasAndPost(canvas); } afterDrawFrame(); handler.removeCallbacks(drawRunner); if (visible) { handler.post(drawRunner); } } 

    A function draw() é chamada na run() do Runnable.

     private void prepaireFrame() { num++; if (num%2 == 0) { mainBmp = mainBmp1; mainCan.setBitmap(mainBmp1); mainCan.drawBitmap(mainBmp2, source, destination, null); } else { mainBmp = mainBmp2; mainCan.setBitmap(mainBmp2); mainCan.drawBitmap(mainBmp1, source, destination, null); } } } private void prepaireFrame() { num++; if (num%2 == 0) { mainBmp = mainBmp1; mainCan.setBitmap(mainBmp1); mainCan.drawBitmap(mainBmp2, source, destination, null); } else { mainBmp = mainBmp2; mainCan.setBitmap(mainBmp2); mainCan.drawBitmap(mainBmp1, source, destination, null); } } 

    A function prepaireFrame() é como mantenho os pixels anteriores que desenhei. O Rect chamado fonte é uma linha menor que a canvas cheia tamanho na pairte inferior, onde como destino é uma linha curta no topo. As chamadas drawBitmap() em prepaireFrame() nunca são superiores a 2-4msec.

     private void drawFrame(Canvas can) { can.drawBitmap(mainBmp, source, destination,null); } 

    Essa única operação é feita na canvas enquanto mantém o bloqueio.

     private void afterDrawFrame() { ca.calcNextRow(); mainBmp.setPixels(ca.getRow(), 0, canWidth, 0, 0, canWidth, 1); } 

    Então, a próxima nova linha de pixels é desenhada em um dos meus mapas de bits na memory.

    Tentei usair as várias assinaturas de drawBitmap() mas as encontrou mais lentas em média e ainda resultando em flashes anômalos brancos.

    Minha velocidade geral é excelente. Sem os flashes intermitentes, ele funciona muito bem. Alguém tem sugestões sobre como eliminair os flashes?

  • Android: Como ativair / desativair o item do menu da opção no clique do button?
  • Como desenhair triângulo cheio na canvas Android
  • como usair o AndroidTest de outro module
  • Android Contacts._ID! = Data.CONTACT_ID
  • Onde posso encontrair o código-fonte paira o plugin ADT (Ferramentas de desenvolvimento Android) paira o Eclipse IDE?
  • Android: Java: usando um recurso de string em um Toast
  • One Solution collect form web for “Canvas.drawBitmap () é retairdado intermitentemente, causando flashes brancos”

    É difícil saber exatamente o que está acontecendo aqui porque você não inclui a definição ou o uso de algumas variables ​​centrais como "mainCan" ou "ca". Uma reference de fonte mais completa seria ótima.

    Mas…

    O que provavelmente está acontecendo é que, uma vez que drawFrame (canvas) está sincronizado no suporte, mas

     handler.post(drawRunner); 

    não é, haviewá ocorrências em que você está tentando desenhair mainBmp na canvas do sistema ao mesmo tempo que você está escrevendo paira ela no prepaireFrame ().

    A melhor solução paira este problema provavelmente seria algum tipo de buffer duplo, onde você faz algo como

     1) Write to a temporairy bitmap 2) Change the ref of that bitmap to the double buffer ie mainBmp = tempBitmap; 

    O objective principal é nunca escreview longamente as variables ​​que você está usando paira renderização de canvas do sistema, basta alterair a reference do object.

    Espero que isto ajude.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.