范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

如何高效阅读源代码?

  下面是之前写的一篇文章:《如何快速阅读源码》
  本文探讨在需要了解一个开源项目时,如何快速的理清开源项目的代码逻辑!
  以下是个人认为行之有效的方法:先「跑起来」自顶向下拆解深入细节延伸改进
  本文以Mybatis为例来进行演示!先"跑起来"
  程序界有个老传统,学习新技术时都是从「Hello World」开始的!无论是学习新语言时,打印「Hello World」;还是学习新框架时编写个demo!那为什么这里的「跑起来」要打个引号呢?
  实际上,当你想要阅读一个开源项目的源码时,绝大部分情况下,你已经能够使用这个开源项目了!所以这里的"跑起来"就不是写个「Hello World」,也不是能跑起来的程序了!而是能__在你的脑子里「跑起来」__!什么意思?
  Mybatis你会用了吧?那么请问Mybatis是如何执行的呢?仔细想想,你能否用完整的语句把它描述出来?
  这里是Mybatis的官方入门文章!你是如何看这篇文章的?读一遍就行了吗?还是跟着文章跑一遍就够了吗?从这篇文章里你能获得多少信息?
  我们来理一下:安装如何在项目中引入Mybatis?Mybatis的groupId是什么?artifactId又是什么?目前最新版本是多少?从 XML 中构建 SqlSessionFactorySqlSessionFactoryBuilder可以通过xml或者Configuration来构建SqlSessionFactory,那是如何构建的呢?xml配置了哪些信息?既然使用了xml,那肯定有xml解析,用什么方式解析的?xml里的标签都是什么意思:configuration,environments,transactionManager,dataSource,mappers。以及这些标签的属性分别是什么意思?SqlSessionFactory的作用是什么?不使用 XML 构建 SqlSessionFactoryBlogDataSourceFactory,DataSource,TransactionFactory,Environment,Configuration这些类的作用是什么?*Mapper的作用是什么?为什么提供基于XML和Java的两种配置方式?这两种配置方式的优缺点是什么?从 SqlSessionFactory 中获取 SqlSessionSqlSession的作用是什么?selectOne和getMapper的执行方式有什么区别?探究已映射的 SQL 语句*Mapper.xml的配置是什么?命名空间,id的作用是什么?*Mapper.xml是如何和*Mapper.java进行匹配的?匹配规则是什么?基于注解的映射配置如何使用?为什么提供基于XML和基于注解的两种映射配置?有什么优劣?作用域(Scope)和生命周期SqlSessionFactoryBuilder应该在哪个作用域使用?为什么?SqlSessionFactory应该在哪个作用域使用?为什么?SqlSession应该在哪个作用域使用?为什么?Mapper实例应该在哪个作用域使用?为什么?
  回答出了上面这些问题!你也就基本能在脑子里把Mybatis「跑起来」了!之后,你才能正真的开始阅读源码!
  当你能把一个开源项目「跑起来」后,实际上你就有了对开源项目最初步的了解了!就像「书的索引」一样!基于这个索引,我们一步步的进行拆解,来细化出下一层的结构和流程,期间可能需要深入技术细节,考量实现,考虑是否有更好的实现方案!也就是说后面的三步并不是线性的,而是__不断交替执行__的一个过程!最终就形成一个完整的源码执行流程!自顶向下拆解
  继续通过Mybatis来演示(限于篇幅,我只演示一个大概流程)!我们现在已经有了一个大概的流程了:SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类
  虽说每个点都可以往下细化,但是也分个轻重缓急!我们是先了解怎么构建SqlSessionFactory呢?还是了解如何获取SqlSession呢?还是了解SqlSession如何执行sql的呢?
  很明显,SqlSession去执行 sql才是Mybatis的核心!我们先从这个点入手!
  首先,你当然得先下载Mybatis的源码了(请自行下载)!
  我们直接去看SqlSession!它是个接口,里面有一堆执行sql的方法!
  这里只列出了一部分方法:
  SqlSession就是通过这些方法来执行sql的!我们直接看我们常用的,也是Mybatis推荐的用法,就是基于Mapper的执行!也就是说「SqlSession通过Mapper来执行具体的sql」!上面的流程也就细化成了:SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类SqlSession获取对应的Mapper实例Mapper实例来执行相应的sql
  那SqlSession是如何获取Mapper的呢?Mapper又是如何执行sql的呢?深入细节
  我们来看SqlSession的实现!SqlSession有两个实现类SqlSessionManager和DefaultSqlSession!通过IDE的引用功能可以查看两个类的使用情况。你会发现SqlSessionManager实际并没有使用!而DefaultSqlSession是通过DefaultSqlSessionFactory构建的!所以我们来看DefaultSqlSession是如何构建Mapper的!
  它直接委托给了Configuration的getMapper方法!
  Configuration又委托给了MapperRegistry类的getMapper方法!
  在MapperRegistry类的getMapper中:通过type从knownMappers中获取对应的MapperProxyFactory实例如果不存在则抛出异常如果存在则调用mapperProxyFactory.newInstance(sqlSession)创建对应的Mapper
  在这里knowMappers是什么?MapperProxyFactory又是什么?mapperProxyFactory.newInstance(sqlSession)具体做了什么?
  其实很简单,knowMappers是个Map,里面包含了class与对应的MapperProxyFactory的对应关系!MapperProxyFactory通过newInstance来构建对应的Mapper(实际上是Mapper的代理)!
  快接近真相了,看mapperProxyFactory.newInstance(sqlSession)里的代码:
  这里干了什么?通过sqlSession,mapperInterface和methodCache构建了一个MapperProxy对象然后通过Java的动态代理,来生成了Mapper的代理类将Mapper方法的执行都委托给了MapperProxy去执行
  如果是Object里的方法则直接执行否则执行MapperMethod的execute方法
  最终实际还是委托给了sqlSession去执行具体的sql!后面具体怎么实现的就自行查看吧!延伸改进
  现在我们的流程大概是这样的一个过程:SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类SqlSession获取对应的Mapper实例DefaultSqlSession.getMapperConfiguration.getMapperMapperRegistry.getMappermapperProxyFactory.newInstance(sqlSession)通过sqlSession,mapperInterface和methodCache构建了一个MapperProxy对象然后通过Java的动态代理,来生成了Mapper的代理类Mapper实例来执行相应的sql将Mapper方法的执行都委托给了MapperProxy去执行如果是Object里的方法则直接执行否则执行MapperMethod的execute方法最终还是委托给sqlSession去执行sql
  现在我们大概知道了:为什么Mapper是个接口了Mybatis基于这个接口做了什么
  那么,什么是动态代理(基础哦)?为什么使用动态代理来处理?基于动态代理有什么优点?又有什么缺点?除了动态代理,还有其它什么实现方式吗?比如说cglib?如果是其它语言的话,有没有什么好的实现方式呢?......
  这个问题列表可以很长,可以按个人需要去思考并尝试回答!可能最终这些问题已经和开源项目本身没有什么关系了!但是你思考后的收获要比看源码本身要多得多!再循环
  一轮结束后,可以再次进行:自顶向下拆解深入细节延伸改进
  不断的拆解->深入->改进,最终你能__通过一个开源项目,学习到远比开源项目本身多得多的知识__!
  最重要的是,你的流程是完整的。无论是最初的大致流程:SqlSessionFactoryBuilder通过xml或者Configuration构建出SqlSessionFactory可以从SqlSessionFactory中获取SqlSessionSqlSession则是真正执行sql的类
  还是到最终深入的细枝末节,都是个完整的流程!
  这样的好处是,你的时间能自由控制:你是要花个半天时间,了解大致流程还是花个几天理解细节流程还是花个几周,几个月来深入思考,不断延伸你都可以从之前的流程中快速进行下去!
  而不像debug那样的方式,需要一下子花费很长的时间去一步步的理流程,费时费力、收效很小,而且如果中断了就很难继续了!总结
  本文通过梳理Mybatis源码的一个简单流程,来讲述一个个人认为比较好的阅读源码的方式,并阐述此方法与传统debug方式相比的优势。
  阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码。
  首先来说下为什么要读源码,有学习源码的必要吗?
  为什么要阅读源码?
  关于为什么阅读和学习源码,我个人认为可能有以下几点:
  (一)吊打面试官,应对面试
  为了找到更好的工作,应对面试,因为在面试中肯定会问到源码级别的问题,比如:为什么 HashMap 是线程不安全的?
  如果你没有阅读过源码,面试官可能会对回答的结果不满意,进而导致面试结果不太理想,但如果你对源码有所研究,并能够很好地问答面试官的问题,这可能就是你的加分点,可以形成自己独特的竞争力,吊打面试官,升职加薪不是梦。
  (二)解决问题(bug)
  在开发过程中,我们或多或少会遇到 bug,比如:在 foreach 循环里进行元素的 remove/add 操作,为啥有可能会报 ConcurrentModificationException 异常?
  我们可以先在 Google、Stack Overflow 以及对应项目的 Issues 里看有没有类似问题以及解决办法,如果没有的话,我们只能通过阅读源码的方式去解决了。如果我们对相关源码有所涉猎,就可以快速定位到问题所在。
  (三)提升编程能力
  读一本好书,就是和许多高尚的人谈话。 -歌德
  和阅读一本好书一样,阅读源码就是和编程大牛面对面交流的机会,在许多优秀的开源项目中,它们的编码规范和架构设计都是很棒的,另外在设计上也使用了大量的设计模式,通过阅读和学习源码,能够快速提升我们的编码水平,以及对设计模式有更深的理解。
  同时,在我们阅读完一个源码后,可以触类旁通,能够快速地对其他框架的源码进行阅读和学习,减少时间成本。
  除了上述提到的原因之外,可能还有许多,在这里就不一一赘述了,那么在确定了要阅读源码之后,就让我们看下如何阅读源码吧!
  如何阅读源码?
  如何阅读源码取决于你为什么要读源码,比如:如果为了应对面试,那就可以围绕常考的基础类、集合类、队列、线程、锁等内容进行阅读和学习;如果是为了解决 bug,那么就可以只围绕出现问题的相关类进行阅读分析,随着解决 bug 的增多,我相信阅读的源码也会越多,从而更容易去阅读和学习源码;
  下面大概说下阅读源码的几点建议:
  在阅读之前,可以先从开源项目的官网上看它的架构设计和功能文档,了解这个项目的整体架构、模块组成以及各个模块之间的联系。
  如果没有对应的项目文档,可以根据代码的模块进行梳理,以形成对项目的初步了解,或者查看已有的源码解析文章或者书籍,在阅读源码之前,了解项目的架构和思路会使阅读源码事半功倍。
  在了解一个类的时候,可以使用 ctrl+F12 来查看类中的成员变量和方法。
  可以通过 IDEA 的 Diagrams 功能去了解一个类的继承关系。
  多打断点调试,断点追踪源码是很好的阅读源码的方式,可以先通过 debug 了解下调用逻辑,都和哪些类有关联,有大致了解后再通过 debug 了解整体代码的功能实现,各个类都起到了什么作用,有没有涉及到设计模式等。
  另外,优秀的开源项目中肯定会有许多地方应用到了设计模式,建议在阅读源码之前,需要对常用的设计模式有大致的了解,不然阅读源码的效率会大大降低。
  如果遇到读不懂某部分源码的时候,可以先跳过,之后再回来看,如果属于搞不懂这部分就茶不思饭不想的人,可以在网上找是否有该部分源码的解析或者文档,也可以自己通过源码注释和测试用例去阅读学习。
  一般优秀的开源项目都会有单元测试,可以通过对应类的单元测试去了解方法的含义和用法,加深对源码逻辑的理解。
  在阅读源码的时候,可以在代码上加上注释和总结,同时还可以画出时序图和类图,这样对阅读源码有很大的帮助,可以很清楚地知道类之间的调用关系和依赖关系,也方便以后回顾,重新阅读。
  在这里推荐大家一个 IDEA 插件 SequenceDiagram,可以根据源码生成调用时序图,便于阅读源码。
  刚开始阅读源码,不建议直接看框架源码,可以先从 jdk 源码看起:
  jdk 源码也是非常庞大的,可以分模块来阅读,下面是建议的阅读顺序:java.lang 包下的基本包装类(Integer、Long、Double、Float 等),还有字符串相关类(String、StringBuffer、StringBuilder 等)、常用类(Object、Exception、Thread、ThreadLocal 等)。java.lang.ref 包下的引用类(WeakReference、SoftReference 等)java.lang.annotation 包下的注解的相关类java.lang.reflect 包下的反射的相关类java.util 包下为一些工具类,主要由各种容器和集合类(Map、Set、List 等)java.util.concurrent 为并发包,主要是原子类、锁以及并发工具类java.io 和 java.nio 可以结合着看java.time 主要包含时间相关的类,可以学习下 Java 8 新增的几个java.net 包下为网络通信相关的类,可以阅读下 Socket 和 HTTPClient 相关代码
  其他包下的代码也可以做下了解,JDK源码阅读笔记:https://github.com/wupeixuan/JDKSourceCode1.8
  再有了一定的源码阅读经验后,可以再去学习 Spring、Spring Boot、Dubbo、Spring Cloud 等框架的源码。总结
  主要介绍了为什么读源码以及如何读源码,供大家参考,每个人都有适合自己的阅读源码的方式,希望可以在学习中去摸索出一套属于自己的方式。
  阅读源码不是一蹴而就的,这是持久战,只要你能够坚持下来,肯定受益匪浅。阅读源码的过程比较枯燥,可以在社群里一起讨论学习,这样可能效率更高些。
  写得不好的或者大家有什么更好的建议,也欢迎留言讨论。
  没看过源代码,都不好意思出来说了,最近刚好在看一些,来说一个。先看使用  https://element.eleme.cn/#/zh-CN/component/installation
  先看一下这个库是做什么用的,然后提供了哪些功能。看GitHub https://github.com/elemefe
  一般会看下项目最新的情况,然后没有关闭的issue,看下wiki,大家在讨论什么。再看代码
  clone 一份到本地,然后先看下目录结构,然后根据文档看几个简单的组件的时候,一边看掘金上的分析,一边自己看下实现。
  e le
  饿了么这个框架代码结构还是很清楚的,基本上每个组件都是分开的,所以你只要看其他的一个文件夹就行。然后一些工具的都在src文件夹。
  要学会看issue,一般开源的项目都有人会来提建议,有些是bug,有些是功能,你可以看看自己是否有能力去解决,如果可以的话,你可以去fork代码,然后自己修改,再提pr。
  关注我,一起学前端。
  我最近恰好找摸索出一个梳理遗留系统架构的技巧:自底向上 找到一个典型的切面 沿着调用和回调的路径 在代码中添加结构化注释(比如eclipse中加//TAG 流程A1.1 甲->>乙),这样便得到了一个code地图,并且在tasks视图中看起来很直观(看起来跟书的目录一样)可快速跳转。将目录copy到有道云笔记的markdown序列图中 就自动生成了一个序列图。
  我觉得这基本上就是可缩放的可视化架构地图了,对维护一个比较乱和庞大的遗留系统非常有帮助,定位代码 修改维护都方便多了。
  1、需要过硬的基础知识,这个前提。不然基本语法、常用的模式都不晓得怎么读。
  2、多参考历史版本和更新变化,好的源码都是反复迭代出来的精华,开始就读精华是很不明智的,所以看看版本更新说明,版本的历史演变。就想人一样是怎样进化过来的。
  3、参考别人阅读注释,想必在你读源码之前也有人读过了源码,并且总结,注释。和分享原理,可供你参考,毕竟每个人读一篇文章,理解的东西是有差异化的。
  4、直接买书,有些作品直接出书就是源码精解
  5、找个大神给你慢慢分析,这个最快。娓娓道来,直接面授比啥都强。缺点是,你容易跟着他的思维走下去。
  我觉得阅读代码就不应该高效,而应该像看小说一样,看的过程就像是在和作者交流,有趣才是看代码的动力。
  画图,看数据走向,逻辑走向
  先弄清楚这些代码实现了哪些功能,然后从主线开始往下看,好的代码光看变量和接口名称就能明白是什么意思?扒出源码实现的整体框架逻辑,然后再对自己感兴趣的模块进行剖析,还是从整体把握,细节深入,慢慢地整个框架就被丰满了。
  接下来是思考为什么要如此设计,这样设计的好处是什么?如果是你来做应该怎么设计,把你觉得源码缺点的地方进行仔细研究,了解里面是否包含自己不清楚的细节,避免遗漏。
  接下来就是根据代码改造或者是调试错误,对于源码中遇到的不理解的地方一定要弄明白,有的确实是画蛇添足,有的有独特的作用。
  多多学习,对每一种主流框架铭记于心,对主流设计模式了如指掌,万变不离其宗,源码看多了,跟看一个电视机遥控器的操作说明一样。
  1、一边阅读代码一边写注释。这是我用过的最好的方法,对代码理解得更深入,看一些重要代码或者特别难懂的代码时挺有用。更何况,注释也是一种文档嘛。
  2、一边阅读代码一边绘制UML。这个方法适用于类之间的关系较复杂和调用层次较深的情况,我一般都是先绘制顺序图,然后为顺序图中的类绘制关系图。
  3、通过Debug来跟踪程序的主要执行过程,这样就可以分清主次了,阅读的时候更有针对性。
  4、类的快速阅读。先弄清楚它在继承链中的位置,看看它的内部状态,也就是成员变量,一般来说,类的对外接口都是对成员变量的访问、加工、代理等,然后看看它的对外接口,也就是公有成员函数,识别核心的一个或多个函数,这时候你应该可以大概了解这个类的职责或作用了。可能这个类是某个设计模式中的一个组成部分,所以,设计模式的掌握对代码的快速阅读也是很有帮助的。
  5、带着问题去阅读。比如想了解android中的消息机制,那么看看Looper、Handler、MessegeQueue这几个类就可以了,其他的不要去看,要不然就跑题了。
  下面列几个阅读源码时所处的情景,在特定场景下用哪些方法:     不太熟悉业务逻辑,还不是很清楚它是干啥的,可以用3、5。     代码量很大,有几十万行,甚至百万行,可以用2、3、5。     你无法看见程序的运行过程,比如没有用户界面,也有可能是无法运行的,可以用3、5。     设计复杂,用了大量的设计模式,调用链很深,可以用1、2、3、4、5。     时间有限,没有那么多时间让你看源码,可以用3、5。
  画出逻辑流程图,先了解整体流程,再详解具体函数

外媒华为手机开始进入第2阶段我们知道,在华为经历了美国四轮制裁之后,其手机业务受到了一定的影响,不过根据华为近几年的年报来看,手机业务对华为的影响其实不大。不过华为方面之前也表示,不会放弃手机业务,会继续坚持2022年,骁龙870天玑1200是否已经过时?骁龙870有些手机都还在用比如,红米K40S,realmeQ5Pro,小米12X。这两个处理器到现在依旧不过时我注重的是内存最好是1t的,价格2499,其他的不在意。没有过时,主要有好玩的安卓软件推荐吗?说到安卓手机,平时我们都经常会安装一些app在手机里,少则十几,多则几十,但是我们每天会打开的app并不多,就拿室内设计行业来说,值得室内设计师或者量房测绘人员去下载的APP还是有RTX3050和GTX1660比怎么样,为什么我同学说他是智商检测卡?这两个性能差距不大,rtx3050稍稍强一点点,你可以把rtx3050看成有光追的gtx1660。你同学之所以说是智商检测卡是因为50结尾的N卡一般是1000元左右才对,现在卖25家电导购忠告这4种家电没必要买贵的,聪明人只选对的每个人家里肯定不会缺少电器,而很多人买电器都秉承着一个观点贵的就是好的。如果你这样想的话,就大错特错了。前不久我去家电市场买家电的时候,发现家电的差价非常大,于是我询问导购员家电是百元耳机的最优选择TezoLentil零豆无线蓝牙耳机测评最近迷上了运动,但是长跑时间比较久,一个人晨跑感觉非常枯燥。朋友听说后建议我带个耳机听歌。平时用的耳机一旦跑起来就很容易掉。而且也担心运动出汗或者遇到外边下雨,耳机就废了。直到我找发布至今下跌3231元,256GB6400万三摄,IP68防水旗舰跌至新低价学习才会进步,而国产手机厂商们就非常善于学习,例如全球最知名的手机品牌苹果公司就是国产手机厂商们学习的对象,不仅在系统UI上模仿苹果iOS,甚至就连苹果不送充电器这件事也都在学习,还在为续航焦虑?这4款手机用起来省电,出门一整天不用带充电宝回想十余年前的功能机时代,手机续航时间普遍在3天到4天以上,即便是在智能手机初期,手机续航时间也在2天到3天左右,搭配上备用电池的使用,基本可以实现五天的续航时长。不过随着智能手机一加Ace正式发布或许是目前散热最好的天玑8100手机智观察报道作为行业内不将就的手机品牌,一加手机从诞生至今,在产品上一直坚守工匠精神。现如今,在与OPPO融合之后,一加手机也在坚持着此前的产品风格。值得注意的是,在今天的新品发布会刘兴亮头疼!知网何去何从01hr你用过知网吗?你还能用得起知网吗?不知道你能否用得起,反正就连中科院都用不起了。当今中国,凡是当过作者,在正规的期刊上发表过作品的人,都会或迟或早知道中国有一个内容无所不包贝壳被列入预摘牌名单,回应在积极寻求可能的解决方案澎湃新闻记者计思敏4月22日,澎湃新闻获悉,贝壳控股有限公司(NYSEBEKE)被美国证券交易委员会(SEC)于美东时间2022年4月21日列入基于外国公司问责法案(HFCAA)的
三星新旗舰有望提前发布,摄像头抢眼,你准备入手吗?每年下半年,手机界最大的亮点是三星,苹果和华为的年度旗舰,然后比较谁是世界上最著名的人。但是今年,苹果iphone12和华为mate40系列的表现非常出色,而首个发布的三星note全面屏设计新方案,做屏下很难,那就藏起来吧中兴脑洞大开从可升降的全屏屏幕看,明年旗舰店可能会回到多孔屏的时代。因此有人说这种外观是倒退的。实际上,我认为如果打孔机足够小,则实际上是可以接受的,但是在屏幕上开孔确实很丑陋。对于手机的外观曾经的高端旗舰,现已降至冰点价,依旧无人问津三星手机一般都是超高价手机。即使是中档手机,部分型号也需要消费者支付3000元的价格。这也是大多数国内消费者不喜欢购买三星手机的原因之一。事实上,即使三星的手机价格没有现在这么贵,2022年的折叠屏苹果机?OPPO用户看乐了,直言卷轴屏更香在折叠屏手机成为大热门的当下,许多手机厂商纷纷入围,三星华为摩托罗拉在此前已经推出了相关产品,如今苹果也要加入。根据网曝消息,不少数码圈人士称苹果很可能已将可折叠的iPhone送往2020年接近尾声,这些旗舰手机都可以称得上是年度经典值得一提的是,今年智能手机市场出现了许多具有代表性的旗舰产品。产品设计和用户体验都有自己的特点。其中许多产品都可以视为当年的经典之作。,让我们为所有人盘点。iPhone12ProM流氓应用已投降,ColorOS11的隐私安全机制太周到了现在,手机在生活中的使用频率越来越高,支付交通通讯等等都需要通过手机进行。这也带来了另外一个问题,那就是手机中藏着我们越来越多的个人隐私,这也要求手机系统提高对隐私安全的保护力度。红米新机配置曝光,1。08亿120Hz,网友干翻友商?我不知道您是否注意到卢维冰最近很低调。尽管Redmi一直在发布新手机,但他并未表现出存在,但实际上他并不闲着,而是屏住呼吸。一部新的Redmi手机的配置已在网上公开了,看来卢伟冰确RCEP签署,外贸交易成本降低之际,企业如何乘势高效获客?2020年11月15日,全球最大的自由贸易协定区域全面经济关系协议(RCEP)终于在历时长达8年时间的谈判后正式签署,这将进一步促进经济全球化发展,加深中国与东盟进一步的经济交往,2021年手机屏幕大战已开打,小米11并非首选产品12月28日,小米发布了小米的新一代数字旗舰手机小米11。据小米官方介绍,小米11搭载了性能十分强悍的骁龙888处理器,并配备了一块行业顶级的屏幕。这块屏幕分辨率高达2K刷新率高达iPhone13再曝光,120Hz屏幕确认,网友可以买了不久前,国外媒体报道称,iPhone13系列将向用户展示四种型号,所有型号均配备OLED屏幕,而两个Pro版本将屏幕刷新率提升至120Hz。在这种情况下,iPhone13的外观必须8K12GB骁龙865,10个月降1610,三星选择退场高通骁龙888芯片已经正式发布。该芯片由三星的芯片工厂代工。它基于5纳米工艺构建,目前是Android阵营中功能最强大的芯片。据说该月的第一个月就在水边,但三星S21没有抢到启动芯