当前位置:  编程技术>移动开发
本页文章导读:
    ▪关于Object-C 底层兑现self isa 的理解        关于Object-C 底层实现self isa 的理解 其他废话我就不多讲了,谈一谈我对self 和 isa的理解!主要是和java对比:self概念上的理解上我认为和java中的this是一样的,当然,底层的实现是有区别的,.........
    ▪ OpenGL点染管线        OpenGL渲染管线 很多书上介绍了渲染管线,往往严重脱离实际,不知道到底对应的程序代码是什么。作为程序员,在没有弄清代码流程和作用之前,所有的理论都很苍白。下面是一些补充说明.........
    ▪ service简括2       service简括二   bindService()   public class BindActivity extends Activity { private Button btnStartBindService; private Button btnStopBindService; private boolean isConnected=false; //service是否创建 @Override public void onCreate(.........

[1]关于Object-C 底层兑现self isa 的理解
    来源: 互联网  发布时间: 2014-02-18
关于Object-C 底层实现self isa 的理解

其他废话我就不多讲了,谈一谈我对self 和 isa的理解!主要是和java对比:
self概念上的理解上我认为和java中的this是一样的,当然,底层的实现是有区别的,毕竟是不同平台的两个语言,但是他们的概念的理解是一样的。就是在类实例化对象时,self指向了对象的首地址。
isa则相当于java中每个对象的class,就像我们平时写的,XXX.getClass()或XXX.class。OC中的isa指向了其类对象,想一下,我们在java中使用反射时不都是需要取得其类对象嘛!OC也一样,类对象isa也是用在运行时获取对象的类信息的。这样说其实和java中的class概念是一致的。大家可以参考这篇文章:http://blog.sina.com.cn/s/blog_7a2ffd5c01010nme.html
《Object-C基础教程》中有提到:“self指向的对象的首地址,而对象的首地址是isa变量”这样说不容易理解,会让人误会self 和 isa指向了同一个东西,应该是这样:self指向了对象的首地址,而对象的首地址一般是isa变量,isa又是保存了对象的类对象的首地址!汗,好像还是很绕,反正就是这两个变量其实是各有各的用处就是了。
-------------------------------------分割线-------------------------------------------
从这里顺便提一下子类的self和父类的self
我们初始化一个对象时会看到:self=[super init],先将父类初始化,然后再把父类的self赋给子类的self,这里又有点绕了,其实,父类的self和子类的self是同一个(正常情况下);那为什么要赋给子类的self呢?这就是因为有“非正常”的情况存在,大家可自行查阅,文章非常多。这里主要解释一下为什么父类的self和子类的self是同一个,我们平时看到很多文章会这么说:子类拥有一个父类的引用(无论是java还是OC都会这么说),我觉得这样说是不准确的说法,如果为了容易理解可以这么说。因为,如果只是简单的子类拥有父类的引用的话,父类的self和子类的self应该是不同的。和java一样,父类的this和子类的this也是同样的道理,我们用java做个试验:

public class Father {

	public Father print(){
		return this;
	}
}

public class Sun extends Father {
	Test t = new Test();
	public void printSun(){
		t.print();
		
		System.out.println(super.toString());
		System.out.println(super.print());
		System.out.println(this);
	}
	
	public static void main(String args[]){
		Sun sun = new Sun();
		
		sun.printSun();
	}


public class Test {

	public void print(){
		System.out.println("i am test this : " + this);
	}
}

打印结果:
i am test this : Test@c17164
Sun@1fb8ee3
Sun@1fb8ee3
Sun@1fb8ee3

我们看到,父类this和子类this是一样的,但是如果只是简单拥有一个引用,那么应该和Test的引用一样,是不一样的所以,说明父类和子类之间不是简单的拥有一个引用,我感觉是子类会把父类通过某种机制“包含”进来!
以上是本人粗浅的理解,欢迎批评指正!毕竟初学,希望和大家一起进步。


    
[2] OpenGL点染管线
    来源: 互联网  发布时间: 2014-02-18
OpenGL渲染管线

很多书上介绍了渲染管线,往往严重脱离实际,不知道到底对应的程序代码是什么。作为程序员,在没有弄清代码流程和作用之前,所有的理论都很苍白。下面是一些补充说明。

 

1.顶点数据

指定顶点颜色(glColorPointer),法线(glNormalPointer),坐标(glVertextPointer),纹理坐标(glTexCoordPointer)。 如果有显示列表从显示列表中提取以上数据。 顶点坐标最终被添加为4纬的。 其中z =0, w = 1

 

 

2. 求值器,如果没有使用,则忽略。

 

 

3. 基于顶点的操作(Vertex Shader 自己编程完成)。 主要是五部分。

 

输入:顶点位置,法线,顶点颜色,裁剪平面,纹理,光照。

输出: 变换后的顶点位置,顶点颜色,法线

 

顶点位置变换,

法线变换,

裁剪平面变换,

纹理变换,

光照运算。

很多书上没有说【法线变换】和【裁剪平面变换】,这是不完整的。

 

另外,【裁剪平面变换】,可以认为是一种特殊的图元。下面是详细过程

 

1 . 利用【模型视图矩阵】进行模型视图变换。从局部坐标变换为【人眼的世界坐标】。

 

 

2.进行投影变换,进行正规(normalize)化。 实际的结果是

 

把实景体压缩成为立方体。具体参照OpenGL书上提供的【投影矩阵】。

3. 纹理坐标变换。利用【纹理变换矩阵】变换纹理坐标。

 

4 . 法线变换。利用【模型视图矩阵的逆的转置】变换法线方向。

 

5 . 与此同时,进行光照运算,利用变换后的法线和顶点坐标,当前的材

质,灯光坐标,灯光模型产生新的颜色或者颜色索引。

 

6. 如果有裁剪平面,裁剪平面也要根据【模型视图矩阵的逆】变换法线方向。

 

2. 图元装配(固定管线功能)。 【分散的点,转换为图元】

 

1.根据图元的类型,点,三角形,四边形,如果glShadeModel采用的是flat模型,则顶点使用同一种颜色。(注意:如果使用的是smooth模型,则送入光栅化阶段。)

2.如果有裁剪平面,则进行裁剪运算。

 

3.坐标按照标准正方体x=a w, y = aw, z = aw进行裁剪。其中a是计算出来的结果。

4.如果启用了选择,则进行选择,并报告。渲染管线停止。如果没有,则进行透视除法。和视口变换。

 

5.如果启用了隐藏面消除,则进行隐藏面消除操作。

 

3. 光栅化,向量几何图形转换为位图图像(固定管线功能)【对图元进行插值】

 

1. 根据线的宽度,线的stipples,顶点的大小,来决定窗口中的哪些栅格

 

被图元占用。

2. 颜色插值。与此同时,颜色和深度值也被安排到每一个【片段】。

 

3. 纹理坐标插值。

 

4. 片段着色器。【Fragment Shader 自己编程完成】

 

1. 通过片段的纹理坐标获取纹理颜色,然后与片段颜色进行混合。

 

2. 雾效果的计算。本阶段的结果是,每一个像素都有一个颜色值和深度值。

 

5. 光栅操作。【固定管线功能】

输入为像素位置,和颜色,深度。

 

1.裁剪测试。scissor test。注意与clip不同。

2.alpha测试。

3.深度测试。

5.模板测试

6.混合(也就是玻璃效果,在此时应用)

 

 


    
[3] service简括2
    来源: 互联网  发布时间: 2014-02-18
service简括二

  bindService()

 

public class BindActivity extends Activity {
	private Button btnStartBindService;
	private Button btnStopBindService;  
	private boolean isConnected=false; //service是否创建
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.bind);
        btnStartBindService=(Button)findViewById(R.id.btnStartBindService);
        btnStopBindService=(Button)findViewById(R.id.btnStopBindService);
        btnStartBindService.setOnClickListener(listener);
        btnStopBindService.setOnClickListener(listener);   
    }
	private OnClickListener listener=new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			switch(v.getId()){
			  case R.id.btnStartBindService:
				 bind();
				  break;
			  case R.id.btnStopBindService:
				   unBind();
				  break;
			  default:				  
				  break;
			 
			}
		}
	};
	private void unBind() {
		if(isConnected){
			unbindService(connection);
		}
	}

	private void bind() {
		Intent intent=new Intent(BindActivity.this,BinderServices.class);
		bindService(intent, connection, Context.BIND_AUTO_CREATE);
					
	}
	private ServiceConnection connection=new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			isConnected=false;		
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder binder) {
			MyBinder myBinder=(MyBinder)binder;//返回MyBinder类,要强制转换
			BinderServices services=myBinder.getServices();
			services.myMethod();
			isConnected=true;			
		}
	};

}

 

 

public class BinderServices extends Service {
	private static final String TAG = "BinderServices";
	private MyBinder binder=new MyBinder();
	public class MyBinder extends Binder{
		public BinderServices getServices(){
			return BinderServices.this;
		}
	}
	
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return binder;
	}
	
	public void myMethod() {
		Log.i(TAG,"MyMethod()");
	}
}

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


站内导航:


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

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

浙ICP备11055608号-3