<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發

      導航

      自定義控件被忽略的渲染性能

      渲染性能

      Android UI的工作分兩階段:

      1.在UI線程Record View#draw 
      2.在RenderThread線程DrawFrame(RenderThread:使用GPU資源的線程) 
      第一階段隨著View的invalidated在draw(Canvas)中進行 
      第二階段native RenderThread基于Record View#draw步驟所產生的數據內容而進行相應的處理。

      渲染性能:UI線程

              如果Record View#draw占用時間長,比如在UI線程繪制bitmap。當然,這種直接在UI線程繪制bitmap的方式應該避免使用。

              示例1:在主線程完成bitmap繪制,并顯示圓角頭像自定義控件,onDraw代碼實現可能如:

      Canvas bitmapCanvas = new Canvas(roundedOutputBitmap);
      Paint paint = new Paint();
      paint.setAntiAlias(true);
      bitmapCanvas.drawRoundRect(0, 0,
              roundedOutputBitmap.getWidth(), roundedOutputBitmap.getHeight(), 30, 30, paint);
      paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
      bitmapCanvas.drawBitmap(sourceBitmap, 0, 0, paint);
      bitmapCanvas.setBitmap(null);
      canvas.drawBitmap(roundedOutputBitmap, 0, 0, null);

         如果你現在是用這種方式實現其它自定義控件bitmap的繪制,假設sourceBitmap是一個很大的位圖,哪怕是緩存,加載進來會出現明顯的卡頓現象,所以用后臺線程完成這個工作。

      示例2:.有時自定義控件需要在設置bitmap的時候,才顯示bitmap,代碼如下:

      void setBitmap(Bitmap bitmap) {
          mBitmap = bitmap;
          invalidate();
      }
      
      void onDraw(Canvas canvas) {
          canvas.drawBitmap(mBitmap, null);
      }

      可以考慮用下面的代碼替換:

      void setBitmap(Bitmap bitmap) {
          mShaderPaint.setShader(
                  new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP));
          invalidate();
      }
      
      void onDraw(Canvas canvas) {
          canvas.drawRoundRect(0, 0, mWidth, mHeight, 20, 20, mShaderPaint);
      }

      這樣可以給bitmap數據源起到保護的作用,避免bitmap中間因為其他的修改(如在bitmap數據源頭添加漸變效果或者顏色過濾)而導致bitmap的數據源被修改。

      渲染性能:RenderThread

      有些放在onDraw(canvas)中的代碼套路或許很容易想到,但卻會在RenderThread觸發頻繁的運算。

      示例

      canvas.save();
      canvas.clipPath(mCirclePath);
      canvas.drawBitmap(mBitmap);
      canvas.restore();

      clipPath(Path)會觸發很多裁剪工作,應該盡量少用。可以的話,考慮用下面這種方式替換:

      mPaint.setShader(new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP));
      canvas.drawPath(mCirclePath, mPaint);

      Android把bitmaps作為OpenGL的紋理來顯示,第一次在一幀中顯示bitmap時,它就會被上傳到GPU上。如下圖Systrace所示的Upload width x heigth Texture。雖然它只需要若干毫秒,但還是很有必要讓GPU去顯示圖片的。 
      Systrace.png 
              如果這個過程占用很長的時間,可以先查看width和height的值。確保顯示的bitmap沒有比屏幕所需要展示位圖的區域還大。如果width和height的值比展示bitmap的區域還大,那么就會導致upload bitmap to GPU的時間以及內存的浪費。不過現在的圖片加載庫基本都實現了合適的尺寸加載位圖的功能。

      posted on 2018-05-29 21:16  安卓筆記俠  閱讀(668)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 国产高清自产拍av在线| 人妻丝袜无码专区视频网站| 亚欧成人精品一区二区乱| 激情一区二区三区成人文| 99久久国产综合精品女图图等你| 国产精品天天看天天狠| 欲色欲色天天天www| 中国熟妇毛多多裸交视频| 久久精品国产亚洲av麻豆小说| 狠狠亚洲丁香综合久久| 亚洲精品一区二区美女| 国产精品亚洲mnbav网站| 亚洲免费人成网站在线观看| 人人澡人摸人人添| 亚洲精品一二三中文字幕| 全黄h全肉边做边吃奶视频| 中文字幕制服国产精品| 国产999精品2卡3卡4卡| 曲麻莱县| 国产乱码日韩精品一区二区| 无码精品人妻一区二区三区中| 中国女人大白屁股ass| 亚洲av成人一区二区三区| 亚洲国产美女精品久久久| 一卡2卡三卡4卡免费网站| 日韩精品视频一区二区不卡| 精品无码国产自产拍在线观看蜜 | 国产色无码精品视频免费| 色偷偷亚洲女人天堂观看| 国产成人AV男人的天堂| 神马久久亚洲一区 二区| 福利一区二区视频在线| 东阿县| 国产精品白浆在线观看免费| 少妇人妻偷人精品视蜜桃| 91中文字幕一区二区| 国产乱码精品一区二区三| jizz国产免费观看| 无遮挡aaaaa大片免费看| 中文字幕人妻不卡精品| 中文字幕亚洲国产精品|