动态缓存和懒人加载 部落冲突加载完闪退吗

4860人阅读
双缓冲是图像编程中很重要的概念,在电脑的图像处理中就常常使用双缓冲来加快图像显示速度,消除图像刷新时的闪烁现象,提升用户体验。双缓冲为图像加速,提升显示速度,提高显示质量的原理是:计算机访问显示屏和磁盘的速度远远小于CPU缓存和内存,每一次调用绘图函数往显示屏刷新数据,即使你的显示内容已经加载到了内存,但每一次访问显示屏,仍然会花费比内存大得多的时间,如果你的资源里有一百个图片,那么直接把他们全刷到屏幕上需要调用一百次drawBitmap方法,每次都需要访问显示屏,就会导致显示过程效率低下。这时如果使用双缓冲,创建一块屏幕客户区大小的BUFFER,把这一百个图片全画到BUFFER上,只就需要访问一百次内存,最后访问一次显示屏,把这块BUFFER刷到显示屏上就行了,如果内存与外设的速度比是一比十,那么几乎可以节约十分之九的时间,速度当然快了,这就是双缓冲技术。那么安卓编程是否需要双缓冲?安卓surfaceview和双缓冲有什么关系?下面通过三个例子说明,三个例子内容一样,都是一个背景图片,5*8个不停放缩的实心圆:1。不使用双缓冲,直接使用onDraw往屏幕刷数据。代码如下:package com.Dimport java.util.Timport java.util.TimerTimport android.app.Aimport android.content.Cimport android.graphics.Bimport android.graphics.Cimport android.graphics.Cimport android.graphics.Pimport android.graphics.Paint.Simport android.graphics.drawable.BitmapDimport android.os.Bimport android.view.Vpublic class TestDoubleActivity extends Activity {&& &MyV&& &float m_circle_r = 10;&&& /** Called when the activity is first created. */&&& @Override&&& public void onCreate(Bundle savedInstanceState) {&&&&&&& super.onCreate(savedInstanceState);&&&&&&& //setContentView(R.layout.main);&&&&&&& mv = new MyView(this);&& &&& &setContentView(mv);&& &&& &&&&&&&& Timer timer = new Timer(); &&&&&&&& timer.scheduleAtFixedRate(new MyTask(), 1, 100); &&&& }&&& public class MyView extends View {&& &&& &MyView(Context context) {&& &&& &&& &super(context);&& &&& &}&& &&& &@Override&& &&& &protected void onDraw(Canvas canvas) {&& &&& &&& &// TODO Auto-generated method stub&& &&& &&& &super.onDraw(canvas);&& &&& &&& &Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);&& &&& &&& &paint.setColor(Color.BLUE);&& &&& &&& &paint.setStrokeWidth(10);&& &&& &&& &paint.setStyle(Style.FILL);&& &&& &&&& if (m_circle_r &= (getWidth()/10))&& &&& &&& &{&& &&& &&& &&& &m_circle_r = 0;&& &&& &&& &}&& &&& &&& &else&& &&& &&& &{&& &&& &&& &&& &m_circle_r++;&& &&& &&& &}&& &&& &&&& Bitmap pic = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap();&& &&& &&&& canvas.drawBitmap(pic, 0, 0, paint); && &&& &&& &for (int i = 0; i & 5; i++)&& &&& &&& &&& &for (int j = 0; j & 8; j++)&& &&& &&& &canvas.drawCircle((getWidth()/5)*i+(getWidth()/10), (getHeight()/8)*j+(getHeight()/16), m_circle_r, paint);&& &&& &}&& &}&&& private class MyTask extends TimerTask{ &&&&&&&& @Override &&&&&&&& public void run() { &&&&&&& &&& &mv.postInvalidate();&&&&&&& }&&& &&&& } &}2。使用双缓冲,同样的代码,创建一块和屏幕大小一样的Bitmap,把需要画的内存提前画在一个tmp的Bitmap上,最后把tmp刷到屏上,代码如下:package com.myD
import java.util.T
import java.util.TimerT
import android.app.A
import android.content.C
import android.graphics.B
import android.graphics.Bitmap.C
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.Paint.S
import android.graphics.drawable.BitmapD
import android.os.B
import android.view.V
import android.view.W
import android.view.WindowM
import com.myDouble.MySurfaceV
public class DoubleActivity extends Activity {
float m_circle_r = 10;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.main);
mv = new MyView(this);
setContentView(mv);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTask(), 1, 100);
public class MyView extends View {
MyView(Context context) {
super(context);
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLUE);
paint.setStrokeWidth(10);
paint.setStyle(Style.FILL);
if (m_circle_r &= (getWidth() / 10)) {
m_circle_r = 0;
m_circle_r++;
/* 创建Canvas对象 */
Canvas mCanvas = new Canvas();
/* 创建屏幕大小的缓冲区 tmp*/
tmp = Bitmap
.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
/* 设置将内容绘制在tmp上 */
mCanvas.setBitmap(tmp);
//pic 在tmp上
Bitmap pic = ((BitmapDrawable) getResources().getDrawable(
R.drawable.qq)).getBitmap();
mCanvas.drawBitmap(pic, 0, 0, paint);
//把5*8个圆绘制在tmp上
for (int i = 0; i & 5; i++)
for (int j = 0; j & 8; j++)
mCanvas.drawCircle(
(getWidth() / 5) * i + (getWidth() / 10),
(getHeight() / 8) * j + (getHeight() / 16),
m_circle_r, paint);
//把tmp绘制在物理设备上
canvas.drawBitmap(tmp, 0, 0, paint);
private class MyTask extends TimerTask {
public void run() {
mv.postInvalidate();
}两个例子对比后发现,如果这些图形使用VC编写,不使用双缓冲动画会闪得很厉害,使用双缓冲动画就会很流畅。而在安卓上,不使用双缓冲图像也很顺畅,而使用了双缓冲后,动画反而比不使用更卡,根据结果的推测,应该是安卓平台onDraw已经经过了双缓冲优化,而再次使用双缓冲时,反而不仅仅增大了系统内存开销,而且比原来多使用了一次图像拷贝操作,是而效率反而低了不少。再看下面使用surface的例子:import android.content.C
import android.graphics.B
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.Paint.S
import android.graphics.drawable.BitmapD
import android.view.SurfaceH
import android.view.SurfaceV
import android.view.KeyE
import android.view.MotionE
import android.view.SurfaceHolder.C
public class MySurfaceView extends SurfaceView implements Runnable, Callback {
private SurfaceHolder mH // 用于控制SurfaceView
private T // 声明一条线程
private v // 线程运行的标识,用于控制线程
private Canvas mC // 声明一张画布
private P // 声明一支画笔
float m_circle_r = 10;
public MySurfaceView(Context context) {
super(context);
mHolder = getHolder(); // 获得SurfaceHolder对象
mHolder.addCallback(this); // 为SurfaceView添加状态监听
p = new Paint(); // 创建一个画笔对象
p.setColor(Color.WHITE); // 设置画笔的颜色为白色
setFocusable(true); // 设置焦点
* 当SurfaceView创建的时候,调用此函数
public void surfaceCreated(SurfaceHolder holder) {
t = new Thread(this); // 创建一个线程对象
flag = // 把线程运行的标识设置成true
t.start(); // 启动线程
* 当SurfaceView的视图发生改变的时候,调用此函数
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
* 当SurfaceView销毁的时候,调用此函数
public void surfaceDestroyed(SurfaceHolder holder) {
flag = // 把线程运行的标识设置成false
mHolder.removeCallback(this);
* 当屏幕被触摸时调用
public boolean onTouchEvent(MotionEvent event) {
* 当用户按键时调用
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
return super.onKeyDown(keyCode, event);
public boolean onKeyUp(int keyCode, KeyEvent event) {
surfaceDestroyed(mHolder);
return super.onKeyDown(keyCode, event);
public void run() {
while (flag) {
synchronized (mHolder) {
Thread.sleep(100); // 让线程休息100毫秒
Draw(); // 调用自定义画画方法
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (mCanvas != null) {
// mHolder.unlockCanvasAndPost(mCanvas);//结束锁定画图,并提交改变。
* 自定义一个方法,在画布上画一个圆
protected void Draw() {
mCanvas = mHolder.lockCanvas(); // 获得画布对象,开始对画布画画
if (mCanvas != null) {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLUE);
paint.setStrokeWidth(10);
paint.setStyle(Style.FILL);
if (m_circle_r &= (getWidth() / 10)) {
m_circle_r = 0;
m_circle_r++;
Bitmap pic = ((BitmapDrawable) getResources().getDrawable(
R.drawable.qq)).getBitmap();
mCanvas.drawBitmap(pic, 0, 0, paint);
for (int i = 0; i & 5; i++)
for (int j = 0; j & 8; j++)
mCanvas.drawCircle(
(getWidth() / 5) * i + (getWidth() / 10),
(getHeight() / 8) * j + (getHeight() / 16),
m_circle_r, paint);
mHolder.unlockCanvasAndPost(mCanvas); // 完成画画,把画布显示在屏幕上
}这个例子我们把绘图工作放到了线程t里,在线程t里调用了我们自己的非重载函数Draw。一般我们都会使用这种方法更新用户UI。因为如果把UI放在系统线程,如果遇到阻塞超过5S,软件就会被系统干掉。所以,我们在安卓系统上,不需要再考虑双缓冲,系统已经实现了双缓冲,再次调用,反而会导致效率更进一步被压缩。如果确实需要提升显示效果,就使用surfaceview吧,如果仍然不行,就试着使用C,C++来实现这些复杂处理吧。程序效果图如下:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:302464次
积分:4438
积分:4438
排名:第2528名
原创:112篇
转载:43篇
评论:340条
(2)(4)(5)(3)(4)(4)(1)(7)(1)(1)(1)(10)(10)(5)(5)(3)(2)(9)(6)(2)(1)(1)(3)(4)(1)(1)(2)(3)(2)(4)(7)(3)(37)部落冲突怎么登录不上啦?一直卡在缓存 从新启动也不好使_百度知道
部落冲突怎么登录不上啦?一直卡在缓存 从新启动也不好使
这次维护了是这样 正在下载又变成加载 然后又恢复到SC那个节目 你等一会别动 自己就好了 望采纳
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁后使用快捷导航没有帐号?
一步搞定
只需一步,快速开始
查看: 807|回复: 12
积分15506在线时间3999 小时分享阅读权限150主题UID6111474帖子精华0 战斗力0 点 技术62 点 金币3840 元 人气5022 点 贡献10469 点 手机华为 U8860 honor 荣耀注册时间最后登录
金币3840 元 手机华为 U8860 honor 荣耀
应用 名称:
懒人听书 v4.9.5
应用 大小:
应用 语言:
推荐 星级: ★★★★★
& & 应用 简介:
书看多了,眼睛容易累;网逛多了,容易倦。这时候,我们不妨换个方式来阅读,那就是最特殊最新潮的懒人“听书”。
解放双眼,懒人听书让您一心两用,驾车,地铁公交,家务,散步,旅行甚至工作,随时随地在有声的世界感受生活的美好。
懒人听书拥有英语学习,有声小说,评书,相声,百家讲坛,少儿读物等大量有声资源免费收听,一次下载处处收听,既可辅助学习,又可陶冶情操,消遣休闲。
界面优雅,操作简捷,支持下载,断点续传,本地播放,本地资源管理,书签历史功能,定时停止,自动播放下一首,力争用户体验做到最好。
如果您觉得好请多美言,不好请使用客户端反馈给我们,懒人团队竭诚为您服务。
强烈建议使用wifi下载
【更新内容】
1.解决某种特殊情况下无法从最近收听中点击继续播放的问题
2.优化缓存机制& & 应用 截图:
应用 下载:
游客,如果您要查看本帖隐藏内容请或点击感谢按钮
安装方法:
1、下载APK文件到手机里后,点击安装;GPK文件可使用GPK安装器进行安装
2、安装完成后,手机桌面上会出现相应的程序图标
3、点击程序图标运行。
↓↓↓想获取更多最新鲜最好玩的安卓精品软件,请访问安智软件专区↓↓↓【免责声明】
* 应用源自互联网;本版发布的作品版权归软件作者所有。
* 应用的作品禁用于商用,禁止盗用(包括但不限于)转载本作品必须注明出处!
* 您如果喜欢本软件,敬请购买正版,支持软件开发者改善和增强本软件的功能。
* 所有下载游戏在发布前均经过测试,但不保证绝对适用于所有Android 系统,须自行承担风险。
* 您一旦下载使用本软件,就表示您同意并遵以上条款,保留追究责任的权利。
* 若开发者对本版软件有异议请邮件至本人或私信版主告知,便以及时处理。
积分6471在线时间4323 小时分享阅读权限50主题UID635534帖子精华0 战斗力0 点 技术0 点 金币4396 元 人气24 点 贡献1373 点 手机u8800注册时间最后登录
, 积分 6471, 距离下一级还需 1529 积分
金币4396 元 手机u8800
非常感谢分享!支持一下!
积分2186在线时间834 小时分享阅读权限40主题UID3549273帖子精华0 战斗力0 点 技术0 点 金币5515 元 人气11 点 贡献2204 点 手机华为U8860注册时间最后登录
, 积分 2186, 距离下一级还需 814 积分
金币5515 元 手机华为U8860
支持一个。。。
积分2186在线时间834 小时分享阅读权限40主题UID3549273帖子精华0 战斗力0 点 技术0 点 金币5515 元 人气11 点 贡献2204 点 手机华为U8860注册时间最后登录
, 积分 2186, 距离下一级还需 814 积分
金币5515 元 手机华为U8860
再支持一个。。。。
积分1230在线时间504 小时分享阅读权限35主题UID4327154帖子精华0 战斗力0 点 技术1 点 金币2793 元 人气12 点 贡献1171 点 手机U8860注册时间最后登录
, 积分 1230, 距离下一级还需 570 积分
金币2793 元 手机U8860
这个可以有。
积分1在线时间0 小时分享阅读权限10主题UID帖子精华0 战斗力0 点 技术0 点 金币16 元 人气0 点 贡献2 点注册时间最后登录
, 积分 1, 距离下一级还需 4 积分
嗯嗯很不多
积分2在线时间0 小时分享阅读权限10主题UID帖子精华0 战斗力0 点 技术0 点 金币14 元 人气0 点 贡献3 点注册时间最后登录
, 积分 2, 距离下一级还需 3 积分
顶一个。。。
积分2在线时间0 小时分享阅读权限10主题UID帖子精华0 战斗力0 点 技术0 点 金币14 元 人气0 点 贡献3 点注册时间最后登录
, 积分 2, 距离下一级还需 3 积分
顶一个。。。
积分2在线时间0 小时分享阅读权限10主题UID帖子精华0 战斗力0 点 技术0 点 金币14 元 人气0 点 贡献3 点注册时间最后登录
, 积分 2, 距离下一级还需 3 积分
顶一个。。。
积分2在线时间0 小时分享阅读权限10主题UID帖子精华0 战斗力0 点 技术0 点 金币14 元 人气0 点 贡献3 点注册时间最后登录
, 积分 2, 距离下一级还需 3 积分
顶一个。。。
摩羯座勋章,申请勋章需要扣除200金币
十二生肖-申猴
十二生肖-申猴勋章,申请勋章需要扣除200金币
安智版主勋章
安智版主勋章
安智帅哥勋章
安智帅哥勋章
安智全勤勋章
签到满一百天即可申请
1000万会员勋章
1000万会员勋章
Powered by爱奇艺老是显示缓冲是怎么回事?和别的软件有冲突吗?_百度知道
爱奇艺老是显示缓冲是怎么回事?和别的软件有冲突吗?
提问者采纳
用爱奇艺缓存东西时,最好不要去玩别的软件。
提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!
其他类似问题
爱奇艺的相关知识
按默认排序
其他4条回答
缓冲那就是你的网络不好呗
没有,应该是你的网络不好
我也经常这样
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 部落冲突加载完闪退 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信