自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

fyfcauc的专栏

Keep Sharp

  • 博客(1009)
  • 资源 (1)
  • 收藏
  • 关注

原创 ECS架构笔记

ECS的介绍 云风写的非常好: https://blog.codingnow.com/2017/06/overwatch_ecs.html#moreECS不是银弹,但在3D引擎领域是一个比较合适的框架, 目前的大多数现代3D引擎,或多或少都采用这种设计思想,比如Unity, UnReal。当然后面应该会有更为先进的框架出现。在这近一年的工作中,我基本经历了从传统渲染树到ECS架构的变化,感...

2018-06-29 15:56:30 3475

原创 3D动画概述暨骨骼动画实现

引言本文论述了3D领域内的常见动画类型的运作机制。不同于其他文章简单的罗列和介绍每种类型的3D动画,本文尝试以一种优化演进的思路对动画运作机理进行递进式推演,在这个过程中自然而然的推导出常见的几种3D动画类型,以此证明其出现的必要性和合理性。本文尽量以平实简明的语言来阐述讲解,不过如果阅读者具备初级3D知识,对顶点,矩阵变换,着色器等有一定认识,阅读效果会更好。另外,本文聚焦在相对宏观的机制层面,对

2017-12-20 10:31:53 8495 5

原创 简单动画系统随笔

最近重构动画系统,虽然只是一个小系统,不过在设计的过程中发现自己在宏观层面的架构搞惯了,这种体量小却结构精巧(和宏观层比就像从模块间到模块内)的也有一定考验性。架构本身不分大小,在一些基本原理上是一致的。随笔记录自己的一些思路和想法:一个抽象动画过程Animation应该有这些通用的属性/接口: 动画状态 (初始/运行/暂停/停止/结束),结束和停止在结果表现上看似乎比较相近,但是因为其对应的现

2017-11-17 11:17:10 703 1

原创 OpenGLES 2.0 在 NDK-r15b上的编译问题

在使用NDK-r15b编译引用了OpenGLES 2.0的项目时,会编译不过, 会报下面的一些错误:error: unknown type name ‘GLuint’; did you mean ‘uint’?error: unknown type name ‘GLenum’; did you mean ‘enum’?直接原因是NDK-14引入了unified header,不再使用原来的platf

2017-11-09 13:13:09 1237

原创 Assimp编译实录

Assimp相关:Assimp(https://github.com/assimp/assimp)是一个轻量级的3D模型解析和转换库,支持40+的格式,一些小的3D引擎会使用其作为自己的模型解析加载模块,受众相对比较广泛。该库一直保持着更新,尽管ISSUE不少,不过从目前的小范围使用情况来看,可靠性还可以接受Assimp Android端编译:Assimp本身提供了Andr

2017-05-22 17:07:36 5735 6

原创 C++ std::mutex 与 const函数

写一个队列需要在其函数之间做同步,首选了std::lock_guard通过RAII的方式来优雅实现确保释放。code很简单,Class自己有一个成员变量mutex, 相关函数在调用前使用其作为构造参数来构造lock_guard即可。编译时遇到了问题,死活编译不过,有了这样的报错: note: candidate constructor not viable: 1st argument (‘cons

2017-04-26 20:13:36 3285

原创 C++ SIGSEGV check list

C++丢了很长时间了,没想到还有捡回来的一天,各种不适应,尤其是指针相关的,SIGSEGV这几天真没少见,总结下自己遇到的SIGSEGV case,下面这个可以作为一个check-list: null指针解引用,这个就不说了,解引用前自己做好预防。要求返回值的函数实现时没有返回值,按理说IDE会提示,但是目前看AS很多时候是不会提示的。使用RAII对象管理内存时,因为临时对象析构的原因导致RA

2017-04-18 20:20:03 1954

原创 OpenglES Blend 笔记

OpenglES 关于 Blend 特性的一些总结:Blend特性默认是关闭的, 默认开启的特性只有抖动。Blend关闭时,如何进行混色(某种意义上,混色是渲染的一个必经步骤(从OpenglES的流程图上看的话),这个问题也可以表述为如果Blend被disable的话,默认的混色策略是什么)? Wiki上对于Blend被关闭时的混色大概是这样描述的: 在blend被关闭时,src的rgb值会被直

2017-04-17 15:19:17 1053

原创 AndroidStudio 使用本地Maven仓库

Android项目直接使用本地aar。 开发过程中有直接使用本地aar的调试需求,Android Gradle插件目前不支持直接以compile file的形式将aar引入(目前似乎只支持Jar)。查询到的有两种方式: 在repositories中增加flatDir设定为aar的所在目录,然后通过在dependencies中增加compile(name: ‘aar库的名称’, ext: ‘aar

2017-04-14 18:17:18 14223

原创 Android 集成 OpenCV native library

Android集成OpenCV native library: 目前来看,OpenCV提供的SDK中已经附带了编译好的.a和.so库,使用者可以根据自己的需要选择动态或者静态库链接。OpenCV SDK下载地址: http://opencv.org/releases.html选择对应版本的Android pack下载。解压开会发现有一个sdk目录(这里以3.0.0版本为例)。sdk/nat

2017-04-10 18:23:12 3357 1

原创 HtmlSpanner扩展笔记

HtmlSpanner基于https://github.com/NightWhistler/HtmlSpanner, 主体代码基本全部copy,扩展了两点: 原始版本在解析Html时使用了HTMLCleaner解析库,但是在我引入的过程中发现该库以及其依赖的库引入了太多的方法,有点得不偿失。因此Html解析这部分被我进行了替换。对解析功能进行了抽象接口: 在net.nightwhistler.ht

2017-02-16 11:37:07 2078 2

原创 RecyclerView机制解析: Linear Layout

LayoutManager子类实现的核心有两个地方:onLayoutChildren,该函数的实现决定了ChildView将会怎样被布局(layout),ChildView的测量也会在其中完成,按照之前分析的RecyclerView Measure流程(http://blog.csdn.net/fyfcauc/article/details/54291174), RecyclerView**自身的M

2017-01-13 10:26:11 2311

原创 关于RecyclerView的一些概念

在使用RecyclerView或者阅读其源码前最好明确一些术语代表的概念,脱离具体实现细节,在抽象设计层思考RecyclerView 背后的模型。先以RecyclerView的一个表现形式,一个可以上下滑动的列表作为切入点: 我们为什么偏向使用ListView/RecyclerView而非ScrollView+LinearLayout作为列表的实现方案? 因为列表的长度可能是很长的。从理想的使用

2017-01-12 16:32:51 936

原创 RecyclerView机制分析: State

State是最简单的RecyclerView子模块。RecyclerView在工作过程中,需要维护一系列状态信息(比如当前处于Layout的哪个阶段,是否处于preLayout阶段等)。并且因为RecyclerView将功能进行了子模块化,还需要传递某些信息到特定子模块来完成功能/通信,RecyclerView把这部分职责集中到了State模块中。State**内部聚合了所需的各项状态信息,扮演了

2017-01-11 15:04:44 2928

原创 RecyclerView机制分析: Recycler

Recycler虽然命名上看,像是只承担了View回收的职责,其真正的定位是RecyclerView的View提供者(甚至是管理者), 包括生成新View, 复用旧View,回收View,重新绑定View等逻辑都被封装在Recycler中。外部调用者只需要调用Recycler的接口获取合适的View即可,不需要关心View获取和配置等具体细节,Recycler对外提供了View的回收和获取服务。先

2017-01-11 12:14:18 5607 5

原创 RecyclerView机制解析: ItemDecoration

RecyclerView的ItemDecoration机制相对比较简单,不过扩展性很强,在ChildView的测量和展示上为使用者提供了极大的发挥空间,像divider/项目高亮/项目边框等效果都可以轻松实现ItemDecoration可以同时存在复数个,维护在一个列表中,影响是可以叠加的,ItemDecoration的作用顺序从列表头到列表尾。addItemDecoration可以添加一个Ite

2017-01-09 19:10:09 3710

原创 RecyclerView机制解析: Measure

RecyclerView将布局的职责委托给了LayoutManager类,而测量和布局联系很紧密,因此测量的一部分逻辑也被委托给了LayoutManager,RecyclerView大多数情况下会基于LayoutManager布局之后的ChildView分布情况来决定自己的最终尺寸。RecyclerView支持两种measure模式,取决于LayoutManager的mAutoMeasure属性:

2017-01-09 17:50:13 2793

原创 Android Measure 体系简单总结

Android对View的测量是半协商半强制半模糊半具体的.测量过程中的两套尺寸体系: [半强制] ParentView**约束ChildView: **MeasureSpec(通过measure方法传递给ChildView, MeasureSpec本身包含了两类信息: SpecMode和SpecSize): SpecMode = EXACTLY: 给ChildView指定了具体尺寸[半具体]

2017-01-09 14:04:55 1738

原创 RecyclerView机制解析: ChildHelper

RecyclerView在处理消失动画时采用了和Animation/LayoutTranslation相似的策略:某个ChildView需要渐变消失动画效果,那么该ChildView在动画结束前不会从ViewGroup中被remove掉,在动画运行完以后才会被remove掉。上述策略显然会造成不一致:Data中,ChildView对应的Item已经被remove了(数据remove不会因为有动画就延

2017-01-07 15:58:28 2605

原创 RecyclerView 原理机制 宏观总结

RecyclerView源码整体基本读完,先贴个宏观上的总结.RecyclerView可以看作是AbsListView的进化版,在结构设计和模块划分上有了极大的进步,核心是将各项功能独立为模块,然后组合在一起构成RecyclerView。 1. AdapterHelper: Update行为记录/整合/分发系统(时序魔法师,扮演了RecylerView和LayoutManager之间的Po

2017-01-06 17:56:02 3749 1

原创 ReactiveX Observable规范

Observable规范(Observable Contract): http://reactivex.io/documentation/contract.html “The Observable Contract”, 在ReactiveX的官方文档,网站以及源码注释上经常出现。是基于微软在2010发表的 Rx Design Guidelines(用于描述Rx.Net是如何实现Reactiv

2016-12-16 15:08:31 2767

原创 React Native 集成流水帐

安装环境: Ubuntu-LTS-12.04http://facebook.github.io/react-native/ React-Native官网。http://facebook.github.io/react-native/docs/getting-started.html 该教程并不是教你如何集成React Native,只是先教你搭建一个React Native的示例尝尝鲜。需要安

2016-12-01 14:52:36 502

原创 ImageView的测量与绘制机制解析

mAdjustViewBounds属性True when ImageView is adjusting its bounds to preserve the aspect ratio of its drawable如果允许adjustViewBounds,ScaleType会强行设置为FIT_CENTERMaxWidth/MaxHeight机制: 要生效的话,必须setAdjustViewBou

2016-11-18 16:45:17 875

原创 项目网络层重构总结

引入网络抽象层,主要包括以下部分:Request: 通用的Request的实现结构,承载如下职责: 网络请求信息的承载和封装。为Interceptor提供切面回调。为第三方库的Request**具体实现提供桥接接口。**Sender: 对网络请求发送的抽象,为第三方库的发送请求(以及一些请求控制方法)提供实现接口。Interceptor: AOP,对Request的各项回调进行interc

2016-11-04 16:13:40 528

原创 Dialog dismiss 流程

Dialog.dismiss(): 如果是在非UI线程调用,会将dismiss这个指令*schedule到UI线程的handler来异步执行*否则同步执行。Dialog.dismissDialog()。WindowManagerImpl.removeViewImmediate(mDecor), mDecor在Dialog show()的时候调用mWindow.getDecorView()获得

2016-10-21 14:39:13 2299

原创 RxJava简单改造实例: BehaviorSubject简化数据和界面的同步流程

面向RxJava初学者,一个简单的RxJava优化传统流程/精简代码的例子。 使用BehaviorSubject简化数据和界面的同步流程:有这样的常见场景: 程序启动时就会去远端/本地读取数据,而与此同时,与这份数据关联的界面也会在某个时刻被启动。 显然这是一个关于并行的问题,读取数据本身是一个异步的行为,其返回的时刻是不可预期的,界面启动很多时候完全取决于用户的操作,因此其启动时刻也是不可预

2016-10-14 17:05:36 2128

原创 数据使用准则

从服务器返回的数据永远是不可靠的。从文件读取的数据永远是不可靠的。从数据库读取的数据永远是不可靠的。总结来说,外部的数据永远是不可靠的,它会以任何突破你想象的形式出现,就像这个残酷的现实世界一样。Repository是数据外围,任何类型的数据存取细节(比如 网络/文件/数据库)都应该封装在Repository中,Repository是内部业务逻辑访问和操作外界数据的唯一接口。 Reposi

2016-09-27 15:53:41 541

原创 RxJava 源码笔记(1)

Notification: An object representing a notification sent to an {@link Observable} 注释已经解释的很清楚,代表的是响应式编程信息流中的一条消息(onNext/onError/onComplete)正如上面所说的,Notification承载的是复数种类型,因此需要一个Kind对象来进行标记属于哪种信息。 Kind是

2016-09-25 10:18:26 510

原创 RxJava使用总结

一些对使用RxJava的初级使用总结():ReactiveX官网: http://reactivex.io/, 建议阅读其Docs,阐述了一些ReactiveX的基本理念和概念:对Observable的解释和定位: http://reactivex.io/documentation/observable.html对Operator的罗列,任何时候,当你觉得有些需求用已知的O

2016-09-07 16:05:07 1709

原创 Android NestedScroll笔记

NestedScrollingParent和NestedScrollingChild这套协议的目的是为了增强(或者说反转)Android自上而下的MotionEvent传递流,这条流的传递方向是死的,一条路走到天黑不回头,单向的好处是简单,坏处就是反方向的体系内通信基本不可能了。对于某些应用场景,希望在MotionEvent传递到下级以后,还有机会可以回馈给上级一些信息,就从原来的自上而下变成了自

2016-09-02 16:39:06 1420 1

原创 Android DownloadManager源码笔记

DownloadManger虽然也需要通过context的getSystemService来获得实例,但是其本身和ConnectivityManager之类的不太一样,其本身构造所需要的所有参数,均是当前Application可以独立提供的: new DownloadManager(ctx.getContentResolver(), ctx.getPackageName()),不需要通过Servi

2016-08-18 11:17:18 1251

原创 RxCache的简单源码分析

RxCache本身的一些宏观机制和自己的构思还是比较契合的: 最基本的一点,都将所有数据回调形式统一为Observable.复合key,tag + 附加信息的方式,但是RxCache做的更为复杂,还支持keyGroup的概念。数据提取模块化,每种数据提取方式都是独立的,并且是可扩展的,当然也是Obserable化的。对返回的数据进行包装从而得以返回更多元数据,比如source。都采取了di

2016-08-12 14:54:54 1352 1

原创 Android ActivityManagerService 笔记(1)

ActiivtyManagerService的main(..)(该函数被调用的地方是是SystemServer.java的ServerThread的initAndLoop(),其所在线程是调用SystemServer.main(…)的线程): 先new一个AThread thr并启动, 然后一直无限循环thr.wait()直到thr.mService(ActivityManagerService

2016-04-03 14:48:33 755

原创 Dalvik中Java Proxy实现机制分析

Java层Proxy:通常的使用流程是使用其static的newProxyInstance(ClassLoader loader(该类加载器用于加载proxy class), Class<?>[] interfaces(一个Class(其实限定为interface)的数组, 每个都代表将被返回的proxy class要实现的接口), InvocationHandler h(负责处理方法分发的invo

2016-03-30 17:01:04 834

原创 Android LayoutInflater & Theme

LayoutInflater创建View的流程:createViewFromTag(View parent, String name(View在xml中的名称), AttributeSet attrs): 如果name就是”view”, 那么会从attrs中找出一个名称为”class”的xml属性的value作为name.如果定义了mFactory2/mFactory/mPrivateFacto

2016-03-24 15:54:00 741

原创 Android Binder 透传 Fd流程

Fd是通过binder可以透传(即client进程在收到此fd之后是可以作为自己进程已经打开的fd来是使用的)的信息之一在binder驱动的binder_transaction(…)方法中,有对Fd的特殊处理:在分析传递给驱动层的flat_binder_object 对象 fp时:如果fp->type是BINDER_TYPE_FD, 那么说明这次要传递的是一个跨进程的Fd: 调用file(类型

2016-02-29 14:35:45 3626

原创 LinearLayout measure过程中的几次遍历分析

measure过程中的5次遍历childView:GONE/Null的ChildView基本都被直接忽略.第一次遍历: weight能够在第一次遍历中生效的前提是: parent传递的heightMode是EXACTLY, 这样,设置了weight的childView在这次遍历中就不会被measure,而只是将其topMargin/bottomMargin累加到mTotalLength中去,

2016-02-03 16:50:13 1037

原创 ActiveAndroid TableInfo TypeSerializer

TableInfo在构造时会传入一个Class<\? extends Model> type对象作为参数:调用type.getAnnotation(Table.class) 得到一个Table注解类,里面描述了该Model对应的DB的table的信息如果确实得到了一个Table注解对象,那么会将该对象的name/id保存在mTableName/mIdName中.如果没有得到对应的Table注解对

2016-01-30 15:47:45 756

原创 Android MotionEvent传递流程 源码笔记

ViewGroup的boolean dispatchTouchEvent(MotionEvent ev):mInputEventConsistencyVerifier是处于debug目的使用,可以忽略。onFilterTouchEventForSecurity(MotionEvent event)来检测这个MotionEvent是否应该被dispatch. 只有通过了,才能继续向下走.使用act

2015-12-12 15:01:23 1470

原创 Android View的second layout pass

Second layout pass的触发: 首先在View的requestLayout()中:如果之前有mMeasureCache,因为要重新layout,之前的cache已经无效了,直接mMeasureCache.clear()来清除缓存.如果该View已经被attach了(mAttachInfo != null)并且AttachInfo中的mViewRequestingLayout(Used

2015-11-25 16:23:00 3003

Java深度历险

讲述java虚拟机类载入的流程,虽然很老了,还是参考价值的.

2014-09-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除