精华内容
下载资源
问答
  • 体积变形能密度作为脆性材料强度理论,刘大为,,根据对最大拉应力,最大剪应力,形状改变比能这三个强度理论的观察,并且根据对脆性材料在外载荷作用下,吸取应变能很,而脆性
  • 基于位错密度变化的动态再结晶动力学确定方法,肖宏,王健,文中将动态再结晶动力学方程看作是塑性应变的函数,给出了动态再结晶体积分数与平均位错密度之间的数学表达式,利用动态再结晶体
  • Android 减小APK包体大小方法总结

    千次阅读 2020-04-21 10:39:16
    Android 减小APK包体大小方法总结 ...随着版本迭代,功能增加安装包体积也会慢慢增大。本文主要是介绍APK瘦身中用到的一些方法。 APK分析 既然是要优化APK的大小,那首先就得看下APK文件的构成...

    Android 减小APK包体大小方法总结
    http://www.apkbus.com/blog-822721-72775.html
    (出处: 安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户)
     

    前言

    随着版本迭代,功能增加安装包体积也会慢慢增大。本文主要是介绍APK瘦身中用到的一些方法。

    APK分析

    既然是要优化APK的大小,那首先就得看下APK文件的构成。

    Android Studio在2.2版本添加 APK Analyzer功能,可以直接打开apk文件,如下图所示

    APK文件主要有如下几部分组成:

    从APK的构成中可以看出占比较大的几个部分,可以着重对其优化

    APK文件主要有如下几部分组成:

    从APK的构成中可以看出占比较大的几个部分,可以着重对其优化

    优化

    res文件夹

    图片资源压缩

    1、ImageOptim

    提供了相应客户端,支持通过客户端批量处理,mac上可以使用如下命令开启:

    2、TinyPng

    没有提供客户端,支持拖拽到网页处理;提供了HTTP API来批量处理,但是有数量限制,每个key每个月可以压缩500张。 开发了一个gradle插件来批量操作,网上也有一些类似的插件:TinyPng Gradle插件

    移除无用资源

    1、通过使用Lint检测删除无用资源,某些业务代码删除的时候遗漏了相应资源,可以写个脚本检测移除不再使用的资源

    2、添加shrinkResources设置项(官方说明),有0.18M的优化空间,但是该设置有风险如果要使用需要做好测试

    3、选择支持合适的图片,目前有ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi资源文件夹,可根据自己app的用户设备选择支持2-3种即可(当然一套也行) 高版本的gradle已不再支持通过resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi"配置支持的资源,只能人肉删除。如果你只想打包某一种屏幕密度的资源,可以使用分包策略,添加如下density配置可以只支持打包xhdpi资源(如果出现某些资源xhdpi没有,而其他文件夹包含的情况也不用担心,gradle会保留相应资源),这种配置最终会出多个apk包,具体介绍可参看官方说明。

    4、如果想整体移除res下某个文件夹可以添加如下aaptOptions配置,而不用打包时手工删除,多个文件夹用:隔开

    arsc文件

    resource.arsc文件记录了资源id和资源的对应关系(字符串的内容,图片的相对路径等)

    减少语言支持

    目前包括各种语言(v7包引入),点击resources.arsc可以看到支持80种

    可以通过修改gradle配置,去除不需要部分,这里我们保留4种

    只保留"zh-rCN", "zh-rHK", "zh-rTW", "en" 减少不必要的语言(80种减到5种,有一个default)apk可减少0.61M

    资源混淆

     

    开源解决方案AndResGuard可以看下,通过使用段路径和压缩可以减小apk,需要注意的是你的项目中某些资源需要keep,减少了1.5M。

    架构支持

    Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起)

    每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64

    所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件,x86设备能够很好的运行ARM类型函数库,但并不保证100%不发生crash,特别是对旧设备。64位设备(arm64-v8a, x86_64, mips64)能够运行32位的函数库,但是以32位模式运行,在64位平台上运行32位版本的ART和Android组件,将丢失专为64位优化过的性能(ART,webview,media等等)。所以一般的应用完全可以根据自己业务需求选择使用armeabi或者armeabi-v7a一种支持就行。

    可以通过gradle配置

    比如:微信、微博、QQ只保留了armeabi,Facebook、Twitter、Instagram只保留了armeabi-v7a

    假设只支持了armeabi,如果有特殊要求(比如视频应用)需要用到部分armeabi-v7a的so,可以通过改名放到armeabi文件夹中,根据手机实际情况选择加载。

    动态下发

    比较大的so可以选择动态下发的形式延迟加载,代码上需要加一些判断逻辑。

    dex文件

    1、添加设置minifyEnabled true,混淆、压缩代码,这个设置现在app应该都已经添加了。

    2、删除一些无用库,早期为了兼容低版本手机,添加了一些兼容库,随着时间推移APP支持的最低版本也在升高,之前的一些无用库就可以移除。

    3、插件下发业务模块 添加插架框架,将部分代码延迟下发加载,这部分效果显著。

    其他

    极端情况下可以考虑以下两种方式,可以优化约1M的空间

    debug信息

    一般我们会配置Proguard保留行号等信息用于线上日志分析,极端情况下也可考虑移除这部分,会有5%-10%的效果,可以减少了0.5M,但是出于方便性暂未移除。

    supportv7包

    如果对supportv7包依赖的不多,可以直接把使用到的内容copy出来单独处理,毕竟该包会增加至少0.4M的体积,业务复杂后这部分并不好操作和后续维护,头条暂时并没有使用。

    TODO

    功能迭代不止,瘦身事业不息。

    要维持和继续减小apk包,必须要不断优化,现在又如下思路还没有实施,可以看下

    1、Google的support-v4包新版本已经做了拆分,24.2.0版本拆分成了5个module:support-compat、support-core-utils、support-core-ui、support-media-compat、support-fragment,可以根据自己需要单独引用相应的module。 v7包也会依赖v4,maven依赖有个好处,可以通过exclude单独剔除相应依赖,如下:

    不过目前各家APP对于support包的使用较深,support包各模块也会有相关依赖关系,具体能不能使用还需要看实际情况了。

    2、使用ReDex优化,这是Facebook开源的一个减小安卓app大小以提高性能的工具,集成的话有风险需要多测试,教程。

    3、减少java隐藏开销,比如一些自动生成的函数等。

    使用总结:

    1.  项目中使用了百度地图和个推,打包后大小是12643KB(12.3M),修改了架构支持:将

            ndk {
                abiFilters "armeabi", "armeabi-v7a", "x86_64"
            }

    改为:

            ndk {
                abiFilters "armeabi"//, "armeabi-v7a", "x86_64"
            }

    打包后大小由12643KB,减少至8707KB

    2. 代码中使用了

                minifyEnabled true
    
                // 移除无用的resource文件
                shrinkResources true

    打包后大小减少至7816kb,少了891kb.

    3. 设置中defaultConfig使用了resConfigs "zh"

      将其注释掉后,打包大小由7816kb,增至7980kb,多了164kb

     

    展开全文
  • 06_塑性变形

    千次阅读 2019-10-06 22:29:22
    m 越,晶体越容易开始滑移,所需外加载荷越 --------软位向 m 越,晶体越难开始滑移,所需外加载荷越 ---------硬位向 滑移的微观机制 位错:刃位错、螺位错、混合位错 位错...

    宏观规律

    • 工程应力应变曲线

      • 概念
        • 弹性变形:卸载后可恢复;塑性变形
        • 应力: σ = P F 0 \sigma =\dfrac{P}{F_0} σ=F0P ;应变: ϵ = l − l 0 l 0 \epsilon =\dfrac{l-l_0}{l_0} ϵ=l0ll0
      • 应力应变曲线

    在这里插入图片描述

    • 强度

      • 弹性极限
      • 屈服极限
      • 条件屈服极限 σ 0.2 \sigma_{0.2} σ0.2
      • 极限强度(抗拉强度)
    • 塑性

      • 延伸率 δ = l k − l 0 l 0 \delta =\dfrac{l_k-l_0}{l_0} δ=l0lkl0
      • 断面收缩率 Ψ = F ϕ − F k F ϕ \varPsi =\dfrac{F_\phi-F_k}{F_\phi} Ψ=FϕFϕFk
    • 胡克定律
      σ = E ⋅ ϵ \sigma = E\cdot \epsilon σ=Eϵ
      E ( G ) E(G) E(G) 反映原子间结合力的大小

      • 弹性变形主要特点
        • 线性、可逆性、变形量
      • 影响弹性模量的因素
        • 原子结构:与原子序数呈周期性变化
        • 温度升高,弹模下降
        • 合金元素
          • 对晶体结构不敏感
          • 少量合金元素不影响
          • 大量合金元素,引起畸变,弹模下降
    • 真应力–真应变曲线

      • 真应变
        d e = d l l e = ∫ d e = ∫ l 0 l d l l = ln ⁡ l l 0 = ln ⁡ ( 1 + δ ) de=\dfrac{dl}{l}\\ e = \int de=\int_{l_0}^l\dfrac{dl}{l}=\ln\dfrac{l}{l_0}=\ln(1+\delta) de=ldle=de=l0lldl=lnl0l=ln(1+δ)

      • 真应力
        S = P F S = P F = P F 0 ⋅ F 0 F = P F 0 ⋅ l l 0 = σ ( ϵ + 1 ) S=\dfrac{P}{F}\\ S=\dfrac{P}{F}=\dfrac{P}{F_0}\cdot\dfrac{F_0}{F}=\dfrac{P}{F_0}\cdot\dfrac{l}{l_0}=\sigma (\epsilon +1) S=FPS=FP=F0PFF0=F0Pl0l=σ(ϵ+1)

      • 流变曲线

        真应力—真应变曲线中均匀塑变部分曲线
        S = k e n S=ke^n S=ken
        k k k 为常数, n n n 为形变硬化指数(表示抵抗继续塑变的能力)

    • 工程应力—应变与真应力—真应变的关系

      真应力—真应变为瞬时的计算

    单晶体塑性变形

    滑移变形

    • 滑移现象

      台阶:滑移线;很多台阶构成滑移带。

      滑移 ⟹ \Longrightarrow 台阶 ⟹ \Longrightarrow 滑移线 ⟹ \Longrightarrow 滑移带

      滑移:发生在特定的晶面和晶向上

      • 滑移面:可发生滑移的晶面
      • 滑移方向:可发生滑移的晶向
      • 滑移系:滑移面 + 滑移方向
    • 滑移系

      • 定义:一个滑移面及其上的一个滑移方向构成的一个空间位向关系

      • 特点:

        • 条件相同时,滑移面越多,材料塑性越好;条件相同时,滑移方向越多,材料塑性越好。

        • 一般来说,滑移面时最密排面,滑移方向是最密排方向。

          晶体结构滑移面滑移方向
          面心立方 { 111 } \{111\} {111} < 110 > <110> <110>
          体心立方 { 112 } \{112\} {112} { 110 } \bf \{110\} {110} { 123 } \{123\} {123}<111>
          密排六方 { 0001 } \bf\{0001\} {0001} { 10 1 ˉ 0 } \{10\bar{1}0\} {101ˉ0} { 10 1 ˉ 1 } \{10\bar{1}1\} {101ˉ1} < 11 2 ˉ 0 > <11\bar{2}0> <112ˉ0>
    • 临界分切应力

      Critical_resolved_shear_stress

    ϕ 1 \phi_1 ϕ1 为应力 σ \sigma σ 与滑移面法线方向的夹角

    ϕ 2 \phi_2 ϕ2 为应力 σ \sigma σ 与滑移方向的夹角

    P ′ = P ⋅ cos ⁡ ϕ 2 A ′ = A / cos ⁡ ϕ 1 P'=P\cdot\cos\phi_2\qquad A'=A/\cos\phi_1 P=Pcosϕ2A=A/cosϕ1
    τ = P ′ A ′ = P cos ⁡ ϕ 2 A / cos ⁡ ϕ 1 = P A cos ⁡ ϕ 1 cos ⁡ ϕ 2 = σ cos ⁡ ϕ 1 cos ⁡ ϕ 2 \tau=\dfrac{P'}{A'}=\dfrac{P\cos\phi_2}{A/\cos\phi_1}=\dfrac{P}{A}\cos\phi_1\cos\phi_2=\sigma\cos\phi_1\cos\phi_2 τ=AP=A/cosϕ1Pcosϕ2=APcosϕ1cosϕ2=σcosϕ1cosϕ2
    屈服应力 σ s \sigma_s σs τ c = σ s cos ⁡ ϕ 1 cos ⁡ ϕ 2 \tau_c=\sigma_s\cos\phi_1\cos\phi_2 τc=σscosϕ1cosϕ2 --------------临界分切应力

    1. 晶体滑移所需的最小分切应力
    2. τ c \tau_c τc 取决于晶体的本性,与外力无关
    3. τ c \tau_c τc 是组织敏感参数

    m = cos ⁡ ϕ 1 cos ⁡ ϕ 2 m=\cos\phi_1\cos\phi_2 m=cosϕ1cosϕ2 称为取向因子(施密特因子)

    当 $\phi + \lambda=90\ ^\circ $ 时, m = cos ⁡ ϕ 1 cos ⁡ ϕ 2 = cos ⁡ ϕ 1 cos ⁡ ( 90   ∘ − ϕ 1 ) = 1 2 sin ⁡ ( 2 ϕ ) m=\cos\phi_1\cos\phi_2=\cos\phi_1\cos(90\ ^\circ - \phi_1)=\dfrac{1}{2}\sin(2\phi) m=cosϕ1cosϕ2=cosϕ1cos(90 ϕ1)=21sin(2ϕ)

    所以,当 ϕ 1 = 45   ∘ \phi_1=45\ ^\circ ϕ1=45  时, m = m m a x = 0.5 m=m_{max}=0.5 m=mmax=0.5 。此时 τ \tau τ 最大,有利于滑移

    m 越大,晶体越容易开始滑移,所需外加载荷越小 --------软位向

    m 越小,晶体越难开始滑移,所需外加载荷越大 ---------硬位向

    • 滑移的微观机制

      • 位错:刃位错、螺位错、混合位错

      • 位错的滑移

      • 位错运动阻力

        • 点阵摩擦力(派–纳力)
          τ P − N = 2 G 1 − v exp ⁡ [ − 2 π d ( 1 − v ) b ] = 2 G 1 − v exp ⁡ [ − 2 π W b ] \tau_{P-N}=\dfrac{2G}{1-v}\exp[-\dfrac{2\pi d}{(1-v)b}]=\dfrac{2G}{1-v}\exp [-\dfrac{2\pi W}{b}] τPN=1v2Gexp[(1v)b2πd]=1v2Gexp[b2πW]
          d d d 为滑移面间距,$b $ 为滑移方向上的原子间距, v v v 为泊松比, W = d 1 − v W=\dfrac{d}{1-v} W=1vd 代表位错的宽度

          • τ P − N \tau_{P-N} τPN ( − W ) (-W) (W) 成指数关系,故位错宽度 W W W 越大, τ P − N \tau_{P-N} τPN 越小

          • τ P − N \tau_{P-N} τPN ( − d / b ) (-d/b) (d/b) 成指数关系,故当晶面间距 $d $ 越大, 原子间距 b b b 越小时, τ P − N \tau_{P-N} τPN 越小

            故最密排面、最密排方向易成为滑移面和滑移方向

    • 位错的交互作用

      • 两位错平行 ----------- 同号相斥、异号相吸

      • 两位错垂直 ----------- 位错交割(大小和方向等于对方柏氏矢量的割阶或扭折)

      • 位错塞积(位错与面缺陷的作用)--------- 高度应力集中 --------- 交滑移或攀移 ----- 避开障碍物 ----- 继续滑移------- 应力松弛 ------ 波纹状滑移线

      • 晶体滑移的连续性 ⟹ \Longrightarrow 位错增殖

        F-R 位错源

    • 滑移时晶体的转动

      • 拉伸

        滑移面趋向平行于外力轴方向

        滑移方向趋向平行于最大切应力方向

      • 压缩

        滑移面趋向于垂直外力轴方向

        滑移方向趋向垂直于 最大切应力方向

    • 单滑移和多滑移

      滑移量或变形量小 ⟹ \Longrightarrow 最有利的滑移系开动 ⟹ \Longrightarrow 单滑移 ⟹ \Longrightarrow 滑移线平行

      变形量大 ⟹ \Longrightarrow 晶体转动、外应力大 ⟹ \Longrightarrow 多个滑移系同时或交替开动 ⟹ \Longrightarrow 交滑移 ⟹ \Longrightarrow 滑移线相互交叉

    • 滑移变形特点

      • 滑移不均匀,集中在某些晶面上

      • 平移滑动,相对滑动的两部分晶体位向关系不变

      • 临界分切应力较小

      • 滑移线与应力轴呈一定角度

      • 晶体表面出现滑移线和滑移带,滑移线先于滑移带出现

        滑移是塑性变形的主要机制

    孪生变形

    • 孪生现象

      • 晶体均匀切变
      • 产生位向变化
      • 变形与未变形部分呈镜面对称关系
    • 孪生变形过程

      产生了孪晶,每层原子都错动,需要的外力较大

    • 孪生变形特点

      • 部分晶体发生均匀切变
      • 变形与未变形部分呈镜面对称关系,晶体位向发生变化
      • 临界分切应力大
      • 孪生对塑性变形贡献小于滑移
      • 产生表面浮凸

      塑性变形的次要机制,滑移变形难以实现时,就会发生孪生变形

    多晶体塑性变形

    • 多晶体塑性变形现象

      单晶体:相当于一个单独的晶粒

      多晶体:多个晶体

    • 位向差影响位错运动

      位向差 ⟹ \Longrightarrow 晶粒间滑移系分切应力差 ⟹ \Longrightarrow 晶粒变形难易程度不同 ⟹ \Longrightarrow 变形不均匀 ⟹ \Longrightarrow 晶粒间相互制约 ⟹ \Longrightarrow 晶界附近有5个独立的滑移系 ⟹ \Longrightarrow 变形协调

    • 晶界影响位错运动

      晶界 ⟹ \Longrightarrow 阻碍位错运动 ⟹ \Longrightarrow 晶体强度上升、位错塞积(应力集中)

    • 位向差、晶界的综合作用

      位向差、晶界对变形的影响是综合的,不可能截然分开

    • 多晶体塑性变形特点

      • 晶粒变形不均匀
        • 晶粒变形先后不一(软位向、硬位向)
        • 各晶粒的变形量有大有小
        • 同一晶粒变形量不同(晶粒中心变形量小,晶界处的变形量大)
      • 晶粒间变形协调
        • 相互制约
    • 细晶强化

      • 霍尔–佩奇公式
        σ s = σ 0 + k d − 1 / 2 \sigma_s = \sigma_0+kd^{-1/2} σs=σ0+kd1/2
        σ s \sigma_s σs 为屈服强度; σ 0 \sigma_0 σ0 为单晶体屈服强度; k k k 为材料常数; d d d 为晶粒直径。

      • 细晶强化机制

        由于晶粒细小,晶界增多,位错阻力增大,使得强度升高;同时由于晶粒较多,降低了应力集中,因此需要更大的外力,这又提高塞积,启动相邻晶粒的滑移系变得困难,这也使得强度升高;另外晶粒较多使位错塞积分散,变形均匀,提高了塑性。

      • 细晶强化特点

        • 强度、塑性同时增高
        • 强韧化潜力大

    合金塑性变形

    • 固溶体的塑性变形

      • 合金:由两种或多种元素混合构成的物质

      • 合金种类:

        固溶体合金或化合物合金构成的单向合金;

        固溶体A与固溶体B或固溶体(基体)与化合物(第二相)构成的两相合金

      • 单相固溶体合金的塑性变形

        • 现象

          固溶体合金有多个晶粒

          溶质原子

        • 固溶强化

          • 柯氏气团:位错与溶质原子间的交互作用

            柯氏气团会阻碍位错运动,从而对晶体塑变起到强化作用

          • 溶质原子与位错的应力场交互作用

            置换型 ⟹ \Longrightarrow 溶质大原子 ⟹ \Longrightarrow 进入刃位错下半部(拉应力区) ⟹ \Longrightarrow 点阵畸变减小

            置换型 ⟹ \Longrightarrow 溶质小原子 ⟹ \Longrightarrow 进入刃位错上半部分(压应力区) ⟹ \Longrightarrow 点阵畸变减小

            间隙型 ⟹ \Longrightarrow 溶质原子大于间隙 ⟹ \Longrightarrow 进入刃位错下半部分(拉应力) ⟹ \Longrightarrow 点阵畸变减小

            从而减小体系能量,当位错脱离溶质原子时需要外能量,从而阻碍位错,强化晶体

        • 固溶强化机理

          溶质原子引起点阵畸变 ⟹ \Longrightarrow 溶质原子进入位错 ⟹ \Longrightarrow 对位错起钉扎作用 ⟹ \Longrightarrow 柯氏气团 ⟹ \Longrightarrow 本质上是弹性交互作用

          溶质原子溶入基体 ⟹ \Longrightarrow 层错能下降 ⟹ \Longrightarrow 形成扩展位错 ⟹ \Longrightarrow 难以交滑移 ⟹ \Longrightarrow 位错塞积严重 ⟹ \Longrightarrow 铃木气团 ⟹ \Longrightarrow 化学交互作用

          溶质溶剂价电子数差 ⟹ \Longrightarrow 电偶极 ⟹ \Longrightarrow 电交互作用

        • 影响固溶强化的因素

          • 溶质浓度升高,抗拉强度升高(浓度较低时明显)
          • 原子尺寸差(溶质和溶剂)越大,产生应力场越强,强度越高
          • 固溶体类型:间隙 > 置换
          • 电子浓度:价电子数差越大,静电吸引力越强,强度越高
        • 固溶强化特点

          强度上升,塑性略有下降。

      • 屈服与应变时效

        • 现象

          低碳钢拉伸 ----- 有明显屈服

          卸载后立即重新加载 ------ 不再出现屈服现象

          卸载后放置或经200℃加热再重新加载 ----- 出现屈服现象,且屈服点提高

          这样的现象称为应变时效

        • 机理

          • 屈服机理

            柯垂尔理论

            位错被钉扎 ⟹ \Longrightarrow 变形抗力高 ⟹ \Longrightarrow 上屈服点 ⟹ \Longrightarrow 外力加大 ⟹ \Longrightarrow 脱钉 ⟹ \Longrightarrow 应力下降 ⟹ \Longrightarrow 下屈服点

            位错增殖理论

            变形初期位错数量少 ⟹ \Longrightarrow 变形抗力高 ⟹ \Longrightarrow 上屈服点 ⟹ \Longrightarrow 变形量加大 ⟹ \Longrightarrow 位错增殖 ⟹ \Longrightarrow 变形抗力下降 ⟹ \Longrightarrow 下屈服点

          • 应变时效机理

            柯垂尔理论

            立即加载 ⟹ \Longrightarrow 已经脱钉 ⟹ \Longrightarrow 不再出现屈服

            放置或加热后 ⟹ \Longrightarrow 溶质原子扩散 ⟹ \Longrightarrow 重新钉扎 ⟹ \Longrightarrow 两次屈服

            位错增殖理论

            立即加载 ⟹ \Longrightarrow 位错已经增殖 ⟹ \Longrightarrow 不出现屈服

            放置或加热 ⟹ \Longrightarrow 位错畸变能减小 ⟹ \Longrightarrow 回复 ⟹ \Longrightarrow 位错减少

    • 聚合型两相合金的塑性变形

      影响多相合金塑性变形能力的因素:基体相性质、第二相性质、相界面匹配

      第二相:性能、尺寸

      第二相按尺寸可分为:聚合型(同一数量级)、弥散型(细小弥散)

      聚合性分类:固溶体1+ 固溶体2(塑性相 + 塑性相);固溶体+化合物(第二相)(塑性相 + 硬脆相 )

      • 塑性相 + 塑性相
        σ ˉ = φ 1 σ 1 + φ 2 σ 2 \bar{\sigma}=\varphi_1 \sigma_1 + \varphi_2\sigma_2 σˉ=φ1σ1+φ2σ2
        σ ˉ \bar{\sigma} σˉ 为流变应力; φ 1 、 φ 2 \varphi_1、\varphi_2 φ1φ2 为相1、2的体积分数; σ 1 、 σ 2 \sigma_1、\sigma_2 σ1σ2 为相1、2的流变应力。

        强度随较强相的体积分数变化

        第二相不一定都有强化作用(如第二相较软)

      • 塑性相 + 硬脆相

        • 硬脆相连续网状分布(硬脆相沿晶分布)

          位错运动距离增加 ⟹ \Longrightarrow 运动阻力下降 ⟹ \Longrightarrow 强化作用下降 ⟹ \Longrightarrow 强度低

          ============== ⟹ \Longrightarrow 塞积应力增加 ⟹ \Longrightarrow 增大开裂几率 ⟹ \Longrightarrow 塑性变形能力差

        • 层片状

          位错运动距离下降 ⟹ \Longrightarrow 阻力增加 ⟹ \Longrightarrow 强化作用好 ⟹ \Longrightarrow 强度好

          ============== ⟹ \Longrightarrow 塞积应力下降 ⟹ \Longrightarrow 开裂几率下降(若底片较长,界面易开裂) ⟹ \Longrightarrow 塑性较好

        • 颗粒状

          位错运动距离下降 ⟹ \Longrightarrow 阻力小于层状 ⟹ \Longrightarrow 强化作用小于层状 ⟹ \Longrightarrow 强度较好

          ============== ⟹ \Longrightarrow 塞积应力下降 ⟹ \Longrightarrow 开裂几率下降,界面不易开裂 ⟹ \Longrightarrow 塑性好

        复相强化(第二相强化):取决于第二相性质、形状、分布、数量等因素

    • 弥散型两相合金的塑性变形

      • 不可变形粒子

        • 过程

      arowan_loop

      • 位错绕过机制

        位错遇到第二相颗粒时,

        弯曲变长 ⟹ \Longrightarrow 能量升高 ⟹ \Longrightarrow 位错运动阻力增加 ⟹ \Longrightarrow 强度升高

        留下的位错环 ⟹ \Longrightarrow 阻碍后续位错的运动 ⟹ \Longrightarrow 提高强度

      • 可变形粒子

        • 过程

        • 位错切过机制

          1. 晶格结构不同 ⟹ \Longrightarrow 错配能升高
          2. 反向畴 ⟹ \Longrightarrow 反向畴界能升高
          3. 形成台阶 ⟹ \Longrightarrow 新界面能

          上述三方面使体系能量上升;

          1. 粒子周围弹性应力场 ⟹ \Longrightarrow 阻碍位错运动
          2. 粒子与基体弹性模量差 ⟹ \Longrightarrow 位错线能量变化,位错线张力变化

          综上,都会对位错运动产生阻力 ⟹ \Longrightarrow 提高晶体强度

      • 强化机制

        位错遇到第二相颗粒 ⟹ \Longrightarrow 位错运动阻力上升 ⟹ \Longrightarrow 强度升高

        时效析出第二相颗粒 ------- 沉淀强化(时效强化)

        粉末冶金出第二相颗粒----- 弥散强化

    塑性变形引起的变化

    • 塑性变形后的组织变化

      • 纤维组织(沿变形方向拉长的晶粒)

      • 位错胞(变形亚结构)

        冷变形 ⟹ \Longrightarrow 位错密度升高 ,但不均匀分布 ⟹ \Longrightarrow 位错胞

        胞壁为高密度位错,胞内位错密度低 。------- 变形亚结构(变形亚晶) 变形量大 ⟹ \Longrightarrow 数量多,晶粒小

      • 变形织构

        变形 ⟹ \Longrightarrow 晶面转动(晶格转动) ⟹ \Longrightarrow 各晶粒位向趋于一致 ⟹ \Longrightarrow 择优取向 ⟹ \Longrightarrow 变形织构 ⟹ \Longrightarrow 材料表现出宏观各向异性

        丝织构:某一晶向平行于轧向

        板织构:某一晶面平行于轧面,某一晶向平行于轧向

    • 塑性变形后的能量变化

    energy-change

    • 宏观内应力 工件各部分变形不均匀

    • 微观内应力 晶粒间变形不均匀

    • 点阵畸变 晶体缺陷

    • 塑性变形后力学性能的变化

      • 冷塑性变形使材料强度和硬度升高,而塑性和韧性下降(加工硬化

      • 加工硬化机理

        • 单晶体硬化现象

        single-jingti-strong

        • 硬化机理

          第一阶段:单滑移系 ⟹ \Longrightarrow 受干扰少 ⟹ \Longrightarrow 位错运动阻力小 ⟹ \Longrightarrow 硬化速率下降

          第二阶段:多滑移系 ⟹ \Longrightarrow 位错交割缠结 ⟹ \Longrightarrow 位错运动阻力大 ⟹ \Longrightarrow 硬化速率增大

          第三阶段:流变应力大 ⟹ \Longrightarrow 交滑移或攀移绕过障碍、异号位错相互抵消 ⟹ \Longrightarrow 硬化速率

        • 多晶体硬化机理

          1. 晶界 ⟹ \Longrightarrow 阻碍位错运动;2. 位向差 ⟹ \Longrightarrow 晶粒间需要协调

            1、2 使得硬化速率变大,同时使单滑移消失,即无第一阶段

    • 塑性变形后物理、化学性能的变化

      • 导电性

        塑性变形后,

        ⟹ \Longrightarrow 空位、位错增多 ⟹ \Longrightarrow 点阵畸变 ⟹ \Longrightarrow 对电子的散射 ⟹ \Longrightarrow 电阻上升

        ⟹ \Longrightarrow 显微组织择优取向 ⟹ \Longrightarrow 电阻下降

      • 磁性

        塑性变形后,

        ⟹ \Longrightarrow 降低 Z n 、 C u Zn、Cu ZnCu 的抗磁性

        ⟹ \Longrightarrow 降低顺磁金属的磁化敏感性

      • 导热性

        塑性变形后,

        ⟹ \Longrightarrow 裂纹、空洞、晶体缺陷 ⟹ \Longrightarrow 导热性下降

      • 密度

        塑性变形后,

        ⟹ \Longrightarrow 裂纹、空洞、晶体缺陷 ⟹ \Longrightarrow 密度下降

      • 电位

        塑性变形后,

        ⟹ \Longrightarrow 点阵畸变 ⟹ \Longrightarrow 电位较高

      • 化学稳定性

        ⟹ \Longrightarrow 内应力、点阵畸变 ⟹ \Longrightarrow 化学稳定性下降

      • 耐蚀性

        电位升高、稳定性下降、裂纹,空洞 ⟹ \Longrightarrow 耐蚀性下降

    ⟹ \Longrightarrow 显微组织择优取向 ⟹ \Longrightarrow 电阻下降

    • 磁性

      塑性变形后,

      ⟹ \Longrightarrow 降低 Z n 、 C u Zn、Cu ZnCu 的抗磁性

      ⟹ \Longrightarrow 降低顺磁金属的磁化敏感性

    • 导热性

      塑性变形后,

      ⟹ \Longrightarrow 裂纹、空洞、晶体缺陷 ⟹ \Longrightarrow 导热性下降

    • 密度

      塑性变形后,

      ⟹ \Longrightarrow 裂纹、空洞、晶体缺陷 ⟹ \Longrightarrow 密度下降

    • 电位

      塑性变形后,

      ⟹ \Longrightarrow 点阵畸变 ⟹ \Longrightarrow 电位较高

    • 化学稳定性

      ⟹ \Longrightarrow 内应力、点阵畸变 ⟹ \Longrightarrow 化学稳定性下降

    • 耐蚀性

      电位升高、稳定性下降、裂纹,空洞 ⟹ \Longrightarrow 耐蚀性下降

    展开全文
  • 抖音包大小优化-资源优化

    千次阅读 2020-03-30 09:54:27
    在 app/build/mcimage_result 目录下会生成 mcimage_log.txt 日志文件,除了输出转换结果的日志外,在最后还输出了像素图片和大体积图片,阈值可在 McImageConfig 里进行设置,方便图复盘优化包大小;...

    1.概述

    随着业务的快速迭代,抖音 Android 端的包大小爆发式增长。包大小直接影响到下载转化率、推广成本、运行内存和安装时间等因素,因此对 apk 进行瘦身是一件很有必要且收益很大的事情。apk 主要由 dex、resource、asserts、native libraries 和 meta-data 组成,针对每一部分,都可以专项去做包大小优化。
    抖音 Android 端经过一段时间努力,包大小优化已经取得了阶段性的成果。目前仍在持续的优化中。

    -优化前优化后百分比
    抖音73MB61.5MB15.7%
    抖音 lite10MB4.9MB51%

    其中,资源在 apk 包体积中占比很大,针对资源进行优化是包大小优化中很重要的部分。本着追求极致的原则,本文将详细阐述抖音 Android 端针对资源部分的优化措施。

    2.图片压缩

    2.1 图片压缩原理

    在不进行压缩的情况下,图片大小计算公式:图片大小=长 x 宽 x 图片位深。一张原始图像(1920x1080),如果每个像素 32bit 表示(RGBA),那么图像需要的存储大小 1920x1080x4 = 8294400Byte,大约 8M,一张图这么大是难以接受的。因此我们使用的图片都是经过压缩的。
    图片压缩利用的是空间冗余和视觉冗余原理:

    • 空间冗余利用的是图像上各采样点颜色之间存在着的空间连贯性,把本该一个一个像素存储的数据,合并压缩存储,加载时进行解压还原。通常无损压缩利用的就是空间冗余原理。

    • 视觉冗余是指人类的视觉系统由于受生理特性的限制,对于图像场的注意是非均匀的,人对细微的颜色差异感觉不明显。例如,人类视觉的一般分辨能力为 26 灰度等级,而一般的图像的量化采用的是 28 灰度等级,即存在视觉冗余。通常有损压缩利用的是人的视觉冗余原理,擦除了对人的眼睛来说冗余的信息。

    2.2 优势

    抖音 Android 研发团队开发了 Gradle 插件 McImage,在编译期间 hook 资源,采用开源的算法 pngquant/guetzli 进行压缩,支持 webp 压缩。与 tinypng 等一些已知的方案相比,存在以下优势:

    • McImage 现支持 webp 压缩,压缩比高于 tinypng,不过 Android 上 webp 需要做兼容,下文会详细介绍;

    • tinypng 不开源,每个账号每个月只能免费压缩 500 张;McImage 使用的压缩算法都是基于开源算法;

    • McImage 不仅可以压缩 module 中的图片,还能压缩 jar 和 aar 中的图片;

    • McImage 支持压缩算法扩展,有更优的压缩算法选择时扩展方便;

    • 和行业里其他方案相比,McImage 还能够支持压缩包含透明度的 webp 图片,并且兼容了 aapt2 对资源的 hook。

    2.3 收益

    McImage 支持两种优化方式,这两种优化方式不可同时使用:

    • Compress,pngquant 压缩 png 图片,guetzli 压缩 jpg 图片;

    • ConvertWebp,webp 压缩 png\png 图片。

    webp 的压缩比要高于 pngquant、guetzli,所以现在更推荐使用 ConvertWebp 这种压缩方式。

    McImage 还被应用于字节跳动旗下多个产品的图片压缩优化工作中,收益如下:

    描述收益
    抖音-Compress9.5MB
    抖音-ConvertWebp11.6MB
    火山-ConvertWebp3.6MB
    Vigo-ConvertWebp4MB
    Vigo aab-Compress1.2MB
    vigo aab-ConvertWebp3.2MB
    多闪-ConvertWebp3.5MB

    2.4 其他

    除了压缩、优化图片,McImage 还提供了以下功能:

    1. 大图检测。在 app/build/mcimage_result 目录下会生成 mcimage_log.txt 日志文件,除了输出转换结果的日志外,在最后还输出了大像素图片和大体积图片,阈值可在 McImageConfig 里进行设置,方便大图复盘优化包大小;也支持编译阶段检测,检测到大图直接 block 编译,可及时发现大图提交;

    2. 压缩算法方便扩展。如果想接入其他压缩算法,只需要继承 AbstractTask,实现 ITask 接口中的 work 方法即可;

    3. 支持多线程压缩。把所有 task 的执行放入线程池中执行,大大缩短了 mcimage 的执行时间;

    4. 增加了图片缓存 cache,进一步缩短打包时间。在开启多线程+图片缓存的情况下,全部命中缓存的情况下,整个 mcimage 的过程不到 10s;缓存路径可配置;

    5. 压缩质量可配置,满足不同的压缩质量需求,缓存文件也会按照不同的压缩质量进行保存和命中;

    6. 扫描不包含透明通道的图片到 app/build/mcimage_result 目录下。

    3.webp 无侵入式兼容

    3.1 tinypng 和 webp 的选择

    tinypng 与 webp 到底哪个压缩比更高呢?在网上找不到两种压缩算法压缩比的直接比较,需要更直观的对比,于是做了如下的实验:

    1. 扫描项目中 1960 张图片,通过不同的算法压缩进行对比:

    描述大小
    原图13463.07KB
    webp 压缩4177.18KB
    tinypng 压缩6732.18KB
    1. 从项目中找 490 张图片,新建 demo,不同算法压缩图片后比较打包 apk 的大小:

    描述大小
    原图 APK9617.53KB
    webp 压缩 APK3924.06KB
    tinypng 压缩 APK5386.80KB

    通过这两组实验对比,可以看出 webp 的压缩比是优于 tinypng 的。之前也手动的使用 webp 工具压缩过抖音工程中所有图片,包大小减少了 1.6MB 左右。因此选择了 Webp 压缩算法。

    3.2 方案选型

    webp 压缩算法,相较于 pngquant、guetzli、tinypng,webp 压缩比更高,所以 webbp 压缩图片应该是更优的选择。但是 Android 设备对 webp 的支持存在兼容性问题,在 4.3 以上才完全支持。通过官网我们知道,想在应用中直接使用带有透明度的 webp,minSDK 至少需要是 18。
    包括抖音、今日头条在内的头条系 Android 应用,大部分 minSDK 是 16,无法直接使用 webp 图片,需要做低版本兼容。通过大量调研,找到了三种兼容的方式:

    -优点缺点
    提供特定 api 兼容实现起来简单侵入性太强,必须用特定接口或特定 View 进行加载
    LayoutInflater setFactory 进行兼容实现起来简单需要针对所有的 ImageView 及子 View 处理,且必须有统一的 Activity、Fregment 的基类处理
    运行时 hook 系统关键方法方法替换,可以做到无侵入式实现起来复杂些

    3.3 方案实现

    想要做到无侵入式的兼容,运行时 hook 不失为一种最佳的选择。但是运行时 hook 方案,需要解决以下几点问题:

    • 选择的 hook 方案要稳定可靠;

    • hook 点要足够收敛,保证所有解析图片的操作都能符合预期。

    3.3.1 Hook 方案要稳定可靠

    通过对 Xposed、AndFix、Cydia Substrate、dexposed 等常见的 Android Java hook 方案的调研对比,dexposed 具有不需要 root、又能 hook 系统方法的特点,最终选择 dexposed:

    • dexposed 在 Dalvik 上比较稳定,只需要针对 4.3 以下的手机版本做 hook,不需要考虑版本兼容性问题和系统升级问题;

    • 通过内部数据可以知道,抖音 4.3 以下的用户并不多,在十万级别,占总用户数的万分之几,风险较低。

    3.3.2 Hook 点要足够收敛

    通过阅读源码,发现所有图片被加载解析成 Bitmap 的过程,最终都调用到了 BitmapFactory 中的方法。比如 ImageView 的 setImageResource() 的调用路径如下:

    ImageView 的 setImageResource 过程,Bitmap 的创建是通过 BitmapFactory 来实现。如 View 的 setBackgroundResource(int resid)的源码如下:

    查阅所有加载图片的 api,都会经历 Resources 调用 getDrawable 的过程。会调用到 Drawable 的相关方法,然后通过 BitmapFactory 去解析不同的资源类型(File\ByteArray\Stream\FileDescriptory)为 Bitmap。由此可以推断出,BitmapFactory 是 Android 系统通过不同的资源类型加载成 Bitmap 的统一接口,这一点从 BitmapFactory 的类注释中也能看出:

    BitmapFactory注释

    由于系统加载解析 Bitmap 的过程已经足够收敛,都是通过 BitmapFactory 来实现,因此 BitmapFactory 是一个非常不错的 hook 点。

    有了稳定的 Hook 方案和足够收敛的 Hook 点,方案的实现起来就手到擒来了,利用 dexposed 对 BitmapFactory 里的关键方法进行替换就可以了。

    4.多 DPI 优化

    Android 为了适配各种不同分辨率或者模式的设备,为开发者设计了同一资源多个配置的资源路径,app 通过 resource 获取图片资源时,自动根据设备配置加载适配的资源,但这些配置伴随着的问题就是高分辨率的设备包含低分辨率的无用图片或者低分辨率的设备包含高分辨率的无用图片。

    一般情况下,针对国内应用市场,App 为了减少包大小,会选用市场占有率最高的一套 dpi(google 推荐 xxhdpi)兼容所有设备。而针对海外应用市场的 APP,大多会通过 AppBundle 打包上传至 Google Play,能够享受动态分发 dpi 这一功能,不同分辨率手机可以下载不同 dpi 的图片资源,因此我们需要提供多套 dpi 来满足所有设备。在项目中,我们的图片有的只有一套 dpi,有的有多套 dpi,针对上述两种场景,我们分别在打包时合并资源、复制资源,减少了包大小。

    4.1 DPI 复制(bundle 打包)

    在国内项目中,为了减少图片的占用,一般都会对市场占用率高的 dpi 进行适配,比如只保留 xxhdpi 分辨率的图片。这样就导致了两个问题,一个是市场上 2k 分辨率手机越来越多,如果以后手机主流分辨率是 xxxhdpi,那么项目中几千张图片修改成本会非常高。另一个问题是,公司不少海外产品是通过 AppBundle 打包上传到 Google Play 的,能够给不同设备用户下发不同 dpi 的资源。但项目中只有 xxhdpi,仍然下发 xxhdpi 的图片,无法通过降低 dpi 减小包大小。在巴西,我们 80%用户都使用 xhdpi 和 hdpi 手机,xxhdpi 图片相比 hdpi 占用多了一倍,这部分收益相当高。

    因此,我们通过压缩分辨率的方式将高分辨率的图片降低到低分辨,项目业务只存放最高 dpi 图片,在打包的时候按需求复制筛选。我们在 hook 了图片压缩的 task,在图片压缩前,获取到包括依赖库在内的所有 PNG 图片,利用 Graphics2D 降低图片分辨率,放在对应分辨率文件夹中。之后再执行图片压缩 task,防止一些图片重采样后大小增加。

    我们仅对图片的分辨率进行缩放,并不降低图片采样率,因此在显示效果上没有区别。不同 dpi 具体应该调整到多少分辨率,我们根据 Google 的定义制作了一个表格:

    我们复制一张 xxhdpi 的默认 logo 到所有 dpi,流程如下图,xhdpi 和 mdpi 文件夹下没有对应图片,复制;在 hdpi 中有对应图片,跳过;xxxhdpi 也没有对应图片,但为了避免降低图片精度,不能向更高分辨率文件夹复制,跳过。

    最终收益如图,公司内海外产品 TikTok 研发团队在使用该方案优化时,ldpi 相比 xxhdpi 减少了 2.5M 包大小。同时,低分辨率手机加载图片时直接加载对应 dpi 图片资源,不再需要对高分辨率图片进行缩放处理,提高了性能。

    在复制时需要注意这些问题:为了处理包括依赖库中的所有图片,在资源合并阶段进行了复制,这样会导致.cache 目录的很多路径下会多出大量图片资源,因此这个插件我们在 CI 上开启,避免本地打包新增大量图片,提交到代码仓库。同时,由于.cache 中被复制了多份图片,需要在 assemble 打包流程中进行多 dpi 去重。在 CI 上会有并发场景,同时复制和压缩会导致.cache 目录下同时存在 a.png 和 a.webp,出现 Duplicated 错误,因此最后需要扫描删除同名的.png 文件。

    4.2 多 DPI 去重(assemble 打包)

    针对普通打包模式(直接产出 apk,比如抖音包),我们可以选择只保留一份分辨率偏高的的图片,这样高分辨率设备可以拿到合适的图片、低分辨率设备通过 Resource 获取时会自动进行缩放,依然可以保证合理的运行内存。

    多 dpi 图片可以通过 Android 自带的 resConfig 去重,但这个配置只对资源的 qualifier 去重,比如对像素密度和屏幕尺寸不会同时做去重,抖音使用基于 AndResguard 修改的方式对 drawable 去重,可以定义不同配置的优先级和作用范围。根据优化配置确保留一份资源,优化方式如下图(灰色数据表示会被删除):

    5.重复资源合并

    随着项目的迭代,项目中难免会出现相同的资源被重复添加到资源路径中,对于这类文件,人工处理肯定是不可行的,可以在打包阶段自动去重。

    抖音选择在 AndResguard 阶段对所有的资源进行分析,对 md5 相同的资源文件保留一份,删除其余的重复的文件,然后在 AndResguard 写入 arsc 文件时进行将删除的资源文件对应的资源路径指向唯一保留的一份资源文件。优化方式如下图:

    下图是抖音 511 版本接入多 dpi 去重与重复资源合并功能的优化结果:

    6.shrinkResource 严格模式

    6.1 背景

    随着项目的开发迭代,我们会有许多资源已经不再使用了,但仍然存在于项目中。虽然我们可以使用公司开源的字节码插件开发平台 ByteX 开发插件在 ProGuard 之前扫描出一些无用资源,但因为这一步没有经过无用代码删除,因此扫描出的结果并不全。而 shrinkResources 是 google 官方提供的优化此类无用资源的方法,它运行在 Proguard 之后,能标记所有无用资源并将其优化。

    6.2 收益

    抖音 Android 在开启 shrinkResources 严格模式后,shrink 资源数 600+,收益大小 0.57MB。

    6.3 接入方法

    shrinkResources 是由 Google 官方提供的工具,因此详细的接入方式参考 Google Developer 上的文档即可。

    6.4shrinkResources 原理

    默认情况下,Resource shrink 是 safe 模式的,即其会帮助我们识别类似val name = String.format("img_%1d", angle + 1)val res = resources.getIdentifier(name, "drawable", packageName)这样模式的代码,从而保证我们在反射调用资源文件的时候,也是能够安全返回资源的。从源码来看,Resource shrink 时会帮助我们识别以下五种情况:

    而 Resource shrink 使用了一种最笨但却最安全的方法去获取匹配的前缀/后缀字符串,那就是将应用中所有的字符串都认为是可能的前缀/后缀匹配字符串。

    所以这就造成了在安全模式下,不小心被某个字符串所匹配到的资源,即使没有被使用也会被保留下来。以我们的项目为例,在 com.ss.android.ugc.aweme.utils.PatternUtils 中,我们有以下代码:

    在安全模式下,这就造成了所有以 tt 开头的无用资源都不会被 shrink 掉(这也就是为什么严格模式一开,ttlive_ 开头的无用资源那么多的原因)。

    而严格模式打开后,其作用便是强行关闭这一段的字符匹配的过程:

    当然这也就造成了我们在使用 getIdentifier() 的时候是不安全的,因为严格模式下是不会匹配任何字符串的,所以在开启严格模式之后,一定要严格检查所有被 shrink 的资源,是否有自己需要反射的资源!

    6.5 shrinkResources 兼容 Dynamic Feature

    AppBundle 是 Google 近年来力推的一个功能,它能够让我们的 apk 按照不同的维度生成下发,也提供了一个动态下发功能的方式,Dynamic Feature。但是如果我们在开启 Dynamic Feature 之后使用 shrinkResources,则提示以下错误:

    由此看来 Google 官方并不支持 App Bundle 使用 Dynamic Feature 时使用 shrink resource。在 Google Issue Tracker 上发现已经有人对此提交过 Issue 了,相关 Issue。而 Google 的回复也是简单粗暴----计划中,但是没有时间:

    但是正常来说,如果做的好的话,我们的 App Bundle 的 Dynamic Feature 模块是很少会引用 Master 的资源的,即使有,使用 keep.xml 的方式也能将这种资源给保留下来。因此,理论上来说,单独对 Master 模块进行 shrinkResource 并注意反射调用的话,是没多大问题的。Dynamic Feature 下检查 shrinkResources 配置是在 Configuring 阶段

    因此我们的想法便是在配置阶段不开启 shrinkResources 开关,而在后面执行资源处理任务的时候自行插入 shrinkResources 的 Task:

    这样就能在 Dynamic Feature 下开启 shrinkResources 的 Task 了,整个代码编写十分简单,不到 50 行就能完成:

    7.资源混淆(兼容 aab 模式)

    资源 id 与资源全路径的映射关系记录在 arsc 文件中,app 通过资源 id 再通过 Resource 获取对应的资源,所以对于映射关系中的资源路径做名字混淆可以达到减少包体积的效果。

    抖音启用了微信开源的 AndResguard 进行资源混淆,在开源的基础上进行了增加了 MD5 去、多 DPI 只保留一份资源等优化。由于公司内部有很多海外产品,在上架 Google Play 时需要走 aab,因此团队做了资源混淆的 aab 兼容-- aabResguard(开源 | AabResGuard: AAB 资源混淆工具),已开源。

    8.ARSC 瘦身

    8.1 背景

    resources.arsc 这个文件在很多项目中都占用了相当多的空间。常见的优化方法是使用 AndResGuard 混淆减少文件名及目录长度,7z 压缩,如果有海外产品的话可以动态下发语言。我们在做完这些优化后,由于公司内部有很多海外产品,涉及到多语言的关系,ARSC 依然很大,我们决定尝试进一步优化。
    经过调研,最终我们对 3 个方面做了优化,分别是删除无用 Name、合并字符串池中重复字符串、删除无用文案,最终带来的收益是 1.6MB。在此之前,我们还在 AndResGuard 的基础上完成了重复 MD5 文件图片合并,原理是一样的。

    8.2 原理

    先贴一张 arsc 结构的图,这个二进制文件的数据结构相当复杂,AndResGuard 其实只修改了这个文件的一小部分,至于更多的修改就无能为力了,于是我们自己解析了这个文件进行分析。网上也有不少关于这个文件格式的说明,这里就不赘述了。推荐老罗和尼古拉斯的博客以及 aapt2 源码。google 提供的 android-arscblamer 和 apktool 的代码也值得一看。

    下面用一张图简单描述一下修改过程:

    如图,字符串其实是通过索引的方式来获取的,所有字符串都保存在两个字符串池中(单个 package),一个是全局字符串池,一个是 package 下的字符串池,我们只需要修改指向全局字符串的偏移值就行了。name 和 value 所在二进制位置如下图。

    8.3 方案

    8.3.1 删除无用 Name

    AndResGuard 在今年的 7 月也增加了这个功能,我们来看一下实现原理。Name 对应的字符串池是 package 字符串池,由于这个字符串池中只包含所有 Name,我们操作可以稍微暴力一点,先做一份备份,然后清空字符串池,添加一个用于替换的字符串,赋值为 [name_removed]。

    首先要确定哪些 name 是通过 getIdentifier 调用,配置成白名单。遍历 name 项,如果不在白名单,那么把这一个 name 的偏移替换成 0,使其指向[name_removed]。如果 name 在白名单,那么不应该删除,我们通过备份的字符串池找到这个 name 对应的字符串,添加到字符串池中,把偏移指向对应下标即可。

    抖音通过这个优化减少了包大小 70k。

    8.3.2 合并重复字符串

    value 所对应的是全局字符串池,虽然名字听起来不会有重复值,但在我们扫描排序后发现其实有很多重复字符串(用 AppBundle 打包就不会存在这个问题) 在抖音项目中,这个字符串池里有 1k+个重复字符串,合并这些字符串是非常必要的。

    我们先遍历所有数据,然后把字符串池的重复字符串合并,记录偏移的修改,最后把需要修改的 value 的引用指向新的偏移。这个过程需要操作 arsc 数据结构的 ResValuel 和 ResTableMap,以保证所有 string 类型的值都能得到替换。

    抖音通过这个优化减少了包大小 30k。

    8.3.3 删除无用文案

    在打包过程中,其实所有 strings.xml 中保存的字符串都是不会被优化的,随着项目逐渐变大,一些废弃文案或者下个版本才有用的文案被引入了 apk 中,我们在 Proguard 后再次扫描,发现了 3000+个无用字符串。在公司内部的一些海外项目中,有的文案被翻译成 100 多个国家的语言,占用了极大的空间。

    删除的方法和上面类似,都是指向替换的字符串所在偏移。如图可能会存在两个不同 name 指向同一个字符串,需要判断待删除的字符串是否还有其他引用。

    不同项目收益可能不太一样,公司内部海外项目对这些无用文案进行了替换,减少了 1.5M 包大小左右。

    8.4 实现

    如果是普通的 assemble 打包,直接在 ProcessResources 过程中获取 ap_文件中的 arsc 文件,利用我们的工具修改即可。

    如果是 AppBundle 方式打包,修改 ap_是没有用的,因为最后产物是用 aapt 以 proto 格式生成的 resources.pb 文件,要修改只能 hook aapt 过程。这个文件和 arsc 文件结构不太一样,好在我们可以使用官方提供的 Resources 类解析、生成 pb 文件,使用相似的方法修改即可。

    修改效果如图:

    8.5 进一步优化

    arsc 中的偏移数组是有优化空间的,我们会在未来尝试进行优化。用二进制编辑器打开 arsc 文件可以发现,这样的 FF 值在文件中大量存在。

    是什么导致了这样的空间浪费?我们可以看到下图中框选的空白,每一个都代表了其字符串所在的偏移值,这里并没有值,赋值 FF FF FF FF 作为默认偏移值,浪费了 4 字节空间。某些列(configuration)可能就只有几个格子有值,如图抖音中 drawable 有 4k+张图片,有 24 列,大多数 configuration 只有几张图片,因此浪费了 4k*23*4≈380k。大致估算,抖音可以减少 1M 体积。(压缩前)

    如下图 facebook 针对 arsc 文件的处理,我们可以把一行只有一个值的 id 抽出来,单独放到一个 Resource Type 中,每一个 id 只有一个值,避免了上述空间浪费情况。但这样做修改了 ID,因此对应的代码中的 ID 也要修改,涉及了逆向 xml 以及 dex,提高了修改成本。还有一种思路是修改 aapt 源码,没有直接改 arsc 灵活。

    9.总结

    上述就是我们抖音 Android 端在包大小优化方面针对资源做的一些尝试和积累,力求追求极致。

    我们针对包大小优化,在其他方面还做了很多优化措施:针对 so 优化,做了 so 合并、stl 版本统一、精简导出符号表和 so 压缩等措施;针对代码优化,细化混淆规则,开发 bytex 插件进行无用代码扫描、acess 方法内联、getter/setter 方法内联、删除行号等优化措施。

    除了优化措施,良好的包大小监控系统是防止包大小劣化最重要的工具,否则包大小优化措施取得的收益抵不过业务快速迭代带来的包大小增长。抖音 Android 端结合 CI、Cony 平台,开发出了一套代码合入前置检查系统,每个分支增量超过阈值不准合入;还开发了分业务线监控包大小的工具,便于监控每个业务线包大小增长和给各个业务线定包大小指标。

    最后,抖音 Android 诚招对技术有无限热情的小伙伴。感兴趣的小伙伴都可以通过「字节跳动招聘官网查询抖音 Android 相关职位」或简历发送至  shipeiqing@bytedance.com 

    更多分享

    抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%(二)

    抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%(一)

    开源 | AabResGuard: AAB 资源混淆工具

    欢迎关注「字节跳动技术团队」

      点击阅读原文,快来加入我们吧!

    展开全文
  • 非参数估计:核密度估计KDE

    万次阅读 多人点赞 2016-12-14 11:38:46
    http://blog.csdn.net/pipisorry/article/details/53635895核密度估计Kernel Density Estimation(KDE)概述密度估计的问题由给定样本集合求解随机变量的分布密度函数问题是概率统计学的基本问题之一。解决这一问题的...

    http://blog.csdn.net/pipisorry/article/details/53635895

    核密度估计Kernel Density Estimation(KDE)概述

    密度估计的问题

    由给定样本集合求解随机变量的分布密度函数问题是概率统计学的基本问题之一。解决这一问题的方法包括参数估计和非参数估计。

    参数估计

    参数估计又可分为参数回归分析和参数判别分析。在参数回归分析中,人们假定数据分布符合某种特定的性态,如线性、可化线性或指数性态等,然后在目标函数族中寻找特定的解,即确定回归模型中的未知参数。在参数判别分析中,人们需要假定作为判别依据的、随机取值的数据样本在各个可能的类别中都服从特定的分布。经验和理论说明,参数模型的这种基本假定与实际的物理模型之间常常存在较大的差距,这些方法并非总能取得令人满意的结果。

    [参数估计:最大似然估计MLE][参数估计:文本分析的参数估计方法]

    非参数估计方法

    由于上述缺陷,Rosenblatt和Parzen提出了非参数估计方法,即核密度估计方法。由于核密度估计方法不利用有关数据分布的先验知识,对数据分布不附加任何假定,是一种从数据样本本身出发研究数据分布特征的方法,因而,在统计学理论和应用领域均受到高度的重视。

    核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一,由Rosenblatt (1955)和Emanuel Parzen(1962)提出,又名Parzen窗(Parzen window)。Ruppert和Cline基于数据集密度函数聚类算法提出修订的核密度估计方法。

    核密度估计在估计边界区域的时候会出现边界效应

    [https://zh. wikipedia.org/zh-hans/核密度估计]

    因此,一句话概括,核密度估计Kernel Density Estimation(KDE)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。

    在密度函数估计中有一种方法是被广泛应用的——直方图。如下图中的第一和第二幅图(名为Histogram和Histogram, bins shifted)。直方图的特点是简单易懂,但缺点在于以下三个方面:密度函数是不平滑的;密度函数受子区间(即每个直方体)宽度影响很大,同样的原始数据如果取不同的子区间范围,那么展示的结果可能是完全不同的。如下图中的前两个图,第二个图只是在第一个图的基础上,划分区间增加了0.75,但展现出的密度函数却看起来差异很大;直方图最多只能展示2维数据,如果维度更多则无法有效展示。


    核密度估计有多种内核,图3(Tophat Kernl Density)为不平滑内核,图4(Gaussian Kernel Density,bandwidth=0.75)为平滑内核。在很多情况下,平滑内核(如高斯核密度估计,Gaussian Kernel Density)使用场景较多。

    虽然采用不同的核函数都可以获得一致性的结论(整体趋势和密度分布规律性基本一致),但核密度函数也不是完美的。除了核算法的选择外,带宽(bandwidth)也会影响密度估计,过大或过小的带宽值都会影响估计结果。如上图中的最后三个图,名为Gaussian Kernel Density,bandwidth=0.75、Gaussian Kernel Density,bandwidth=0.25、Gaussian Kernel Density,bandwidth=0.55.

    核密度估计的应用场景

    股票、金融等风险预测:在单变量核密度估计的基础上,可以建立风险价值的预测模型。通过对核密度估计变异系数的加权处理,可以建立不同的风险价值的预测模型。

    密度估计中应用较多的算法是高斯混合模型以及基于近邻的核密度估计。高斯混合核密度估计模型更多会在聚类场景中应用。

    [核密度估计Kernel Density Estimation(KDE)]

    核密度分析可用于测量建筑密度、获取犯罪情况报告,以及发现对城镇或野生动物栖息地造成影响的道路或公共设施管线。可使用 population 字段根据要素的重要程度赋予某些要素比其他要素更大的权重,该字段还允许使用一个点表示多个观察对象。例如,一个地址可以表示一栋六单元的公寓,或者在确定总体犯罪率时可赋予某些罪行比其他罪行更大的权重。对于线要素,分车道高速公路可能比狭窄的土路产生更大的影响,高压线要比标准电线杆产生更大的影响。[ArcGIS中的介绍]

    热力图大家一定听说过,其实热力图就是核密度估计。

    总而言之,核密度就是用来估计密度的,如果你有一系列空间点数据,那么核密度估计往往是比较好的可视化方法

    皮皮blog



    核密度估计

    所谓核密度估计,就是采用平滑的峰值函数(“核”)来拟合观察到的数据点,从而对真实的概率分布曲线进行模拟。

    核密度估计(Kernel density estimation),是一种用于估计概率密度函数的非参数方法,为独立同分布F的n个样本点,设其概率密度函数为f,核密度估计为以下:


    K(.)为核函数(非负、积分为1,符合概率密度性质,并且均值为0)。有很多种核函数,uniform,triangular, biweight, triweight, Epanechnikov,normal等。

    h>0为一个平滑参数,称作带宽(bandwidth),也看到有人叫窗口。

    Kh(x) = 1/h K(x/h). 为缩放核函数(scaled Kernel)。

    核密度函数的原理比较简单,在我们知道某一事物的概率分布的情况下,如果某一个数在观察中出现了,我们可以认为这个数的概率密度很大,和这个数比较近的数的概率密度也会比较大,而那些离这个数远的数的概率密度会比较小。

    基于这种想法,针对观察中的第一个数,我们可以用K去拟合我们想象中的那个远小近大概率密度。对每一个观察数拟合出的多个概率密度分布函数,取平均。如果某些数是比较重要的,则可以取加权平均。需要说明的一点是,核密度的估计并不是找到真正的分布函数。

    Note: 核密度估计其实就是通过核函数(如高斯)将每个数据点的数据+带宽当作核函数的参数,得到N个核函数,再线性叠加就形成了核密度的估计函数,归一化后就是核密度概率密度函数了

    以下面3个数据点的一维数据集为例:5, 10, 15

    绘制成直方图是这样的:                                                   而使用KDE则是:

    KDE核函数k(.)

    理论上,所有平滑的峰值函数均可作为KDE的核函数来使用,只要对归一化后的KDE而言(描绘在图上的是数据点出现的概率值),该函数曲线下方的面积和等于1即可。

    只有一个数据点时,单个波峰下方的面积为1,存在多个数据点时,所有波峰下方的面积之和为1。概而言之,函数曲线需囊括所有可能出现的数据值的情况。

    常用的核函数有:矩形、Epanechnikov曲线、高斯曲线等。这些函数存在共同的特点:在数据点处为波峰;曲线下方面积为1。

    单个数据点(只有一个数据时)所对应的这些核函数

    矩形

    Epanechnikov曲线

    高斯曲线

    [概率论:高斯/正态分布 ]

    sklearn中实现的核函数

    kde_kernels

    sklearn核函数形式

    • Gaussian kernel (kernel = 'gaussian')

      K(x; h) \propto \exp(- \frac{x^2}{2h^2} )

    • Tophat kernel (kernel = 'tophat')

      K(x; h) \propto 1 if x < h

    • Epanechnikov kernel (kernel = 'epanechnikov')

      K(x; h) \propto 1 - \frac{x^2}{h^2}

    • Exponential kernel (kernel = 'exponential')

      K(x; h) \propto \exp(-x/h)

    • Linear kernel (kernel = 'linear')

      K(x; h) \propto 1 - x/h if x < h

    • Cosine kernel (kernel = 'cosine')

      K(x; h) \propto \cos(\frac{\pi x}{2h}) if x < h

    [Kernel Density Estimation ]

    wekipedia上各种核函数的图形


    均匀核函数 k(x)=1/2,-1≤x≤1 加入带宽h后: kh(x)=1/(2h),-h≤x≤h

    三角核函数 k(x)=1-|x|,-1≤x≤1 加入带宽h后: kh(x)=(h-|x|)/h^2,-h≤x≤h

    伽马核函数 kxi(x)=[x^(α-1)exp{-xα/xi}]/[(xi/α)^α.Γ(α)]

    高斯核函数K(x,xc)=exp(-||x-xc||^2/(2*σ)^2)其中xc为核函数中心,σ为函数的宽度参数

    [https://zh.wikipedia.org/zh-hans/%E6%A0%B8%E5%AF%86%E5%BA%A6%E4%BC%B0%E8%AE%A1]

    不同内核的比较

    Epanechnikov 内核在均方误差意义下是最优的,效率损失也很小。

    由于高斯内核方便的数学性质,也经常使用 K(x)= ϕ(x),ϕ(x)为标准正态概率密度函数。

    对于多个数据点的KDE曲线:由于相邻波峰之间会发生波形合成,因此最终所形成的曲线形状与选择的核函数关系并不密切。考虑到函数在波形合成计算上的易用性,一般使用高斯曲线(正态分布曲线)作为KDE的核函数。

    KDE算法:索引树

    lz发现sklearn算法实现中有一个参数是算法项,如algorithm='auto',想了一下是为了加速。

    KDE的概率密度函数公式得到后


    有了上述公式之后,只需遍历输出图像的每一个点,计算其核密度估计值即可。

    但是稍微想一下就发现这个程序太冗余了,如果有很多点(n很大),并且输出图像很大,那么每一个像素都需要进行n个累积的加法运算,并且大部分都是+0(因为一般来说,一个点附近的点不会很多,远远小于n,其余大部分点与这个像素的距离都大于r),这样就造成了冗余计算。

    解决方案当然也非常简单,就是建立一个索引,然后在计算某个像素的核密度估计值时利用索引搜索出附近的点,然后累积这些点的核函数即可。

    如Dotspatial自带了多种空间索引,有R树,R*树,KD树等;sklearn自带了kd tree, ball tree等等。

    如果只需找出附近的点,对索引要求不高,任意一个索引都能使用。

    [ 空间点云核密度估计算法的实现-以Dotspatial为基础GIS库]

    KDE带宽h

    如何选定核函数的“方差”呢?这其实是由带宽h来决定,不同的带宽下的核函数估计结果差异很大。

    带宽反映了KDE曲线整体的平坦程度,也即观察到的数据点在KDE曲线形成过程中所占的比重。带宽越大,观察到的数据点在最终形成的曲线形状中所占比重越小,KDE整体曲线就越平坦;带宽越小,观察到的数据点在最终形成的曲线形状中所占比重越大,KDE整体曲线就越陡峭。

    还是以上面3个数据点的一维数据集为例,如果增加带宽,那么生成的KDE曲线就会变平坦:

    如果进一步增加带宽,那么KDE曲线在变平坦的同时,还会发生波形合成:

    相反,如果减少带宽,那么KDE曲线就会变得更加陡峭:

    从数学上来说,对于数据点Xi,如果带宽为h,那么在Xi处所形成的曲线函数为(其中K为核函数):

    在上面的函数中,K函数内部的h分母用于调整KDE曲线的宽幅,而K函数外部的h分母则用于保证曲线下方的面积符合KDE的规则(KDE曲线下方面积和为1)。

    带宽的选择

    带宽的选择很大程度上取决于主观判断:如果认为真实的概率分布曲线是比较平坦的,那么就选择较大的带宽;相反,如果认为真实的概率分布曲线是比较陡峭的,那么就选择较小的带宽。

    带宽计算好像也有相应的方法,如R语言中计算带宽时,默认采用”nrd0″方法。

    如何选择h?显然是选择可以使误差最小的。下面用平均积分平方误差(mean intergrated squared error)的大小来衡量h的优劣。

    在weak assumptions下,MISE (h) =AMISE(h) + o(1/(nh) + h4) ,其中AMISE为渐进的MISE。而AMISE有,

    其中,

    为了使MISE(h)最小,则转化为求极点问题,



    当核函数确定之后,h公式里的R、m、f''都可以确定下来,有(hAMISE ~ n−1/5),AMISE(h) = O(n−4/5)。

            如果带宽不是固定的,其变化取决于估计的位置(balloon  estimator)或样本点(逐点估计pointwise estimator),由此可以产产生一个非常强大的方法称为自适应或可变带宽核密度估计。

    [ 核密度估计(Kernel density estimation) ]
    在选择合适的核函数及带宽后,KDE可以模拟真实的概率分布曲线,并得到平滑而漂亮的结果。以近200个点的CPU使用率为例,使用KDE绘制的结果为:
    Screen Shot 2013-12-31 at 7.26.14 AM

    [一维数据可视化:核密度估计(Kernel Density Estimates)]

    皮皮blog



    核密度估计的实现

    Python中KDE的实现:sklearn

    [sklearn.neighbors.KernelDensity(bandwidth=1.0, algorithm='auto', kernel='gaussian', metric='euclidean', atol=0, rtol=0, breadth_first=True, leaf_size=40, metric_params=None)

    from sklearn.neighbors import kde
    import numpy as np
    
    X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    kde = kde.KernelDensity(kernel='gaussian', bandwidth=0.2).fit(X)
    print(kde.score_samples(X))
    print(np.exp(kde.score_samples(X)))
    [-0.41075698 -0.41075698 -0.41076071 -0.41075698 -0.41075698 -0.41076071]

    [ 0.66314807  0.66314807  0.6631456   0.66314807  0.66314807  0.6631456 ]

    score_samples(X)

    Evaluate the density model on the data.

    Parameters:

    X : array_like, shape (n_samples, n_features)

    kde.score_samples(X)返回的是点x对应概率的log值,要使用exp求指数还原。

    Note: 还原后的所有点的概率和范围是[0, 无穷大],只是说一维数据线下面的面积或者二维数据面下面的体积和为1。

    [Density Estimation]

    [sklearn.neighbors.KernelDensity]

    spark中KDE的实现

    MLlib中,仅仅支持以高斯核做核密度估计。

    [核密度估计]

    R中KDE的实现

    在R语言中,KDE的绘制是通过density()函数来实现的 — 通过density()函数计算得到KDE模型,然后再使用plot()函数对KDE曲线进行绘制:
    x <- c(5, 10, 15)
    plot(density(x))
    出于兼容性上的考虑,R语言中density()函数在计算带宽时,默认采用”nrd0″方法。不过,根据R语言的帮助文档,带宽参数bw应该显式声明为其它更合适的方法,比如”SJ”:
    plot(density(x, bw="SJ"))
    对于调整带宽,除了修改bw参数,还可以通过设定adjust参数来进行扩大或缩小:
    plot(density(x, bw="SJ", adjust=1.5))
    在上面的例子中,最终使用的带宽将是采用”SJ”方法计算得到的带宽的1.5倍。adjust参数的默认值为1,也即既不扩大、也不缩小。
    至于核函数,density()默认采用高斯曲线。可以通过设定kernel参数来更改核函数。比如:plot(density(x, bw="SJ", kernel="epanechnikov"))

    density()函数接受以下7个核函数选项:
        gaussian。高斯曲线,默认选项。在数据点处模拟正态分布。
        epanechnikov。Epanechnikov曲线。
        rectangular。矩形核函数。
        triangular。三角形核函数。
        biweight。
        cosine。余弦曲线。
        optcosine。

    from: http://blog.csdn.net/pipisorry/article/details/53635895

    ref: [有边界区间上的核密度估计]


    展开全文
  • ABAQUS中橡胶变形问题的解决方案

    千次阅读 2019-09-03 17:39:34
    密封橡胶的数值模拟是一个典型的非线性问题,涉及一组材料非线性(超弹性),边界非线性(接触)和几何非线性(变形)。 如果设置不当,很容易解决。 特别是在密封橡胶的复杂变形例如与多个不规则边界接触,变形等的...
  • 蒸汽流量计采用先进的差动技术,配合隔离、屏蔽、滤波等措施,克服了同类产品抗震性差、信号数据紊乱等问题,并采用了独特的传感器封装技术和防护措施,保证了产品的可靠性。产品有基本型和复合型两种型式,基本型...
  • 体积云渲染实战:ray marching,体积云与体积云光照

    千次阅读 多人点赞 2021-01-25 16:52:16
    今天来搞个赛艇的特技 ---- 体积云。通过 ray marching 算法可以进行体积云渲染。ray marching 算法从摄像机开始,向世界空间投射光线,并且逐步行进,记录沿途的信息,最后根据积累的信息进行云朵的绘制。此外,...
  • 作为回归的第一篇,来玩一个比较酷炫的效果,一般称之为GodRay,也有人叫它云隙光,当然,最高上的名字就是体积光散射了。这几个名字对应几种类似的效果,但是实现方式相差甚远。先来几张照片以及其他游戏的截图看...
  • 根据粉末塑性变形理论,采用MSC. Marc软件完成了316不锈钢粉末热等净压成形过程的有限元模拟.重点分析了热等静压成形过程中致密包套沿径向和轴向的形变过程及其内部松装粉末的...两者变形体积的相互抵消致使致密度模拟
  • 密度的测量

    2020-12-29 08:47:44
    方法Ⅰ:用量筒测量步骤:除非有特殊说明,先将足够量的样品过筛(1.00-mm编号18)去除存储时可能形成的块。称取约100g(精确至0.1%)的样品置250-mL的量筒,不要压实。如果不可能用100g样品,样品量和量筒大小可以改变...
  • 密度计算公式及单位

    2021-07-27 04:21:13
    密度是物质质量m与其体积V的比值,定义式为ρ=m/V根据定义,在SI中,单位是千克每立方米(kg/m3),量纲为ML-3.(2)表观密度多孔固体(颗粒或粉末)材料质量与其表现体积(包括“孔隙”的体积)之比值.(3)实际密度多孔固体材料...
  • 该开关电容变换器结合了最近几年研究的单桥臂开关电容变换器和直流开关电容变换器的特点和优点,能够工作在直流和交流2种电流模式下,具有体积小、效率高和功率密度大等优点。运用PWM波对功率开关管进行驱动,电路结构...
  • 一种用于可视化矢量值体积数据的工具,最近在医学成像(例如,3D + 时间、多模式采集)中得越来越普遍。 该函数接受 4D 矩阵,允许用户交互式选择要显示的第 4 维组件。 特定组件的 3D 体积显示在具有三个正交平面...
  • 该开关电容变换器结合了最近几年研究的单桥臂开关电容变换器和直流开关电容变换器的特点和优点,能够工作在直流和交流2种电流模式下,具有体积小、效率高和功率密度大等优点。运用PWM波对功率开关管进行驱动,电路结构...
  • 全息纠缠密度

    2020-04-18 12:55:24
    我们考虑条形或球形子区域与系统其余部分之间的EE,并将“纠缠密度”(ED)定义为因变形而导致的EE的变化除以子区域的体积。 使用上面的变形CFT,我们展示了ED对条带宽度或球半径L的依赖性如何用于表征物质的状态。...
  • 光照贴图: 除了烘焙场景时设置光照贴图大小的设置之外,场景中的静态网格体同样拥有光照贴图分辨率,并且根据模型大小的不同各自光照贴图分辨也不同。...如果是开发游戏,选择关闭此功能,将会使内存开销得非常
  • 随着煤体变质程度增大其视密度呈现先变大变小的变化规律,这和煤体变质程度与微孔体积、孔隙度、吸附能力变化规律相吻合 ;每个煤样在相同的水分、粒径 、成型压力和围岩压力下对其视密度测定2次,对测定结果进行...
  • Blender体积

    千次阅读 2021-03-03 17:21:24
    2.给cube赋予材质——添加“原理化体积”节点——体积音量相连——密度一些0.005,可以调整颜色来烘托不同的气氛——雾蒙蒙的感觉 第二种 1.添加一个平面 2.给平面赋予“自发光”材质——连接“体积”——...
  • BETA401Z多功能真密度及孔隙度分析仪仪器外观图如下:仪器型号:BETA401ZBETA401Z是一款同时可以精确分析比表面积及孔隙度、以及真密度和开孔/闭孔率的高精度仪器。产品类别:物理分析仪性能参数:1.测试方法:借助于...
  • 1.概率密度函数的估计方法参数估计:已知概率密度函数形式,用样本估计参数->最大似然估计+贝叶斯估计 在指定的一类函数中选择一个函数作为对位置函数的估计非参数估计:未知密度函数形式或不符合分布模型,用...
  • 概率密度及其在信号方面的简单理解1. 上篇1.1 离散随机变量与连续型随机变量1.2 离散随机变量与概率分布1.2.1 概率函数1.2.2 概率分布1.2.3 概率分布函数1.3 连续型随机变量与概率密度2. 下篇2.1 概率密度函数与通信...
  • [图形学] 实时体积云(Horizon: Zero Dawn)

    万次阅读 多人点赞 2019-04-17 18:41:56
    游戏中的实时体积云通常会降低质量来提升性能。其中最成功的方法仅限于低空蓬松和半透明的层状云。我们提出了一种体积解决方案,可以填充天空,具有不断变化的逼真效果,描绘了高海拔卷云和所有主要的底层云类型,...
  • 有人认为物体受热时体积增大,分子间的平均距离变大,由于要克服分子引力做功,所以分子势能要增大;但是有些物质具有反常膨胀性质。在反常膨胀时,物体温度升高,而体积减小,分子间的平均距离减小,分子引力做正功...
  • 脑部MRI图像灰白质分割以及体积测量方法

    万次阅读 热门讨论 2018-05-28 19:28:02
    一, 研究背景脑组织形态学研究是临床...比如,通过人体小脑体积的变化来诊断癫痫、人体海马体体积的变化来诊断帕金森(PD)或者阿尔兹海默(AD)等。本文主要以海马体体积测量为例对现在的脑部体积测量方法进行...
  • 前两天,以前的一位师兄问我关于核密度分析的问题,好久没拾起ArcGIS了,顿时眼前一片空白,于是打开软件,研究了一下,在这里做一下总结,以便对这个感兴趣的人可以参考一下。(PS:偶只是个学了七到八年GIS的小小白...
  • 理解概率密度函数

    万次阅读 多人点赞 2018-10-31 16:37:41
    概率密度函数是概率论中的核心概念之一,用于描述连续型随机变量所服从的概率分布。在机器学习中,我们经常对样本向量x的概率分布进行建模,往往是连续型随机变量。很多同学对于概率论中学习的这一抽象概念是模糊的...
  • 电源设计满足更功率密度的需要

    千次阅读 2018-03-31 09:55:37
    服用超过电源的兴趣(事业单位)、交流/直流或DC / DC,会注意到,集成化和小型化已造成影响的最近。为什么会这样? 这一简短的综述回顾一些去年的有趣的公告揭开被电源厂商的应用新进展。设计用于减少给定功率级的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,449
精华内容 3,779
关键字:

密度变小体积变大变小