安卓系统下c4d渲染线程数入口在哪

先mark一下,好多人我发现始终停留在两三年的水平上没有突破。
另外还有一个误区就是越底层越牛逼
第三个就是,我认识的大部分所谓的做过rom开发的对framework的熟悉程度远不如我一个一直做应用的,大概是见木不见林,始终在那一个小角落里修修补补,不会横向,也没有纵向延伸。另外这里很重要的一点是基础,比如你是否有*nix基础,可以帮你快速理解很多东西
晚上有时间的话把这三块展开说一下
---------------------分割线,这么多评论,压力好大-----------------------
首先第一个问题:为什么很多人会一直停留在两三年的水平上,而后一直在重复以往的经验?
我认为最主要的一点就是主观能动性,或者说兴趣,如果你对Android开发没有太大的兴趣,那么还是尽早换方向吧。有了兴趣,然后就是要有一个比较正确的钻研路线,不要这也搞那也抓,最后什么都没精通又好像什么知道。一个很好的例子就是我用过很多库啊
第二个阶段,我觉得可以尝试去了解Android Framework比较细节的一些东西,比如activity启动流程,顺便分析清除Activity stack的管理,比如了解Android的资源加载机制,顺便了解aapt是如何打包Android资源的;又比如Java的类加载机制,这里配合资源的加载机制,很自然的就可以去了解Android的hotpatch机制,插件化的实现,开一些这方便的开源库或者自己撸一个也就自然而然。这里我比较推荐
第三个阶段,横向扩展,到这个阶段并不是说比第二个阶段更加高级了,而是对第二个阶段的一些补充,比如你是不是可以了解一下web开发,这样做hybrid开发的时候就会更顺手。是不是要了解一下这么火爆的ReactNative&Weex技术,甚至可以把他们的一些思想拿过来自己用,比如我司内部就有很多项目是用了JSCore和CssLayout来实现一些更轻量的动态化技术的。正如科学领域很多重大贡献都是在交叉学科领域出现的。技术上到了这个阶段甚至可以做到技术影响业务,技术驱动业务。
第二个问题:技术越底层越牛逼么?其实大部分技术都是为了满足业务需求,我认为这种场景下,是能越好的反哺驱动技术才越牛逼,和底层不底层没关系。比如你app做的非常牛逼,交互和性能非常好,直接带动业务飞速发展,我觉得你并比能做底层人差,术业有专攻,以你的态度和能力,即使去做底层开发,也是没有问题的。
第三个就是为什么很多做rom的反而对Framework不是很熟悉我觉得这个和第一个问题有些重复,兴趣是很大的原因。另外一个问题就是,如果没有*nix的编程基础,底层的一些东西比如binder机制,比如runloop可能会有一些吃力。这里服务端的同学可能会有一些优势,他们对rpc和一些系统调用相对熟悉一些,这也是为什么很多后端转到Android的同学可以快速精通。
------啰啰嗦嗦写这么多,请大家来拍砖-------
我猜你这个阶段是把大部分demo都能跑通了吧,常见的控件也会了吧。但是,你现在还是会的太少了。就是会用Linearlayout/relativelayout/button/textview/edittext/imageview(的很少一部分属性)来画一些简单的界面了吧。就是会用activity/fragment(的生命周期这么少的知识)来让ui在手机里面显示出来了吧。就是会用asynctask(这么简单的一个过时的类)来网络请求了吧。就是会继承了个Application类来接几个第三方服务(几行代码就接入)了吧。就是会用个broadcast(估计只会最基本的显式广播,排队广播,粘性广播啥的都不会用)了吧。就是会ListView+BaseAdapter+ViewHolder(总共不到10个重载的方法)或者recycleview+adapter(估计不会自定义layoutmanager,估计没才过itemanim的坑)来展示数据了吧。这总共就多大一点知识啊,学的这些东西内容这么少,不迷茫才怪。如果我说屈你了。好。你说你比这强。都会自定义控件(总共就measure draw layout这三个方法)了,还会volley(代码写的一堆callback hell),还会sqllite(这玩意没多大用,也是死东西)勒,还会xml里面定义动画(就平移 反转 透明 旋转 属性这几种)勒,甚至你还会eventbus(别说只会onEventMainThread哦),你还会rxjava(学过函数式语言的都感觉这没啥)。你说你还追新,md控件玩的溜的很,toolbar(兼容到4.4的沉浸式状态栏会用不?)会用,drawerlayout会用(碰到过与surfaceview冲突的情况不?),还会用coordlayout+collapsinglayout+recycleview来做隐藏额头(知道那个collapsinglayout中的mode是干啥的不,自定义behavor会不?:)这些都会了不?啥,你都会了?再留个作业。APP里面的main在哪?别的桌面应用框架像Qt,人家显示控件都要new一个window,那咱app的这个渲染控件的window在哪new的,咋让咱屏幕听话跟着画的?咱手机这么多传感器,那传感器数据咋来到咱app的?那manifest在咱手机里面咋滚轮的,发生了啥,系统咋处理的?我在美团里面能打开支付婊的支付界面,这在咱手机里面发生了啥?
很多人都提供了非常不错的答案,我也是受益匪浅,谢谢各位。
但是我觉得很多排名靠前的答案都给我感觉,思路太中国式了,像中国的考试一样,追求难题,追求穷尽真理。比如
第一个建议,对于一个junior developer,如果想往上走,在强化知识体系的之前,我往往建议先完善自己在debug tools上的经验。
比如:网络debug tools: Charles, mitmproxy, Stetho内存泄露:Memory Analyser, Leak CanaryOverdraw: 手机上的Drawing Settings, AVD Manager/Layout, Stetho数据库和cache: Stetho,SqliteManager还有最原始的,利用logcat打log,分析log并且知道各种参数,比如-v time显示时间,-s做filter等等
中国有句古话,工欲善其事,必先利其器。将各种debug工具掌握好,有利于更快地从Junior level提高上来。
第二个建议,提高自我表达能力。我在面试facebook的时候(别问细节了,没过),有一个题目很有意思,来说一个你比较了解的工具或者api,whatever什么玩意都可以,看你能否有逻辑地、准确地将某lib的整个框架描述清楚,比如优缺点,比如运行流程和坑。在这里面,ABCD的某个环节中,你可以说你在B上内部逻辑不清楚,但是input 和output一定要说出来,如果能说出limitaion就更好了。
这项能力的好处是,“准确而有逻辑地表达”往往需要清晰的头脑、丰富的知识储备,这项训练在programming中是非常有好处的,我发现凡是口头表达逻辑很清晰的人,编程coding逻辑感也非常强。有好的逻辑思维的人,成长是极快的。
第三个建议,如果追求精通,不要一上来就追求对整个Android的精通,要先追求模块的精通。有些人强于写googlemap,有些人对Volley库极为熟悉甚至被merge过很多pr,有些人可能对动画非常了解,甚至有些人专门研究android相机保存图片等。其实等你很熟悉一两个模块后,你会发现其他的东西很容易触类旁通,就算不看代码,猜也猜得到。
第四,提高英语能力。以前在国内只用baidu,后来出国了之后用英语才发现,简直是多长了一个脑子的感觉,高质量的文章比比皆是。所以如果英语好,在IT skill上的进步可能会快好几倍,真的不夸张。
最后,不要被面试官吓到,他的问题肯定是经过准备的,没准他比你早知道不了几天这个问题的答案并且从来没在真正项目上apply过。不知道就说不知道,不过我一般会建议在不知道的问题上猜一下,并非瞎猜,只是告诉他“这个问题我确实没研究过,不过以我对android的了解看,应该是哪儿哪儿的问题或者应该是由于某种机制产生的”,目的就是显示我对android很了解,很有信心。因为谁都不可能在工作中不查看新的东西,只用旧知识的公司应该是不存在的。
我们先来对问题分解一下:Android 开发 : 分成成1.
一般的开发技能2.
"移动应用开发"
移动应用开发相关概念思想3.
"Android 开发"
特指与 Android 开发直接相关知识技能
正如你可能所想的那样,这样的问题不像1 + 1等于2那样,有一个简单确切的答案.真正答案因人而异. 下面我以自己几年的Android 开发经验,与你分享一二.就按我上面所分解的几个方面来说一说:一: 开发技能
你可以看成是一般的编程技能这方面你可以从
编程语言的熟练掌握
面向过程编程思想
面向对象的思想
函数式编程思想
算法与数据结构
网络编程,TCP/IP 协议
版本管理(Git 等)
等方面的检查和提高自己
更详细的技能树,请自己搜索
二: 移动应用开发
你可以看成是 App 开发
估计这可能是你更感兴趣的
这方面你可以从:
MVC 这成三个方面来对照检查下 M: 数据层
移动应用数据结构特点
数据存储 :SQLite数据库,文件存储
数据格式: XML 格式,JSON格式
序列化与反序列化
数据查询: 移动应用一般数据库主要是 用SQLite
(说回来,单是 SQLite 数据库,就可以花不少时间来深入学习下,
因为对一个应用来说,数据基本是核心)
移动应用界面特点
移动应用构建界面常用方法
移动应用交互特点
移动应用动画
系统 UI 系统特点,优点,缺点及局限
移动应用控制层特点
控制层的生命周期
多线程,UI 线程,后台线程
再加一层:E: 事件层
事件处理,触控事件,手势,事件响应链
三: Android 开发 工具篇 - 工欲善其事,必先利其器
Android Studio 掌握用得怎么样了?
Adb 及相关工具会用吗?
Gradle 构建系统呢?
文档篇 - 看 Android 官方是怎么定义开发各种技能的.
相信常看 Android 开发者官方网站,你会收益良多,我下面写的也不必看了.
Android 多线程编程,异步编程特点 - Loop,Handler,IntentService,Broadcast,MessageQueue
Android UI 框架特点,优势和不足
然后你再按 MVC 将 Android 各部分再分析分析,总结总结.
从操作系统层面去学习,不要仅限于应用层开发,开放的系统源代码方便学习。
这两天面试也一直在跟来面试的两个有三年工作经验的程序员聊这个问题。
你的程序要实现某个要求的功能并不是太难,尤其是一般生活中用的App,游戏另说。
但是要把你的App做的别人一看就觉得好看好用,那是非常非常困难的。
这两个人一个iOS一个安卓,给我看的是同一个应用(是的,来自同一家公司),在把手机递给我的时候两个人都说了同样一句话:界面有点丑。
界面丑当然是产品经理和UI、UE的问题,但是,程序员的问题也是显而易见的,你为什么要做一个自己都觉得很丑的应用?还把这个当成面试的敲门砖?而且我跟他们强调,当时UI做出来的设计稿一定比你这个成品要漂亮,不然不可能通过老板的审核,而且水平再差的UI随便画个界面出来也不至于难看成这样。肯定是你们在做的时候丢失了细节,而后产品经理和老板都无可奈何,因为你们说做不到他们就没办法。好的应用的第一个必要条件,就是要让用户第一眼能够接受它,你们手机里那些自己觉得很好用,天天用的应用,有哪个完全是因为功能不可替代而忍受它难看难用的界面的?(网银App除外)
题主提出了三个问题:
把 Google 的 Samples 全部跑一边
阅读 Samples 的源码以及 Samples 给的控件的源码
了解所有的 Android 控件的继承关系,尽量都背下来。是的,你没看错,背下来。继承关系的了解有助于你解决后面开发中遇到的难题。
比如说新出的 Toolbar 继承于 ViewGroup,如果多次阅读过 ViewGroup 的源码。对于新出的 Toolbar 只需看一遍源码便知如何使用。如果熟悉了 ViewGroup,然后阅读 Toolbar 的源码(源码两千多行,基于前面的基础,大部分代码都无需仔细阅读了),2 个小时不到就能完全掌握 Toolbar。
再次建议,跑 Samples,多阅读源码,背下继承关系。
2. 怎么才能叫精通?私认为,你要是能回答小白提的任何 Android 问题,你都能对答如流就是精通。:)不要小瞧小白提问方式以及问题。我组织了一个,里面很多人问我 Android 问题,我有一大半没办法直接答出来。然而我做了六年 Android 开发了。
3. 方向在哪?题主问得什么方向?着实没看懂题主的问意。
======= 补充点我解决 Android 难题的思路
关于解决 Android 难题的思路,我很赞成
使用 Debug 或者 Logger 调试分析代码流程,这一步是为了了解执行流程,在了解的过程中,问题一般都能解决掉。
通过第一步,我们可以对代码有一个清晰的流程认知,能解决掉自身的逻辑 BUG。
第 2 步如果没有逻辑 BUG,剩下就是使用控件本身产生的 BUG 。这时候就直接去阅读源码,理清源码的逻辑流程,这一步能解决掉 90% 的 BUG。
还有 10% 就尝试能不能通过继承改变源码的逻辑流程,然后解决掉 10%
中的 99% 的 BUG。
第 4 步遗留的 1%,就通过 google,善用 site:http//xxxx keyword。http 的 url 一般是 stackoverflow、github,keyword 尽量使用英文。
能力还不够答这个题目,还是尝试答一下,我用我自己得例子来说明下。两个例子。1,数据库索引优化以前做一个项目数据量很大,然后想做优化,一顿加索引然后发现反而更慢了,于是乎去研究下发现联合索引更快索引超过5个后明显变慢,也更适合层级递进查询,但是原理不知,于是乎去了解索引的原理设计,从而让自己有能力下次去避免这个问题或者做的更好。
2,一次面试记得handler和looper得模式经典面试题,人人都能浅谈下。那么你知道sendmessagedelay如何实现的,handler得生命周期如何,跨线程是如何通信的等等。当详细问下去的时候很多人是不知道得。很多人会知道handler生命周期长做静态内部类加索引用,但是你知道为什么吗?我当时就是一问三不知,回去赶紧查看源码了解管道,epoll模型等。
我本身对安卓开发一知半解,但是也算亲眼见证了几个大牛(不仅限于安卓)的成长,所以给一点我所知道的办法。
1。面临一个解决不了的问题的时候,最初阶段放弃百度,放弃google搜索。尽量做到只依靠安卓官方文档。
搜索引擎是一个黑匣子,问他“xx问题应该怎么解决”,它会忽略掉一切中间的思考,分析,解决流程,给出最后的答案。 其结果就是,使用答案的人基本上不可能理解“为什么这么去做”,只知道“可以这么做”。 就像一个没学过加减法,只会用计算器的收银员,有计算器能工作,但是恐怕没有心算的快。复杂的问题如果计算器不会算,他也不会。等到通过基本的文档自己找到了思路和方案,再去看看有没有别人写好的第三方的东西,或者成熟的方案,再和自己的东西印证。 这要花很多的时间,会比别人慢,会把别人休息的时间用来加班。 但是大牛如果是睡觉打游戏就能养成的,这个问题也不会出现了对不。
2。安卓系统源代码要常备。跟踪代码时候,尽可能跟到系统的层面,越深越好。至少sdk要进去。不了解sdk的代码,自己就很难写出同级的代码。好代码看的多了,自然自己的水准也会提高。熟读唐诗三百首嘛。
3。如果代码没有按预期的去动作,不要第一时间想着去解决这个现象,而是要追究为什么会发生这个现象。 比如程序崩溃了,加个try catch自然解决了这个问题。但是这么做就太糟了。 自然要问问,为什么会出现这个exception?底层的返回null了,上层没处理。哦,加个判断就好了。这样好一点,但是仍然很糟。 底层为什么会返回null?如果null是合法的返回,文档里有没有约定?如果没有约定,文档有问题,如果约定了,代码有问题。更主要的是,其他地方是不是犯了同样的错误?我是不是存在“不注意文档约定”或者“写文档时候忘记约定”这样的问题? 到这个地方,才真的对自己的成长有所帮助。大牛也是一步一步走上来的。
4。多把自己知道的东西教给别人。 比如写一些知识和技巧跟大家分享,或者召集一个公司内的小培训。这样做的好处有两个。 第一自己得到了锻炼。把知识系统化总结,对自己是一个回顾,整理,沉淀的过程。这个过程中可能会找到自己尚欠缺的地方,也可能会被别人的提问启发。 第二是能逐步树立自己的地位感,成为大牛也是一个正向激励的过程,往往是牛人越来越牛,普通人越来越普通……
阅读(...) 评论()Unity4、Unity5移动平台多线程渲染在部分安卓手机上会造成闪退
时间: 10:46:16
&&&& 阅读:1556
&&&& 评论:
&&&& 收藏:0
标签:你看到的crash堆栈可能是这样的:
SIGSEGV(SEGV_MAPERR)
&&#00&&pc&0001276c&&&&&&&&&&&&&&&&&&&&&&&&&&/system/lib/libc.so
&&&&&&&&&#01&&pc&00013dcc&&&&&&&&&&&&&&&&&&&&&&&&&&/system/vendor/lib/egl/libGLESv2_mtk.so
&&&&&&&&&#02&&pc&00013ea2&&&&&&&&&&&&&&&&&&&&&&&&&&/system/vendor/lib/egl/libGLESv2_mtk.so
&&&&&&&&&#03&&pc&00014c9e&&&&&&&&&&&&&&&&&&&&&&&&&&/system/vendor/lib/egl/libGLESv2_mtk.so
&&&&&&&&&#04&&pc&003a46e4&&&&&&&&&&&&&&&&&&&&&&&&&&/data/app/com.tencent.tmgp.sgamece-1/lib/arm/libunity.so
&&&&&&&&&#05&&pc&003a6200&&&&&&&&&&&&&&&&&&&&&&&&&&/data/app/com.tencent.tmgp.sgamece-1/lib/arm/libunity.so
&&&&&&&&&#06&&pc&001f7f50&&&&&&&&&&&&&&&&&&&&&&&&&&/data/app/com.tencent.tmgp.sgamece-1/lib/arm/libunity.so
&&&&&&&&&#07&&pc&0038832c&&&&&&&&&&&&&&&&&&&&&&&&&&/data/app/com.tencent.tmgp.sgamece-1/lib/arm/libunity.so
&&&&&&&&&#08&&pc&&&&&&&&&&&&&&&&&&&&&&&&&&&/data/app/com.tencent.tmgp.sgamece-1/lib/arm/libunity.so
&&&&&&&&&#09&&pc&00319a60&&&&&&&&&&&&&&&&&&&&&&&&&&/data/app/com.tencent.tmgp.sgamece-1/lib/arm/libunity.so
&&&&&&&&&#10&&pc&00015c5a&&&&&&&&&&&&&&&&&&&&&&&&&&/system/lib/libc.so
&&&&&&&&&#11&&pc&00013cea&&&&&&&&&&&&&&&&&&&&&&&&&&/system/lib/libc.so
#00&&pc&0000f22c&&/system/lib/libMali.so
&&&&&&&&&#01&&pc&0000fd24&&/system/lib/libMali.so
&&&&&&&&&#02&&pc&&&/system/lib/libMali.so
&&&&&&&&&#03&&pc&000523dc&&/system/lib/libMali.so
&&&&&&&&&#04&&pc&0005098c&&/system/lib/libMali.so&(shim_eglSwapBuffers&+58)
&&&&&&&&&#05&&pc&&&/system/lib/libEGL.so&(eglSwapBuffers&+8f)
&&&&&&&&&#06&&pc&003d0350&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#07&&pc&003d5930&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#08&&pc&0039ffb4&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#09&&pc&0038bb68&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#10&&pc&&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#11&&pc&00319a60&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#12&&pc&&&/system/lib/libc.so&(__thread_entry&+48)
&&&&&&&&&#00&&pc&&&/system/lib/egl/libGLESv2_tegra_impl.so
&&&&&&&&&#01&&pc&000207cc&&/system/lib/egl/libGLESv2_tegra_impl.so
&&&&&&&&&#02&&pc&00020be4&&/system/lib/egl/libGLESv2_tegra_impl.so
&&&&&&&&&#03&&pc&00012fa4&&/system/lib/egl/libGLESv2_tegra_impl.so
&&&&&&&&&#04&&pc&&&/system/lib/egl/libGLESv2_tegra_impl.so
&&&&&&&&&#05&&pc&&&/system/lib/egl/libGLESv2_tegra.so&(glDrawElements&+2c)
&&&&&&&&&#06&&pc&003a7a70&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#07&&pc&001f85c8&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#08&&pc&&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#09&&pc&&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#10&&pc&00319a60&&/data/app-lib/com.tencent.tmgp.sgamece-1/libunity.so
&&&&&&&&&#11&&pc&&&/system/lib/libc.so&(__thread_entry&+48)
&&&&&&&&&#12&&pc&&&/system/lib/libc.so&(pthread_create&+f0)
所以后来人还是不要尝试使用多线程渲染了,毕竟前人已经帮你踩过坑了。标签:
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!主线程之外的线程中向屏幕绘图&-&SurfaceView
在一般情况下,应用程序的View都是在相同的GUI线程中绘制的。这个主应用程序线程同时也用来处理所有的用户交互(例如按钮单击或者文本输入)。
对于一个View的onDraw()方法,不能够满足将其移动到后台线程中去。因为从后台线程修改一个GUI元素会被显式地禁止的。而SurfaceView,可以在主线程之外的线程中向屏幕绘图。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。
当需要快速,主动地更新View的UI,或者当前渲染代码阻塞GUI线程的时间过长的时候,SurfaceView就是解决上述问题的最佳选择。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main
UI thread。所以显然view不合适,需要surfaceView来控制。
被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于onTouch 来更新,可以直接使用
invalidate。因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。
&&&&SurfaceView使用的方式与任何View所派生的类都是完全相同的。可以像其他View那样应用动画,并把它们放到布局中。
SurfaceView 有一个原则,所有的绘图工作必须得在Surface
被创建之后才能开始。可以被直接复制到显存从而显示出来,这使得显示速度会非常快,而在Surface
被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed
就成了绘图处理代码的边界。
需要重写的方法
&(1)public void surfaceChanged(SurfaceHolder
holder,int format,int width,int height){}
//在surface的大小发生改变时激发
&(2)public void surfaceCreated(SurfaceHolder
//在创建时激发,一般在这里调用画图的线程。
&(3)public void surfaceDestroyed(SurfaceHolder
holder) {}
//销毁时激发,一般在这里将画图的线程停止、释放。
一个典型的SurfaceView
设计模型包括一个由Thread所派生的类,它可以在创建的时候接收对当前的SurfaceHolder的引用,在Thread的run方法中,可以由该引用可以得到布局中SurfaceView的canvas,
并更新它。
package dhb.
import android.app.A
import android.content.C
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.R
import android.os.B
import android.view.SurfaceH
import android.view.SurfaceV
public class MysurfaceTestActivity extends Activity {
&int count =
&&& public void
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
&&& public
void doDraw(Canvas c){
c.drawColor(Color.BLACK);//设置画布背景颜色
Paint p = new Paint(); //创建画笔
p.setColor(Color.WHITE);
Rect r = new Rect(100, 50, 300, 250);
c.drawRect(r, p);
c.drawText("这是第"+(count)+"秒", 100, 310, p);
&&& //视图内部类
MyView extends SurfaceView implements SurfaceHolder.Callback
private SurfaceH
private MyThread myT
private MyDrawThread myDrawT
public MyView(Context context) {
&&&&&&&&&&&
super(context);
&&&&&&&&&&&
// TODO Auto-generated constructor stub
&&&&&&&&&&&
holder = this.getHolder();
&&&&&&&&&&&
holder.addCallback(this);
&&&&&&&&&&&
myThread = new MyThread (); //创建一个数据更新线程
&&&&&&&&&&&
myDrawThread = new MyDrawThread (holder);//创建一个绘图线程
public void surfaceChanged(SurfaceHolder holder, int format, int
&&&&&&&&&&&&&&&
int height) {
&&&&&&&&&&&
// TODO Auto-generated method stub
& System.out.println("surfaceChanged");
&&&&&&&&&&
public void surfaceCreated(SurfaceHolder holder) {
&&&&&&&&&&&
// TODO Auto-generated method stub
& System.out.println("surfaceCreated");
&&&&&&&&&&&
myDrawThread.isRun =
&&&&&&&&&&&
myDrawThread.start();
&&&&&&&&&&&
myThread.isRun =
&&&&&&&&&&&
myThread.start();
public void surfaceDestroyed(SurfaceHolder holder) {
&&&&&&&&&&&
// TODO Auto-generated method stub
&&&&&&&&&&&
myDrawThread.isRun =
&&&&&&&&&&&
myThread.isRun =
&&&&&&&&&&&
System.out.println("surfaceDestroyed");
&&& //线程内部类
//数据更新线程
MyThread extends Thread
public boolean isR
public MyThread ()
&&&&&&&&&&
public void run()
& System.out.println("MyThread - run");
&&&&&&&&&&&
while(isRun)
&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&Thread.sleep(1000);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&
catch (InterruptedException e)
&&&&&&&&&&&&&&&
&&&&&&&&&&&
TODO Auto-generated catch block
&&&&&&&&&&&
&&&&e.printStackTrace();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&
//创建一个绘图线程
MyDrawThread extends Thread
private SurfaceH
public boolean isR
public& MyDrawThread(SurfaceHolder holder)
&&&&&&&&&&&
this.holder =
&&&&&&&&&&&
public void run()
& System.out.println("MyDrawThread - run");
&&&&&&&&&&&
while(isRun)
&&&&&&&&&&&
&&&&&&&&&&&&&&&
Canvas c =
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
synchronized (holder)
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
holder.lockCanvas();//锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
&&&&&&&&&&&&&&&&&&&&&&&
doDraw(c);
&&&&&&&&&&&&&&&&&&&&&&&
Thread.sleep(1000);//睡眠时间为1秒
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
catch (Exception e) {
&&&&&&&&&&&&&&&&&&&
// TODO: handle exception
&&&&&&&&&&&&&&&&&&&
e.printStackTrace();
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
if(c!= null)
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
holder.unlockCanvasAndPost(c);//结束锁定画图,并提交改变。
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 ae多线程渲染 的文章

更多推荐

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

点击添加站长微信