Android GPU加速渲染自定义View 性能改善<13>

本文探讨了在Android开发中如何通过GPU加速来提高自定义View的渲染性能,减少内存消耗。作者建议利用GPU将View的图形在首次渲染时保存为‘底片’,后续只需快速刷新,避免重复绘制。具体操作包括在自定义View中启用GPU渲染,确保在ListView等需要频繁刷新的地方使用GPU加速,并处理带有阴影效果的自定义View。通过这些方法,可以显著提升应用的流畅性和效率。
摘要由CSDN通过智能技术生成

常常在开发过程中使用自定义的View,而自定义的View的图形往往是onDraw里面实现的,这样就可能因为在父容器里面而因为父容器稍微的变更,就会重绘,重绘是需要很多内存消耗的,而且如果父容器有背景色,那么onDraw所画的一切图形色彩都是再父容器的基础上进行,从而导致某一个像素点上,进行了多次渲染,这是需要内存消耗的.专家的建议是:

我们可以先按照通常的方式把View上的元素按照从后到前的方式绘制出来,但是不直接显示到屏幕上,而是使用GPU预处理之后,再又GPU渲染到屏幕上,GPU可以对界面上的原始数据直接做旋转,设置透明度等等操作。使用GPU进行渲染,虽然第一次操作相比起直接绘制到屏幕上更加耗时,可是一旦原始纹理数据生成之后,接下去的操作就比较省时省力。

个人觉得GPU就像一个相机,将View的图形在第一次渲染的时候拍下来,生成一个底片,下次再视图更新的时候,要显示自定义的View,GPU就把底片冲洗一下,贴出来,就不需要再去重新绘制了,这样就节省了很多内存消耗:



具体操作事例如下:

<1> : 新建一个Android工程:



<2> : 具体程序如下:

DurianMainActivity.java


package org.durian.duriangpuview;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;

import java.util.List;

public class DurianMainActivity extends ActionBarActivity {

    private ListView listView;

    private Button button;

    private DurianBaseAdapter mDurianBaseAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.durian_main);

        listView=(ListView)findViewById(android.R.id.list);
        listView.setBackgroundColor(Color.GRAY);

        mDurianBaseAdapter=new DurianBaseAdapter(this);
        listView.setAdapter(mDurianBaseAdapter);

        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDurianBaseAdapter.notifyDataSetChanged();
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_durian_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值