写作能力的优劣,很大一部分是靠平时的阅读积累;同样编写代码的能力也是通过阅读优良的源码,去其糟粕取其精华,不断提炼,才能写出高效优良的代码。阅读了很多Google源码,觉得其中有很多的编程思想值得我们借鉴,因此将其中一些编程技巧记录下来,以备查询。
情景:在进行复杂程序的编写的时候,我们经常要进行多线程的操作,并在主线程(UI线程)中更新UI。
大家在Android编程中一定遇到过上述的编程情景,各式各样的数不胜数,在此就不做过多介绍,我们主要介绍google源码编程技巧,给大家一些新的编程思路。
以下代码是模仿Android Gallery模块源码中过线程更新UI线程的方式:
package com.jony.test; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class Test extends Activity { private TextView text; private Button change; private MyThread myThread; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); change = (Button) findViewById(R.id.change); text = (TextView) findViewById(R.id.text); myThread = new MyThread(this); System.out.println("ThreadID: " + Thread.currentThread()); change.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { myThread.start(); } }); } class MyThread extends Thread{ private Handler mHandler; public MyThread(Activity activity) { mHandler = new Handler(activity.getMainLooper()); } @Override public void run() { System.out.println("ThreadID: " + Thread.currentThread()); mHandler.post(new Runnable() { @Override public void run() { // UI线程 System.out.println("ThreadID: " + Thread.currentThread()); text.setText("Hi Jony"); } }); } } }
(备注:代码很简单,关键是方法和思想)
通过这个demo将了解WiEngine创建一个游戏的基本流程,在看代码之前先了解一下一些基本概念。
copy自官网:
基本概念 坐标系Android的缺省坐标系是原点在左上角,x和y轴的正向是往右和往下。而OpenGL的坐标系是原点在左下角,x和y轴的正向是往右和往上。WiEngine采用了OpenGL的坐标系,所以要注意设置某些坐标的时候,是要相对于左下角来说的。
场景(Scene)不管是应用还是游戏,都可以认为是由一个个界面组成的,界面之间的跳转就形成了这个应用或者游戏的操作流程。在WiEngine里,这一个个界面叫做场景。一个典型的游戏,应该是包含一个载入界面,一个菜单界面再加一个游戏界面,那么就可以划分为三个场景。WiEngine提供了场景对象,同时支持场景之间切换的各种特效。
节点(Node)从类结构上去看,场景并不是最顶层的类,它实际上是Node的子类。节点是WiEngine中的顶层概念,它代表游戏中的某个“东西”。做个不是特别恰当 的比方,它类似于Java中的Object类。Node类是很多类的父类,比如菜单,比如贴图,等等。节点可以包含子节点,因此它们可以形成一个树型的结构,在游戏绘制时,它从根部开始,一直绘制完所有节点,就完成了一帧的渲染。
节点有一些比较基本,也是比较关键的概念:
翻译成导演其实没错,但是感觉怪怪的,还是用Director吧。Director是单例模式的,游戏开始结束时都需要调用Director的方法进行初始化或者销毁工作。Director提供了一些管理场景的方法,比如runWithScene, pushScene, replaceScene等,通过这些API可以实现在各个场景之间切换。
也可以通过Director设置或者获取一些系统信息,比如调整一些OpenGL相关的设置,得到屏幕大小等,因此Director也是开发者和WiEngine系统间的一个桥梁。
层(Layer)层也是节点的子类,它可以做为场景的子节点加入到场景中。所以场景也可以有多个层,可以根据需要显示不同的层,当然,你也可以不用层,这些都由你来把握。
精灵(Sprite)Sprite在WiEngine中主要就是代表一个图片相关资源,比如从某个PNG图片中载入的一个人物形象。Sprite是节点的子类,所以Sprite具有节点应该具有的一些特性。另外还有一个AtlasSprite,它和Sprite的区别只是图片的来源不一样,关于什么是Atlas请看下一小节。
图片集(Atlas)OpenGL对贴图的宽高尺寸有一个2的整数幂的要求,也就是长宽必须是2, 4, 8, 16, 32, 64等等。但是大部分时候图片都不是正好这个大小,这样的话每个图片都可能浪费一些内存,累积起来就会比较可观。为了节省资源,可以把若干张图片拼成一大张,这张大图片就叫做图片集。在使用时,图片集被整个载入,但是绘制的时候,可以只绘制指定的部分,这样就好像是单张图片一样了。AtlasSprite就是指这个Sprite来自于某个图片集,它一般要结合TextureAtlas使用,图片的载入工作是由TextureAtlas完成的,AtlasSprite只是指定一下绘制区域的相关坐标。
动作(Action)游戏里经常会需要进行一些动画或者交互操作,Action为这种需求提供一种通用框架。Action说明了一个效果该怎么去做,而节点是效果的载体,通过Node.runAction()方法,可以在任意节点上执行一个Action。Action有许多子类,每个都对应于一种动作或者特效,而且多个Action还可以组合起来构成新的效果,比如同时既旋转又缩放。
================================================================================
创建一个Android项目,将WiEngine的库导入进去,创建一个Activity并实现IDirectorLifecycleListener接口,代码如下:
public class MainActivity extends Activity implements IDirectorLifecycleListener { static { System.loadLibrary("wiskia"); System.loadLibrary("xml2"); System.loadLibrary("wiengine"); System.loadLibrary("wiengine_binding"); System.loadLibrary("lua"); System.loadLibrary("chipmunk"); System.loadLibrary("box2d"); System.loadLibrary("wisound"); } protected WYGLSurfaceView mGLSurfaceView; protected Scene mScene; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLSurfaceView = new WYGLSurfaceView(this); setContentView(mGLSurfaceView); // 设置显示FPS Director.getInstance().setDisplayFPS(true); // 添加一个生命周期监听器 Director.getInstance().addLifecycleListener(this); } private void createScene() { // 创建一个场景,并向其中添加一个Layer mScene = Scene.make(); mScene.addChild(new VLayer()); mScene.autoRelease(true); } @Override public void onSurfaceChanged(int arg0, int arg1) { createScene(); // 运行场景 Director.getInstance().runWithScene(mScene); } @Override public void onSurfaceCreated() { } @Override public void onSurfaceDestroyed() { } @Override protected void onDestroy() { Director.getInstance().end(); super.onDestroy(); } @Override protected void onPause() { super.onPause(); Director.getInstance().pause(); } @Override protected void onResume() { super.onResume(); Director.getInstance().resume(); } @Override public void onDirectorEnded() { } @Override public void onDirectorPaused() { } @Override public void onDirectorResumed() { } @Override public void onDirectorScreenCaptured(String arg0) { } }
Activity的view 为WYGLSurfaceView
mScene = Scene.make();
mScene.addChild(new VLayer());
mScene.autoRelease(true);
创建了一个场景mScene,并向其中添加了一个Layer,下边是VLayer的具体实现
VLayer.java
public class VLayer extends Layer implements INodeVirtualMethods { private Sprite mSprite; public VLayer() { // 制造精灵 mSprite = Sprite.make(R.drawable.role_3_0); addChild(mSprite); // 设置精灵的位置 mSprite.setPosition(100, 200); } @Override public void jDraw() { // TODO Auto-generated method stub } @Override public void jOnEnter() { // TODO Auto-generated method stub } @Override public void jOnEnterTransitionDidFinish() { // TODO Auto-generated method stub } @Override public void jOnExit() { // TODO Auto-generated method stub } }
国际惯例,上图:
转载请注明出处:http://blog.csdn.net/Vestigge
押宝移动处理器的英伟达终于从财报中闻到了蛋糕的香味。
11月10日,英伟达发布了截至今年10月30日的2012财年第三季度收入情况。该季度销售额达10.7亿美元,同比增长26.3%;净利润为1.783亿美元,同比增长110%;毛利率为52.2%,高于去年同期的46.5%,连续五个季度创下历史新高。
令英伟达感觉神清气爽的原因是,它们及时加大了对于智能手机以及平板电脑芯片生产的力度。据报道,其消费者产品包括移动处理器图睿(Tegra)芯片等在第三财季的收益上升了14%,达到1.91亿美元。
“随着视觉和移动越来越多地融入到人们生活中,英伟达的战略得到充分认可。”在谈到财报显示移动芯片销售超出预期时,英伟达总裁兼CEO黄仁勋难抑兴奋之情。他表示,图睿系列产品在明年的营收将达到10亿美元。
业内人士介绍,英伟达早在2008年就投资10亿美元用于移动互联网的开发,移动终端市场快速发展的今天,无疑为其转型烧了一把旺火。面对大好形势,黄仁勋预计英伟达在2013财年的营收将达50亿美元。
但英伟达的野心不仅在此,它似乎更倾向于在移动计算领域找到当老大的感觉。如此一来,黄仁勋必须拿出足以挑战传统芯片业巨头美国高通、德州仪器和三星等企业的实力。当然,它还必须小心应付苹果公司的随时进攻。
GPU市场之殇
近两年,平板电脑和智能手机市场对英伟达的打击尤深。
2010年8月,英伟达交出了一份糟糕的第二季度财报:净亏损为1.41亿美元,总营收下降19%。更触动英伟达人神经的是,此前两周的一份调查报告显示,英伟达在独立显卡市场的份额首次被竞争对手AMD超过。
但这并非坏消息的全部。有市场分析机构认为,显卡的发展趋势是和CPU走向融合,而AMD和英特尔都在致力于这个技术方向,英伟达由于没有x86授权,将被专利挡在这个趋势之外。英伟达所主营的独立显卡市场将逐渐走向小众化。
就目前行情来看,在最近的几个财季当中,虽然中国、印度等新兴市场包括传统PC机以及笔记本市场都在快速增长,但也只能在一定程度上弥补英伟达在欧美地区PC销售疲软致销量下降的影响。再加上泰国洪灾,硬盘供应不足,直接影响整个PC出货量。
有投资者担心,今年PC生产进度放缓的情况会持续到今年年底,还有可能延续到2012年。
高盛最近发出预警,在截至今年12月31日的第四季度里,全球的PC出货量可能会下降3%,而不是该机构去年所预期的上涨3.1%。
如果生产商持续减少PC的产量,那么也就意味着计算机图睿芯片(GPU)的需求也将会相应地减少,而这部分产品的销售占据了英伟达的大部分收入来源。
本刊记者从英伟达2012财年第三季度财报上了解到,由于PC市场持续疲软,其主营业务PC图形处理器及其与英特尔达成的许可协议的总收益,较第二财季仅上涨了1%。
“这个数据明年还可能更低。英伟达如何在全球芯片市场上重新找到自己的位子,已经迫在眉睫。”业内人士表示。
后来者的野心
幸好,黄仁勋带领英伟达及时做出了转型之举。
“PC市场放缓已经不是一两年,在过去10年中年增长最高也不超过20%,而手机每年都在30%以上,而智能手机增速更快。”英伟达亚太区高级市场总监庄海欧介绍说,“传统大而全的PC将不再受人关注,未来的增长点可能是基于各种应用的各类设备。基于这个认识,我们开始进行研发。”
据了解,2008年英伟达投资10亿美元用于研发基于ARM架构的图睿系列移动处理器。
“即使在财务困难情况下,我们对于新产品图睿的投入也没有减少,反而一直在增加。”庄海欧坦承这的确有点儿像下赌注。而黄仁勋也公开宣布英伟达将放弃封闭的x86架构,且基于开放的ARM架构的第一代Tegra(图睿)处理器已经面世。
2010年1月份,新一代Tegra2移动处理器面世。英伟达以其强大的视频处理功能和低功耗,获得多个厂家的青睐,以至于截至目前,几乎所有的双核平板产品均使用英伟达图睿第二代处理器。
在2012财年Q3财报发布前一天(11月9日),英伟达还发布了全球首款4核移动处理器Tegra3。
据介绍,该处理器为平板电脑与手机带来了PC级的性能,比以前的产品速度快三倍,将于今年12月份在世界各地上市。
有资深人士向《IT时代周刊》分析,目前英伟达图睿芯片系列已经占领高端Android智能手机的半壁江山。但英伟达期待能从对手那里抢到更多的市场份额。
10月21日,黄仁勋即在香港召开的以聚集IT科技话题的AsiaD大会上毫不隐晦地说:“高通是该公司最为直接的竞争对手,苹果则是间接竞争对手。”据他介绍,除了iPad以外,英伟达的芯片已经被用于70%的平板电脑和13款手机。
他还表示,将围绕移动处理器和显卡对公司进行重组,而且英伟达目前已经开始尝试增加GPU的用途,借此进军不同的产品领域。“GPU目前在很多PC中的性能和复杂度甚至超过了CPU,可以处理很多任务。”
形势不乐观
面对英伟达的频繁动作,高通、德州仪器、三星等企业都没有掉以轻心。
就在英伟达发布图睿第三代处理器不到一周时间,高通公司就对外宣称其4核Snapdragon处理器(S4)将于明年下半年出现在平板电脑中,它同样是基于ARM架构,高效低耗。高通发言人凯瑟琳·赖斯(CatherineRice)称,配置高通S4芯片的平板电脑将运行Windows8操作系统,可为设备带来逼真的图形效果。
市场调研公司Gartner提供的数据显示,今年第一季度全球智能手机产品的总出货量为1亿部,同比实现了85%的增长。在智能手机产品中高通的Snapdragon芯片是绝对的龙头老大。目前高通推出的Snapdragon芯片已经在超过125款在售的智能手机产品中使用。
与此同时,三星也宣称愿意通过收购获取更大的移动处理器市场份额,并预计在未来两三年内赢得更多的芯片制造业务。
此外,伴随着移动终端的发展,将有更多的竞争对手分食蛋糕。据韩国媒体报道,LG正在开发自己的智能手机移动处理器,以争取在智能手机产业中占有一席之地。
鉴于高通、德州仪器、三星等厂商已经积累了多年移动处理器的设计经验,以及不断涌入的后来者,竞争日益白热化。因此,有业内人士不免对新进入者——英伟达的处境表示担忧。而从市场方面来看,并不是所有人士都对图睿系列看好,尤其是专业分析师似乎并不买黄仁勋的账。
专业分析师认为,就在英伟达的Tegra3主打高效能之时,低价的KindleFire与Nook等平板却相继出现,它们使用的均是德州仪器的OMAP芯片。而英伟达的主要客户三星则打算采用自己的或是高通产品。而在近期还有消息从硅谷传出,摩托罗拉的新一代平板电脑——Xoom2也已经舍弃英伟达的图睿处理器改用德州仪器的OMAP芯片。
最让人捏汗还是英伟达的“硬伤”。据称,英伟达在无线通信技术芯片与中央处理器的连接方面尤显不足,而高通、德州仪器等由于掌握有成熟的移动通信技术,把相关技术集成到芯片中去不是难事,“凭借这点,它们就将获得更多移动终端厂商的欢心。”