当前位置:  编程技术>移动开发
本页文章导读:
    ▪Google源码技艺(一)        Google源码技巧(一)写作能力的优劣,很大一部分是靠平时的阅读积累;同样编写代码的能力也是通过阅读优良的源码,去其糟粕取其精华,不断提炼,才能写出高效优良的代码。阅读了很.........
    ▪ 【WiEngine 游戏发动机】基础(1)搭建一个最简单的Demo:添加一个精灵        【WiEngine 游戏引擎】基础(1)搭建一个最简单的Demo:添加一个精灵通过这个demo将了解WiEngine创建一个游戏的基本流程,在看代码之前先了解一下一些基本概念。 copy自官网: 基本概念 坐.........
    ▪ 英伟达初尝搬动市场甜头 黄仁勋小步快跑想称霸       英伟达初尝移动市场甜头 黄仁勋小步快跑想称霸      令英伟达感觉神清气爽的原因是,它们及时加大了对于智能手机以及平板电脑芯片生产的力度。据报道,其消费者产品包括移动处理器.........

[1]Google源码技艺(一)
    来源: 互联网  发布时间: 2014-02-18
Google源码技巧(一)

写作能力的优劣,很大一部分是靠平时的阅读积累;同样编写代码的能力也是通过阅读优良的源码,去其糟粕取其精华,不断提炼,才能写出高效优良的代码。阅读了很多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");
                }
            });
        }
    }
}


(备注:代码很简单,关键是方法和思想)

 

 


    
[2] 【WiEngine 游戏发动机】基础(1)搭建一个最简单的Demo:添加一个精灵
    来源: 互联网  发布时间: 2014-02-18
【WiEngine 游戏引擎】基础(1)搭建一个最简单的Demo:添加一个精灵

通过这个demo将了解WiEngine创建一个游戏的基本流程,在看代码之前先了解一下一些基本概念。

copy自官网:

基本概念 坐标系

Android的缺省坐标系是原点在左上角,x和y轴的正向是往右和往下。而OpenGL的坐标系是原点在左下角,x和y轴的正向是往右和往上。WiEngine采用了OpenGL的坐标系,所以要注意设置某些坐标的时候,是要相对于左下角来说的。

场景(Scene)

不管是应用还是游戏,都可以认为是由一个个界面组成的,界面之间的跳转就形成了这个应用或者游戏的操作流程。在WiEngine里,这一个个界面叫做场景。一个典型的游戏,应该是包含一个载入界面,一个菜单界面再加一个游戏界面,那么就可以划分为三个场景。WiEngine提供了场景对象,同时支持场景之间切换的各种特效。

节点(Node)

从类结构上去看,场景并不是最顶层的类,它实际上是Node的子类。节点是WiEngine中的顶层概念,它代表游戏中的某个“东西”。做个不是特别恰当 的比方,它类似于Java中的Object类。Node类是很多类的父类,比如菜单,比如贴图,等等。节点可以包含子节点,因此它们可以形成一个树型的结构,在游戏绘制时,它从根部开始,一直绘制完所有节点,就完成了一帧的渲染。

节点有一些比较基本,也是比较关键的概念:

  • 大小:节点一般是有个大小的,可以通过setContentSize来设置一个节点有多大。大小为0也没问题,只要确实需要。
  • 锚点(Anchor):锚点是相对于节点本身的坐标系来说的,通过setAnchorPercent方法设置锚点的相对位置。比如说,锚点是(0.5, 0.5), 而节点的大小是100×200, 那么这个锚点相对于本节点的坐标是(50, 100)。节点缺省的锚点位置是(0.5, 0.5), 也就是在节点的中间.
  • 位置:节点的位置可以通过setPosition方法设置。但是位置具体表示哪个点则受到relativeAnchorPoint标志的影响。当该标志为true时,位置和锚点是同一个点,当为false时,位置表示节点的左下角,和锚点是不同点。这个逻辑可能理解起来有点奇怪,由于WiEngine参考了cocos2d的一些命名,所以这个标志的名称也沿用了过来。但是我们觉得relativeAnchorPoint这个标志的名称起的有些令人费解,不排除在WiEngine的后续版本中修改该标志名称。relativeAnchorPoint不管是true还是false,一些基本操作,比如旋转,缩放等,都会根据节点锚点来进行。
  • 导演(Director)

    翻译成导演其实没错,但是感觉怪怪的,还是用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





        
    [3] 英伟达初尝搬动市场甜头 黄仁勋小步快跑想称霸
        来源: 互联网  发布时间: 2014-02-18
    英伟达初尝移动市场甜头 黄仁勋小步快跑想称霸

    押宝移动处理器的英伟达终于从财报中闻到了蛋糕的香味。

        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芯片。

        最让人捏汗还是英伟达的“硬伤”。据称,英伟达在无线通信技术芯片与中央处理器的连接方面尤显不足,而高通、德州仪器等由于掌握有成熟的移动通信技术,把相关技术集成到芯片中去不是难事,“凭借这点,它们就将获得更多移动终端厂商的欢心。”



        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    windows iis7站长之家
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3