新闻资讯
Android应用之SurfaceView的双缓冲使用
发布时间:2022-07-29 18:30
  |  
阅读量:
字号:
A+ A- A
本文摘要:这次讲解SurfaceView的双缓冲器用于。双缓冲器是为了避免动画闪光而构建的一种多线程应用于,基于SurfaceView的双缓冲器构建很非常简单,进一条线程并在其中绘图才可。本文讲解基于SurfaceView的双缓冲器构建,以及讲解类似于的更加高效的构建方法。 本文程序运行图片如下,左边是进单个线程加载并绘图,右边是进两个线程,一个专门加载图片,一个专门绘图:对比一下,右边动画的帧速显著比左边的慢,左右两者都没有用于Thread.sleep()。

亚搏体育

这次讲解SurfaceView的双缓冲器用于。双缓冲器是为了避免动画闪光而构建的一种多线程应用于,基于SurfaceView的双缓冲器构建很非常简单,进一条线程并在其中绘图才可。本文讲解基于SurfaceView的双缓冲器构建,以及讲解类似于的更加高效的构建方法。

本文程序运行图片如下,左边是进单个线程加载并绘图,右边是进两个线程,一个专门加载图片,一个专门绘图:对比一下,右边动画的帧速显著比左边的慢,左右两者都没有用于Thread.sleep()。为什么要进两个线程一个读书一个画,而不去进两个线程像左边那样都边读书边画呢?因为SurfaceView每次绘图都会瞄准Canvas,也就是说同一片区域这次没画完了下次就无法画,因此要提升双缓冲器的效率,就得进一条线程专门画图,进另外一条线程做到预处理的工作。main.xml的源码:viewplaincopytoclipboardprint??xmlversion=1.0encoding=utf-8?LinearLayoutxmlns:android=/apk/res/androidandroid:layout_width=fill_parentandroid:layout_height=fill_parentandroid:orientation=verticalLinearLayoutandroid:id=@+id/LinearLayout01android:layout_width=wrap_contentandroid:layout_height=wrap_contentButtonandroid:id=@+id/Button01android:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:text=单个独立国家线程/ButtonButtonandroid:id=@+id/Button02android:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:text=两个独立国家线程/Button/LinearLayoutSurfaceViewandroid:id=@+id/SurfaceView01android:layout_width=fill_parentandroid:layout_height=fill_parent/SurfaceView/LinearLayout?xmlversion=1.0encoding=utf-8?LinearLayoutxmlns:android=/apk/res/androidandroid:layout_width=fill_parentandroid:layout_height=fill_parentandroid:orientation=verticalLinearLayoutandroid:id=@+id/LinearLayout01android:layout_width=wrap_contentandroid:layout_height=wrap_contentButtonandroid:id=@+id/Button01android:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:text=单个独立国家线程/ButtonButtonandroid:id=@+id/Button02android:layout_width=wrap_contentandroid:layout_height=wrap_contentandroid:text=两个独立国家线程/Button/LinearLayoutSurfaceViewandroid:id=@+id/SurfaceView01android:layout_width=fill_parentandroid:layout_height=fill_parent/SurfaceView/LinearLayout本文程序的源码:viewplaincopytoclipboardprint?packagecom.testSurfaceView;importjava.lang.reflect.Field;importjava.util.ArrayList;importandroid.app.Activity;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.graphics.Canvas;importandroid.graphics.Paint;importandroid.graphics.Rect;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.SurfaceHolder;importandroid.view.SurfaceView;importandroid.view.View;importandroid.widget.Button;publicclasstestSurfaceViewextendsActivity{/**Calledwhentheactivityisfirstcreated.*/ButtonbtnSingleThread,btnDoubleThread;SurfaceViewsfv;SurfaceHoldersfh;ArrayListIntegerimgList=newArrayListInteger();intimgWidth,imgHeight;Bitmapbitmap;//独立国家线程加载,独立国家线程绘图@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);btnSingleThread=(Button)this.findViewById(R.id.Button01);btnDoubleThread=(Button)this.findViewById(R.id.Button02);btnSingleThread.setOnClickListener(newClickEvent());btnDoubleThread.setOnClickListener(newClickEvent());sfv=(SurfaceView)this.findViewById(R.id.SurfaceView01);sfh=sfv.getHolder();sfh.addCallback(newMyCallBack());//自动运营surfaceCreated以及surfaceChanged}classClickEventimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewv){if(v==btnSingleThread){newLoad_DrawImage(0,0).start();//进一条线程加载并绘图}elseif(v==btnDoubleThread){newLoadImage().start();//进一条线程加载newDrawImage(imgWidth+10,0).start();//进一条线程绘图}}}classMyCallBackimplementsSurfaceHolder.Callback{@OverridepublicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){Log.i(Surface:,Change);}@OverridepublicvoidsurfaceCreated(SurfaceHolderholder){Log.。

亚搏体育


本文关键词:Android,应,用之,SurfaceView,的,双,缓冲,使用,这次,亚搏体育

本文来源:亚搏体育-www.fukefactory.com