- 博客(29)
- 资源 (3)
- 问答 (2)
- 收藏
- 关注
原创 内存优化之掌握 APP 运行时的内存模型
我们已经从操作系统的维度了解了一个进程的内存模型。这一节,我们将维度继续上升,从应用层出发看看一个 App 运行时的内存模型是怎样的。为了让大家深入掌握 App 运行时的内存模型,这一节的内容按照由外到内、逐步深入的原则,分为了 3 个部分:内存描述指标内存数据获取内存模型详解话不多说,让我们马上开始这一章学习吧!
2022-12-10 16:44:36
1018
原创 内存优化之重新认识内存
我们知道,手机的内存是有限的,如果应用内存占用过大,轻则引起卡顿,重则导致应用崩溃或被系统强制杀掉,更严重的情况下会影响应用的留存率。因此,内存优化是性能优化中非常重要的一部分。但是,很多开发者对内存的认识还停留在应用开发这一层,平时只是参考网上的方案,对内存进行比较浅显的优化。想要深入进行内存优化,我们需要从操作系统的层面了解内存是怎么管理的,又是如何被使用的。可能会有人疑问:“为什么做个内存优化需要从操作系统层了解内存呢?”我们确实可以在网上搜到很多内存优化的文章,但它们都是从上层应用出发进行优化的,而
2022-12-04 18:17:19
796
原创 Android性能优化方法论
对于接触性能优化经验较少的开发者来说,可能很少有机会能去总结或者学到这些成熟的套路,方法论,或者框架。所以作为一位多年长期做性能优化的开发者,在这篇文章中对性能优化的方法论做一些总结,以供大家借鉴。
2022-11-24 15:55:38
1437
原创 从零开始学Android架构(一)——什么是设计模式?
前言不少人会觉得架构师是一个高大上的岗位,只有技术顶尖的人才能胜任,但其实它并没有这么高大上,大部分的架构师,都只是开发经验非常丰富,并且热爱学习,善于知识迁移和总结。应用的架构是一件非常成熟,有非常多的经验提供我们借鉴的事情,我们可以从Android的架构中学习大型项目的架构思路,我们也可以从Android的局部中学习框架的精髓,如binder的设计,framework的设计,我们也可以深入到Android的代码细节中去看看具体的实现,看看什么样的场景使用什么的设计模式,如何写出更优雅的代码。除了And
2021-01-09 19:37:04
520
原创 深入掌握Binder原理(下)
前言在前一篇文章《深入掌握Binder原理(上)》中,我们已经了解了Binder的架构以及Binder的组成部分,并且深入的了解了Binder驱动程序以及ServiceManager的原理,在这篇文章中,会对Binder剩下两部分Client和Server进行讲解,这里建议没有阅读上一篇文章的先读完上一篇文章,然后再来看这一篇,只有这两篇文章连起来,才能对Binder的体系有一个完整和深入的了解。Binder实现原理为了能更具体的理解Binder中Client和Server这两个组成部分,这里我以我们
2020-11-29 00:20:44
586
原创 深入掌握Binder原理(上)
前言为什么要了解Binder的原理呢,会用不就可以了吗?深入了解Binder不仅仅是为了了解Binder的通信方式,而是从Binder设计中去学习一种优秀的架构思想和问题的解决思路。当我们遇到复杂的通信场景时,或者在一个新的平台上,需要一种新的通信方式提高安全或者效率性能等问题时,我们可以从Binder的设计中借鉴灵感。架构师的成长之路,就是不断的从优秀的设计中学习经验和解决方案。所以,作为一个有追求的程序员,开始对Binder的深入了解吧。网上介绍Binder的文章非常多,我为什么还要再写呢?主要是因为
2020-11-08 17:17:05
783
1
原创 掌握Android和Java线程原理
前言掌握多线程的使用,是程序员进阶必须掌握的技能之一,为什么多线程这么重要?因为多线程能更充分的发挥出cpu的性能,是我们在开发中提高程序性能最重要并且最有效的一种方式。怎么才能掌握多线程的使用?只有彻底掌握线程的基础知识,才能用好线程。什么是线程?为什么会产生线程安全问题?如何保证线程安全?如何提升多线程的性能?这些都是线程很重要的基础知识。在这篇文章中,我会针对线程的基础知识,进行一个全面并且深入的讲解。那么,我们开始对线程的学习吧。线程原理线程是什么呢?它是操作系统能够进行运算调度的最小单位,
2020-10-18 23:12:07
783
2
原创 掌握Android图像显示原理(下)
前言前面两篇文章介绍了图像生产者和图像消费者,终于到了最后一篇——图像缓冲区,这三者一起构成了一个完整的Android图像显示系统。Android中的图像生产者OpenGL,Skia,Vulkan将绘制的数据存放在图像缓冲区中,Android中的图像消费SurfaceFlinger从图像缓冲区将数据取出,进行加工及合成。那么图像缓冲区是什么呢?它是如何创建出来的呢?又要如何使用它呢?它的存储原理是什么呢?读完这篇文章,你就能回答这些问题了。图像缓冲区在讲解图像的生产者时,多次提到了Surface,我们
2020-10-03 17:48:08
2604
2
原创 掌握Android图像显示原理(中)
前言在上一篇文章《Android图形渲染原理(上)》中,详细的讲解了图像消费者,我们已经了解了Android中的图像元数据是如何被SurfaceFlinger,HWComposer或者OpenGL ES消费的,那么,图像元数据又是怎么生成的呢?这一篇文章就来详细介绍Android中的图像生产者——SKIA,OPenGL ES,Vulkan,他们是Android中最重要的三支画笔。图像生产者OpenGL ES什么是OpenGL呢?OpenGL是一套图像编程接口,对于开发者来说,其实就是一套C语言编写
2020-09-19 02:09:12
4187
原创 掌握Android图像显示原理(上)
我们所知道的Activity或者是应用App界面的显示,只属于Android图形显示的一部分。同样可以在Android系统上展示图像的WebView,Flutter,或者是通过Unity开发的3D游戏,他们的界面又是如何被绘制和显现出来的呢?他们和我们所熟悉的Acitvity的界面显示又有什么异同点呢?我们可以不借助Activity的setView或者InflateView机制来实现在屏幕上显示出我们想要的界面吗?Android系统显示界面的方式又和IOS,或者Windows等系统有什么区别呢?
2020-09-06 18:52:51
7549
6
原创 深入理解Android进程间通信机制
通信是Android开发必不可少的一部分,不管是我们做应用App开发,还是Android系统,都使用了大量的通信。通信又分为进程间通信和进程内通信,在这篇文章,我主要深入讲解Android系统所涉及到的所有进程间通信方式。Android系统中有大量IPC(进程间通信)的场景,比如我们想要创建一个新的进程,需要通过Socket这种IPC方式去让Zygote Fork新进程;如果我们要杀掉一个进程,需要通过信号这种IPC方式去将SIGNAL_KILL信号传递到系统内核;如果我们想要唤醒主线程处于休眠中的Lo
2020-08-29 09:34:31
2140
原创 掌握Java和Android虚拟机
我们知道的虚拟机有很多,运行Java的JVM虚拟机,运行Android程序的Davlik和Art虚拟机,运行C#的CLR虚拟机,那么什么是虚拟机呢,虚拟机的作用又是什么呢?运行JavaScript的v8引擎或者运行Python的引擎是否也是虚拟机呢?带着这几个问题,我们开始对虚拟机的学习。虽然现在很多人都认为运行JavaScript的V8或运行Python的VirtualEnv,都不是虚拟机,而是解释器,主要原因是因为V8或者VirtualEnv不仅仅能执行字节码文件,还能将源文件编译成字节码文件,而传
2020-08-15 23:24:19
2053
原创 Android客户端如何设计架构
当我们在新开发一款APP时,我们在初期要如何设计架构呢?在这里我根据我的经验,总结了一些基本的架构思路。客户端架构设计的时候,首先需要充分考虑到所开发的app的类型,这里我分为功能型和服务型两大类,功能型的app侧重业务和功能,服务型的app侧重服务和运算。下面我就具体来讲讲针对这两种类型的通用架构。功能型app功能型app的activity比较多,整个app都以一个个activity承载业务和功能,在设计这类app时,我们需要考虑哪些要素呢?由于activity比较多,我们需要考虑页面的跳转路由,
2020-05-16 14:49:47
1291
1
原创 横向对比浏览器,RN以及Flutter
跨平台是最近几年很火的技术栈,也是未来的趋势,一次开发,多出运行,能节约大量的人力和时间成本。目前主要的跨平台方案有三种1. 以原生组件为基础,对接web生态RN,快应用,weex这这一类为代表2. 以Web为代表3. 以独立绘,自有生态的flutter为代表这里来通过横向对比这三类技术,来有一个深度和广度的认识。对于这三种技术,我这都通过介绍他们的渲染流程,优点,缺点,如何优化来进行一个...
2020-04-19 11:31:17
820
原创 Weex优化演进
一,Weex架构优化首先,我们来看一下weex的架构演变,从架构图中可以看到,它一步步的增加了WeexCore,EagleCore等模块。下面我们就来了解一下这些模块的演进。1,JS引擎的演进weex早期在Android上使用的是V8,但经过测试,JavaScriptCore的性能比V8的性能更好,所以便用JavaScriptCore全面替代了V82,WeexCore的演进可以看到,w...
2020-02-08 22:35:49
800
原创 Activity启动详解
我们先从普通的应用内启动activity开始看起,也就是startActivity()这个方法,我们会发现这个函数最终会执行startActivityForResult()方法,传递的参数为intent和-1,所以我们直接看看这个函数public void startActivityForResult(Intent intent, int requestCode, @Nullable Bu...
2018-06-06 12:35:22
4653
3
原创 ActivityManagerService启动解析
我们知道,在zygote进行初始化时,会调用startSystemServer方法来初始化各种servcie,其中包括ActivityMangerService,现在我们就来看看ActivityMangerService是如何初始化的。我们从AMS被初始化的地方开起,也就是 SystemServer这个类它的源码位于frameworks/base/services/java/com/andro...
2018-04-23 13:30:20
2157
原创 Android底层启动解析
过去的这一年多里,做过VR,AR,现在又回到了Android客户端,开始做AI相关的应用,Android方面的知识也开始重新捡了起来,所以在这儿撸一遍Android的底层源码,巩固加强一下在自己Android方面的技能。在撸Android的源码之前,我们先要有两件事要准备,第一件事是有一份Android的源码,我一般是通过线上(http://androidxref.com/)查看源码的,这个网...
2018-03-23 19:27:39
2854
3
原创 c++进行音频管理
最近做VR开发时需要对麦克风分的录音进行操作,其中涉及到调节录音的大小,检测录音的的大小等功能,我主要使用c++调用windows的音频相关的api来进行对录音的操作,在这里记录一下。对音频的控制主要用到mixer相关的函数,与它相关的函数主要有以下几个 mixerOpen和mixerClose函数用来打开和关闭混音器设备 mixerGetNumDevs可以确定系统中有多少混音器设备
2017-02-16 14:53:33
6417
5
原创 Unity客户端与后台通信
在做Unity游戏开发时,与后台的通信是必不可少的。我们可以用c#自带的WebRequest来与后台通信,但是这种通信方式效率是比较低的,特别是当游戏需要多人在线时,用c#来进行网络通信会完全无法满足要求。这个时候就需要用C或者C++来与后台进行通信了。所以在这儿,我主要讲一下Unity客户端如何通过C与后台服务器进行通信。生成DLL文件Unity中调用C的方法是通过调用用C生成的DLL库来实现的,
2016-11-22 19:04:27
5106
2
原创 Unity有限状态机详解
这阵子用到了有限状态机,于是花了一段时间研究了一下。在这里我会详细的讲解有限状态机的原理以及如何编写一个有限状态机。有限状态机算是Unity开发中一个比较重要的技巧了。那什么什么是有限状态机呢?在游戏中,我们可能会遇到各种各样的状态,这里我以一个人人物为例。在游戏中,我们可能要经常获取人物的生命状态或者人物的运动状态,然后做相应的操作。我们可以用Switch语句来获取状态,通过特定的方法来设置状态。
2016-11-04 17:34:11
10176
5
原创 HTC VIVE开发教程(五)
前面几节我们了解了SteamVR的基本原理,现在可以进行实战开发了。但在进行VR开发前,我还要先介绍一套强大的VR开发工具——VRTK在进行VIVE开发时,我们经常要用手柄进行一些操作,比如监听按键响应,通过手柄触摸板进行移动,抓取物体等等。这些交互功能实现起来其实不复杂,但是如果我们自己一个个去写又比较麻烦,为了避免重复造轮子,github上便有了vrtk这套SteamVR开发的工具集。获取vrt
2016-10-27 20:06:18
7305
4
原创 VR球类游戏填坑总结
前一段时间开发了一款VR击球类游戏。游戏的内容是在一个房间内,拿着球拍对墙击球。如下图 游戏实现起来还是蛮简单的,前后用了一个星期的时间,其中因为一个BUG就卡住了三天时间。当球拍挥动速度太快时,拍子会穿过球体。效果如下。试用无数方法后,最终成功解决,在这里我将解决办法记录下来。① 首先将球拍单独作为一个GameObject,放在最外面的层级。我最开始的做法是将球拍放在Controller下面
2016-10-25 10:38:47
1718
2
原创 Unity3D架构小结
刚开始学习Unity编程时,感觉非常的不习惯。一直以来,我都是使用基于类的面向对象编程,当转到Unity开发后,发现所有的代码都是拖到一个个组件上面去的,早已习惯了的mvc,mvvc等架构思想在Unity上却不太适用了。所以在我前期开发Unity时,完全是没有架构可言的,每次都是某个组件需要什么功能,我就把相应的功能代码托上去,可是写到后面,我发现整个项目的逻辑越来越混乱,各种组件在代码中互相引用,
2016-10-14 11:27:22
11333
2
原创 HTC VIVE开发教程(四)
从这一节起我开始介绍一些vive的交互实现方式,比如手柄发出的射线,凝视,瞬移等等。SteamVR插件内都有这三种交互的辅助类。 Extras文件夹里面的SteamVR_GazeTracker是凝视的工具类,SteamVR_LaserPointer是射线的工具类,SteamVR_Teleporter是瞬移的工具类,下面我们来分析这三种交互是如何实现的。SteamVR_GazeTracker
2016-10-11 16:38:35
13761
16
原创 Shader入门教程(一)
学习Unity有一段时间了,都说Unity想要进阶得学会Shader编程,因此花了一阵子来学习Shader编程。学了之后才发现,Shader并没有我原先想的那么复杂,掌握它的原理和语法后,我们也能用shader编写出自己想要的特效,好了,下面我开始详细介绍shader的入门知识。我在这篇文章中主要介绍的内容有 ①Shader基础知识 ②Unity中Shader知识介绍 ③Surface Sha
2016-10-08 10:11:28
59862
16
原创 HTC VIVE开发教程(三)
在这一节,我介绍的主要内容有[CameraRig]预制体[SteamVR]预制体[Status]预制体在SteamVR插件的Prefabs文件夹下面有三个预制体,CameraRig是相机预制体,使用时直接将这个预制相机作为主相机拖入场景中,我们就能以第一人称看到VR头盔里面的内容。Status是通过overlay显示一些状态信息的预制体。SteamVR是渲染核心预制体,不需要手动添加,会自动
2016-09-23 18:42:49
9805
原创 HTC VIVE开发教程(二)
这一节我介绍的主要内容有SteamVR渲染机制用Unity做游戏开发的核心之一就是图形渲染,做VR开发当然也是一样,在这一节,我们就来看看SteamVR的图形渲染原理。SteamVR_Render.cs是SteamVR图形渲染的核心,该类位于Scripts文件夹中。接下来我来详细分析一下这个类。下面是该脚本的OnEnable()方法 void OnEnable() {
2016-09-13 17:04:15
9789
原创 HTC VIVE开发教程(一)
学习VR有一段时间了,在这段时间里我对HTC的vive还有Oculcus都进行过一定的研究,也开发出了几款VR项目,算是基本完成了从Android客户端到VR开发的技术转型。在开发VR的时候我感觉相关的技术文档还非常的少,查找资料实在头疼。因此打算将我对vive的相关研究记录下来,让正在进行VR开发的同学能够快速上手,也希望能和VR研究的牛人一起探索,共同进步。
2016-09-08 17:15:21
14786
2
为什么eclipse的程序无法部署到手机
2014-01-25
一段用户验证的PHP代码,就是验证不成功
2013-09-18
TA创建的收藏夹 TA关注的收藏夹
TA关注的人