標籤: USB CONNECTOR.收購3c

  • 特斯拉汽車爆發?大摩:2040年已上路車數將狂增100倍

    特斯拉汽車爆發?大摩:2040年已上路車數將狂增100倍

    摩根士丹利(Morgan Stanley、通稱大摩)看好特斯拉(Tesla Inc.)汽車銷售大爆發,估計到了2019年,全球已經上路的特斯拉電動車,將是現在的三倍之多!

    CNBC、MarketWatch等外電報導,大摩分析師Adam Jonas 26日在研究報告中樂觀預期,未來幾年,人們每一天都會在路上看到Model 3,而已上路的特斯拉電動車數量,將在2040年暴增約100倍,該公司的客服與充電設施也將面臨挑戰。

    報告估計,今(2017)年底全球已上路特斯拉電動車數量將接近30萬台,明年還將成長近80%至53.1萬台,2030年的數量會是今年底的10倍,2040年全球使用中的特斯拉電動車,更會直逼3,200萬台。Jonas說,投資界已經有好久不曾看到成長這麼高的汽車廠商。

    特斯拉稍早已宣布,要在今年將全球超級充電站(Supercharger)的數量拉高一倍,而該公司最近還在芝加哥、波士頓開設了第一批「市中心」超級充電站。

    隨著超級充電站逐步擴張,特斯拉也能蒐集到電動車上路後的諸多路況數據。Jonas預測,到了2023年或2024年,特斯拉每天應可蒐集到1億英里的資料,充實自駕和行動服務技術,提升競爭力。

    根據特斯拉9月11日發布的新聞稿,該公司將在都會區數個方便的地點,例如超市、購物中心、市中心等地,打造超級充電站,讓特斯拉車主在購買雜貨、處理雜務之際,也能輕鬆充電。

    為了滿足都會區高效率、高車流量的需求,新一代充電站可為每輛汽車快速供應72千瓦(KW )的電力,車主只要花45~50分鐘就可為汽車充飽電。特斯拉表示,新款充電站,一開始會在波士頓、芝加哥推出。

    大摩Jonas今年3月23日就曾發表研究報告指出,特斯拉為每台車安裝超級電腦後,車子安全性提升至其他車輛兩倍已經不夠看,他相信Model 3的安全度會是其他車輛的十倍之多,這會讓死亡車禍的發生機會降低90%。

    MarketWatch、Business Insider等外電報導,Jonas 3月時認為,缺少特斯拉駕車輔助科技的二手車價值將因而猛掉,未來甚至會被禁止上路。特斯拉蒐集資料的能力超群,還能將先進的安全輔助技術應用到電動車,還未推出類似科技的傳統車廠,競爭力堪虞。

    假如Model 3大獲成功、數百萬輛擁有自駕功能的車輛上路,那麼對行車安全的統計資料應有影響,這會凸顯其科技的優異程度,並迫使主管機關下令要求所有車輛都必須配備類似的系統。

    (本文內容由授權使用。圖片出處:Steve Jurvetson via Flickr CC2.0)    

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 日本車商組「大聯盟」加快EV研發,鈴木傳結盟豐田陣營

    日本車商組「大聯盟」加快EV研發,鈴木傳結盟豐田陣營

    為了加快電動車(EV)研發腳步,豐田汽車(Toyota Motor)、馬自達(Mazda Motor)以及豐田最大零件製造商Denso 於9月28日宣布成立名為「EV Common Architecture Spirit」(簡稱:EV C.A. Spirit)的電動車開發合資企業。而根據日媒最新報導指出,上述豐田主導的EV聯盟有望獲得鈴木(Suzuki)等多家日系車廠加盟。

    日經新聞30日報導,鈴木計畫加盟豐田所籌組的EV聯盟,期望藉此加快EV的研發。據報導,鈴木計畫入股豐田主導的「EV C.A. Spirit」,預估持股比重將和馬自達、Denso一樣為5%,且除了玲木之外,豐田子公司日野(Hino)以及和豐田擁有資本關係、計畫在2021年開賣EV的SUBARU也考慮加盟,大發(Daihatsu)也有可能參一咖。

    EV C.A. Spirit將開發小型車、轎車、SUV和輕型卡車電動車技術,豐田將持有90%的股份,馬自達、Denso分別擁有5%股權

    豐田、馬自達目前都還沒販售純電動轎車。日經亞洲評論28日報導,馬自達、豐田分別計畫於2019年、2020年發表量產型電動車。

    (本文內容由授權使用。圖片出處:)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 豐田看好印尼製造,將投資 20 億美元在印尼開發電動車

    豐田看好印尼製造,將投資 20 億美元在印尼開發電動車

    印尼海洋事務統籌部(Coordinating Ministry for Maritime Affairs)27 日宣布,日本豐田汽車(Toyota)計劃在未來 4 年內投資 20 億美元,在印尼開發電動車款,首先以混合動力汽車(Hybrid vehicle)為起點,以加速應對全球汽車產業的電動化浪潮。

    路透社週四報導,豐田執行董事兼社長豐田章男在聲明中表示,2019 年至 2023 年期間,將逐步增加投資對印尼的投資,總額上看 28.3 兆印尼盾(約 20 億美元)。他指出,受惠於印尼政府的政策推動,豐田將印尼視為重要的電動車投資首選地,公司將分階段逐步投資,以遵循政府的電動車發展方針。

    印尼是東南亞地區的最大經濟體,擁有豐富的鎳礦資源,這是電動車鋰電池的主要材料之一,成為吸引外國汽車製造商的拉力。此外,印尼政府先前也宣布,將給予電池和電動車製造商減稅優惠,並與其他國家簽訂關稅減免協議,積極推動電動車產業發展。

    目前印尼已是東協第二大汽車生產國,僅次於泰國。韓媒《BusinessKorea》6 月 25 日報導,受中國車市步入寒冬和產能嚴重過剩影響,南韓現代汽車(Hyundai Motor)決定關閉位於北京郊區的北京 1 號工廠,並將生產業務從中國遷至印尼,加速打入廣大的東南亞市場。

    《新加坡商業評論》(Singapore Business Review)2 月 15 日報導,國際信評機構惠譽旗下的市場研究調查機構 Fitch Solutions 預測,印尼汽車年產量將在 2019 年達到 5.8% 的成長率,主要是源於全球電動車和 SUV 的需求不斷增加。

    除此之外,印尼汽車產量也受到菲律賓、沙烏地阿拉伯、泰國和越南等市場帶動,預估合計銷量將成長 7.8%。2017 年,上述國家佔印尼整體汽車出口比重分別為 25.7%、7.4%、13.8% 和 6.2%。

    (本文內容由 授權使用。首圖來源: CC BY 2.0)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • Android DecorView 與 Activity 綁定原理分析

    Android DecorView 與 Activity 綁定原理分析

    一年多以前,曾經以為自己對 View 的添加显示邏輯已經有所了解了,事後發現也只是懂了些皮毛而已。經過一年多的實戰,Android 和 Java 基礎都有了提升,是時候該去看看 DecorView 的添加显示。

    概論

    Android 中 Activity 是作為應用程序的載體存在,代表着一個完整的用戶界面,提供了一個窗口來繪製各種視圖,當 Activity 啟動時,我們會通過 setContentView 方法來設置一個內容視圖,這個內容視圖就是用戶看到的界面。那麼 View 和 activity 是如何關聯在一起的呢 ?

     上圖是 View 和 Activity 之間的關係。先解釋圖中一些類的作用以及相關關係:

    • Activity : 對於每一個 activity 都會有擁有一個 PhoneWindow。

    • PhoneWindow :該類繼承於 Window 類,是 Window 類的具體實現,即我們可以通過該類具體去繪製窗口。並且,該類內部包含了一個 DecorView 對象,該 DectorView 對象是所有應用窗口的根 View。
    • DecorView 是一個應用窗口的根容器,它本質上是一個 FrameLayout。DecorView 有唯一一個子 View,它是一個垂直 LinearLayout,包含兩個子元素,一個是 TitleView( ActionBar 的容器),另一個是 ContentView(窗口內容的容器)。

    • ContentView :是一個 FrameLayout(android.R.id.content),我們平常用的 setContentView 就是設置它的子 View 。

    • WindowManager : 是一個接口,裏面常用的方法有:添加View,更新View和刪除View。主要是用來管理 Window 的。WindowManager 具體的實現類是WindowManagerImpl。最終,WindowManagerImpl 會將業務交給 WindowManagerGlobal 來處理。
    • WindowManagerService (WMS) : 負責管理各 app 窗口的創建,更新,刪除, 显示順序。運行在 system_server 進程。

    ViewRootImpl :擁有 DecorView 的實例,通過該實例來控制 DecorView 繪製。ViewRootImpl 的一個內部類 W,實現了 IWindow 接口,IWindow 接口是供 WMS 使用的,WSM 通過調用 IWindow 一些方法,通過 Binder 通信的方式,最後執行到了 W 中對應的方法中。同樣的,ViewRootImpl 通過 IWindowSession 來調用 WMS 的 Session 一些方法。Session 類繼承自 IWindowSession.Stub,每一個應用進程都有一個唯一的 Session 對象與 WMS 通信。

    DecorView 的創建 

    先從 Mainactivity 中的代碼看起,首先是調用了 setContentView;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    該方法是父類 AppCompatActivity 的方法,最終會調用 AppCompatDelegateImpl 的 setContentView 方法:

    // AppCompatDelegateImpl  
    public void setContentView(int resId) { this.ensureSubDecor(); ViewGroup contentParent = (ViewGroup)this.mSubDecor.findViewById(16908290); contentParent.removeAllViews(); LayoutInflater.from(this.mContext).inflate(resId, contentParent); this.mOriginalWindowCallback.onContentChanged(); }

    ensureSubDecor 從字面理解就是創建 subDecorView,這個是根據主題來創建的,下文也會講到。創建完以後,從中獲取 contentParent,再將從 activity 傳入的 id xml 布局添加到裏面。不過大家注意的是,在添加之前先調用 removeAllViews() 方法,確保沒有其他子 View 的干擾。

        private void ensureSubDecor() {
            if (!this.mSubDecorInstalled) {
                this.mSubDecor = this.createSubDecor(); 
                ......
            }
            ......
        }        

     最終會調用 createSubDecor() ,來看看裏面的具體代碼邏輯:

     private ViewGroup createSubDecor() {
            // 1、獲取主題參數,進行一些設置,包括標題,actionbar 等 
            TypedArray a = this.mContext.obtainStyledAttributes(styleable.AppCompatTheme);
            if (!a.hasValue(styleable.AppCompatTheme_windowActionBar)) {
                a.recycle();
                throw new IllegalStateException("You need to use a Theme.AppCompat theme (or descendant) with this activity.");
            } else {
                if (a.getBoolean(styleable.AppCompatTheme_windowNoTitle, false)) {
                    this.requestWindowFeature(1);
                } else if (a.getBoolean(styleable.AppCompatTheme_windowActionBar, false)) {
                    this.requestWindowFeature(108);
                }
    
                if (a.getBoolean(styleable.AppCompatTheme_windowActionBarOverlay, false)) {
                    this.requestWindowFeature(109);
                }
    
                if (a.getBoolean(styleable.AppCompatTheme_windowActionModeOverlay, false)) {
                    this.requestWindowFeature(10);
                }
    
                this.mIsFloating = a.getBoolean(styleable.AppCompatTheme_android_windowIsFloating, false);
                a.recycle();
                // 2、確保優先初始化 DecorView
                this.mWindow.getDecorView();
                LayoutInflater inflater = LayoutInflater.from(this.mContext);
                ViewGroup subDecor = null;
                // 3、根據不同的設置來對 subDecor 進行初始化
                if (!this.mWindowNoTitle) {
                    if (this.mIsFloating) {
                        subDecor = (ViewGroup)inflater.inflate(layout.abc_dialog_title_material, (ViewGroup)null);
                        this.mHasActionBar = this.mOverlayActionBar = false;
                    } else if (this.mHasActionBar) {
                        TypedValue outValue = new TypedValue();
                        this.mContext.getTheme().resolveAttribute(attr.actionBarTheme, outValue, true);
                        Object themedContext;
                        if (outValue.resourceId != 0) {
                            themedContext = new ContextThemeWrapper(this.mContext, outValue.resourceId);
                        } else {
                            themedContext = this.mContext;
                        }
    
                        subDecor = (ViewGroup)LayoutInflater.from((Context)themedContext).inflate(layout.abc_screen_toolbar, (ViewGroup)null);
                        this.mDecorContentParent = (DecorContentParent)subDecor.findViewById(id.decor_content_parent);
                        this.mDecorContentParent.setWindowCallback(this.getWindowCallback());
                        if (this.mOverlayActionBar) {
                            this.mDecorContentParent.initFeature(109);
                        }
    
                        if (this.mFeatureProgress) {
                            this.mDecorContentParent.initFeature(2);
                        }
    
                        if (this.mFeatureIndeterminateProgress) {
                            this.mDecorContentParent.initFeature(5);
                        }
                    }
                } else {
                    if (this.mOverlayActionMode) {
                        subDecor = (ViewGroup)inflater.inflate(layout.abc_screen_simple_overlay_action_mode, (ViewGroup)null);
                    } else {
                        subDecor = (ViewGroup)inflater.inflate(layout.abc_screen_simple, (ViewGroup)null);
                    }
    
                    if (VERSION.SDK_INT >= 21) {
                        ViewCompat.setOnApplyWindowInsetsListener(subDecor, new OnApplyWindowInsetsListener() {
                            public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
                                int top = insets.getSystemWindowInsetTop();
                                int newTop = AppCompatDelegateImpl.this.updateStatusGuard(top);
                                if (top != newTop) {
                                    insets = insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), newTop, insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom());
                                }
    
                                return ViewCompat.onApplyWindowInsets(v, insets);
                            }
                        });
                    } else {
                        ((FitWindowsViewGroup)subDecor).setOnFitSystemWindowsListener(new OnFitSystemWindowsListener() {
                            public void onFitSystemWindows(Rect insets) {
                                insets.top = AppCompatDelegateImpl.this.updateStatusGuard(insets.top);
                            }
                        });
                    }
                }
    
                if (subDecor == null) {
                    throw new IllegalArgumentException("AppCompat does not support the current theme features: { windowActionBar: " + this.mHasActionBar + ", windowActionBarOverlay: " + this.mOverlayActionBar + ", android:windowIsFloating: " + this.mIsFloating + ", windowActionModeOverlay: " + this.mOverlayActionMode + ", windowNoTitle: " + this.mWindowNoTitle + " }");
                } else {
                    if (this.mDecorContentParent == null) {
                        this.mTitleView = (TextView)subDecor.findViewById(id.title);
                    }
    
                    ViewUtils.makeOptionalFitsSystemWindows(subDecor);
                    ContentFrameLayout contentView = (ContentFrameLayout)subDecor.findViewById(id.action_bar_activity_content);
                    ViewGroup windowContentView = (ViewGroup)this.mWindow.findViewById(16908290);
                    if (windowContentView != null) {
                        while(windowContentView.getChildCount() > 0) {
                            View child = windowContentView.getChildAt(0);
                            windowContentView.removeViewAt(0);
                            contentView.addView(child);
                        }
    
                        windowContentView.setId(-1);
                        contentView.setId(16908290);
                        if (windowContentView instanceof FrameLayout) {
                            ((FrameLayout)windowContentView).setForeground((Drawable)null);
                        }
                    }
                    // 將 subDecor 添加到 DecorView 中
                    this.mWindow.setContentView(subDecor);
                    contentView.setAttachListener(new OnAttachListener() {
                        public void onAttachedFromWindow() {
                        }
    
                        public void onDetachedFromWindow() {
                            AppCompatDelegateImpl.this.dismissPopups();
                        }
                    });
                    return subDecor;
                }
            }
        }
                        

    上面的代碼總結來說就是在做一件事,就是創建 subDecor。攤開來說具體如下:

    1、根據用戶選擇的主題來設置一些显示特性,包括標題,actionbar 等。

    2、根據不同特性來初始化 subDecor;對 subDecor 內部的子 View 進行初始化。

    3、最後添加到 DecorView中。

    添加的具體代碼如下:此處是通過調用 

     // AppCompatDelegateImpl   this.mWindow.getDecorView();
    
     // phoneWindow    public final View getDecorView() {
            if (mDecor == null || mForceDecorInstall) {
                installDecor();
            }
            return mDecor;
        }
     
    
    private void installDecor() {
            mForceDecorInstall = false;
            if (mDecor == null) {
     // 生成 DecorView             mDecor = generateDecor(-1);
                mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
                mDecor.setIsRootNamespace(true);
                if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) {
                    mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);
                }
            } else {
     // 這樣 DecorView 就持有了window             mDecor.setWindow(this);
            }
          ......
    }
    
    
       protected DecorView generateDecor(int featureId) {
            // System process doesn't have application context and in that case we need to directly use // the context we have. Otherwise we want the application context, so we don't cling to the // activity.
            Context context;
            if (mUseDecorContext) {
                Context applicationContext = getContext().getApplicationContext();
                if (applicationContext == null) {
                    context = getContext();
                } else {
                    context = new DecorContext(applicationContext, getContext());
                    if (mTheme != -1) {
                        context.setTheme(mTheme);
                    }
                }
            } else {
                context = getContext();
            }
            return new DecorView(context, featureId, this, getAttributes());
       }

    到此,DecorView 的創建就講完了。可是我們似乎並沒有看到 DecorView 是被添加的,什麼時候對用戶可見的。

     WindowManager

    View 創建完以後,那 Decorview 是怎麼添加到屏幕中去的呢?當然是 WindowManager 呢,那麼是如何將 View 傳到 WindowManager 中呢。

    看 ActivityThread 中的 handleResumeActivity 方法:

    // ActivityThread
    public
    void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) { ...... final int forwardBit = isForward ? WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0; // If the window hasn't yet been added to the window manager, // and this guy didn't finish itself or start another activity, // then go ahead and add the window. boolean willBeVisible = !a.mStartedActivity; if (!willBeVisible) { try { willBeVisible = ActivityManager.getService().willActivityBeVisible( a.getActivityToken()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } if (r.window == null && !a.mFinished && willBeVisible) { r.window = r.activity.getWindow(); View decor = r.window.getDecorView(); decor.setVisibility(View.INVISIBLE); ViewManager wm = a.getWindowManager(); WindowManager.LayoutParams l = r.window.getAttributes(); a.mDecor = decor; l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION; l.softInputMode |= forwardBit; ...... if (a.mVisibleFromClient) { if (!a.mWindowAdded) { a.mWindowAdded = true; wm.addView(decor, l); } else { // The activity will get a callback for this {@link LayoutParams} change // earlier. However, at that time the decor will not be set (this is set // in this method), so no action will be taken. This call ensures the // callback occurs with the decor set. a.onWindowAttributesChanged(l); } } // If the window has already been added, but during resume // we started another activity, then don't yet make the // window visible. } else if (!willBeVisible) { if (localLOGV) Slog.v(TAG, "Launch " + r + " mStartedActivity set"); r.hideForNow = true; } // Get rid of anything left hanging around. cleanUpPendingRemoveWindows(r, false /* force */); // The window is now visible if it has been added, we are not // simply finishing, and we are not starting another activity. if (!r.activity.mFinished && willBeVisible && r.activity.mDecor != null && !r.hideForNow) { if (r.newConfig != null) { performConfigurationChangedForActivity(r, r.newConfig); if (DEBUG_CONFIGURATION) { Slog.v(TAG, "Resuming activity " + r.activityInfo.name + " with newConfig " + r.activity.mCurrentConfig); } r.newConfig = null; } if (localLOGV) Slog.v(TAG, "Resuming " + r + " with isForward=" + isForward); WindowManager.LayoutParams l = r.window.getAttributes(); if ((l.softInputMode & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != forwardBit) { l.softInputMode = (l.softInputMode & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)) | forwardBit; if (r.activity.mVisibleFromClient) { ViewManager wm = a.getWindowManager(); View decor = r.window.getDecorView(); wm.updateViewLayout(decor, l); } } r.activity.mVisibleFromServer = true; mNumVisibleActivities++; if (r.activity.mVisibleFromClient) {           // 這裏也會調用addview r.activity.makeVisible(); } } r.nextIdle = mNewActivities; mNewActivities = r; if (localLOGV) Slog.v(TAG, "Scheduling idle handler for " + r); Looper.myQueue().addIdleHandler(new Idler()); }

    上面的代碼主要做了以下幾件事:

    1、獲取到 DecorView,設置不可見,然後通過 wm.addView(decor, l) 將 view 添加到 WindowManager;

    2、在某些情況下,比如此時點擊了輸入框調起了鍵盤,就會調用 wm.updateViewLayout(decor, l) 來更新 View 的布局。

    3、這些做完以後,會調用 activity 的  makeVisible ,讓視圖可見。如果此時 DecorView 沒有添加到 WindowManager,那麼會添加。 

    // Activity
    void makeVisible() { if (!mWindowAdded) { ViewManager wm = getWindowManager(); wm.addView(mDecor, getWindow().getAttributes()); mWindowAdded = true; } mDecor.setVisibility(View.VISIBLE); }

     接下來,看下 addview 的邏輯。 WindowManager 的實現類是 WindowManagerImpl,而它則是通過 WindowManagerGlobal 代理實現 addView 的,我們看下 addView 的方法:

    // WindowManagerGlobal  
     public void addView(View view, ViewGroup.LayoutParams params,
                Display display, Window parentWindow) {
               // ......
        
                root = new ViewRootImpl(view.getContext(), display);
                view.setLayoutParams(wparams);
    
                mViews.add(view);
                mRoots.add(root);
                mParams.add(wparams);
               // do this last because it fires off messages to start doing things
                try {
                    root.setView(view, wparams, panelParentView);
                } catch (RuntimeException e) {
                    // BadTokenException or InvalidDisplayException, clean up.
                    if (index >= 0) {
                        removeViewLocked(index, true);
                    }
                    throw e;
                } 
    }

    在這裏,實例化了 ViewRootImpl 。同時調用 ViewRootImpl 的 setView 方法來持有了 DecorView。此外這裏還保存了 DecorView ,Params,以及 ViewRootImpl 的實例。

    現在我們終於知道為啥 View 是在 OnResume 的時候可見的呢。

     ViewRootImpl

    實際上,View 的繪製是由 ViewRootImpl 來負責的。每個應用程序窗口的 DecorView 都有一個與之關聯的 ViewRootImpl 對象,這種關聯關係是由 WindowManager 來維護的。

    先看 ViewRootImpl 的 setView 方法,該方法很長,我們將一些不重要的點註釋掉:

       /**
         * We have one child
         */
        public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
            synchronized (this) {
                if (mView == null) {
                    mView = view;
                    ......
                   
                    mAdded = true;
                    int res; /* = WindowManagerImpl.ADD_OKAY; */
    
                    // Schedule the first layout -before- adding to the window
                    // manager, to make sure we do the relayout before receiving
                    // any other events from the system.
    
                    requestLayout();
                    ......
                }
            }
        }

    這裏先將 mView 保存了 DecorView 的實例,然後調用 requestLayout() 方法,以完成應用程序用戶界面的初次布局。

     public void requestLayout() {
            if (!mHandlingLayoutInLayoutRequest) {
                checkThread();
                mLayoutRequested = true;
                scheduleTraversals();
            }
        }

    因為是 UI 繪製,所以一定要確保是在主線程進行的,checkThread 主要是做一個校驗。接着調用 scheduleTraversals 開始計劃繪製了。

    void scheduleTraversals() {
            if (!mTraversalScheduled) {
                mTraversalScheduled = true;
                mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
                mChoreographer.postCallback(
                        Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
                if (!mUnbufferedInputDispatch) {
                    scheduleConsumeBatchedInput();
                }
                notifyRendererOfFramePending();
                pokeDrawLockIfNeeded();
            }
        }

    這裏主要關注兩點:

    mTraversalBarrier : Handler 的同步屏障。它的作用是可以攔截 Looper 對同步消息的獲取和分發,加入同步屏障之後,Looper 只會獲取和處理異步消息,如果沒有異步消息那麼就會進入阻塞狀態。也就是說,對 View 繪製渲染的處理操作可以優先處理(設置為異步消息)。

    mChoreographer: 編舞者。統一動畫、輸入和繪製時機。也是這章需要重點分析的內容。

    mTraversalRunnable :TraversalRunnable 的實例,是一個Runnable,最終肯定會調用其 run 方法:

    final class TraversalRunnable implements Runnable {
            @Override
            public void run() {
                doTraversal();
            }
        }

    doTraversal,如其名,開始繪製了,該方法內部最終會調用 performTraversals 進行繪製。

      void doTraversal() {
            if (mTraversalScheduled) {
                mTraversalScheduled = false;
                mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
    
                if (mProfile) {
                    Debug.startMethodTracing("ViewAncestor");
                }
    
                performTraversals();
    
                if (mProfile) {
                    Debug.stopMethodTracing();
                    mProfile = false;
                }
            }
        }

    到此,DecorView 與 activity 之間的綁定關係就講完了,下一章,將會介紹 performTraversals 所做的事情,也就是 View 繪製流程。 

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 豐田衝刺燃料電池車,傳產能將擴增至 10 倍以上

    豐田衝刺燃料電池車,傳產能將擴增至 10 倍以上

    日刊工業新聞 3 日,豐田汽車(Toyota)計劃於 2020 年將燃料電池車(FCV)月產能提高至 3,000 台,將達現行的 10 倍以上水準。豐田計劃在 2020 年下半推出 FCV 車「MIRAI」的次代車款。

    據報導,豐田目前利用元町工廠的專用產線生產「MIRAI」,年產能約 3,000 台,依此換算月產能相當於 250 台左右。

    2018 年 MIRAI 全球銷售量約 2,400 台,而豐田目標在 2020 年以後將 FCV 年銷售量提高至 3 萬台以上水準。

    截至台灣時間 3 日上午 10 點 21 分為止,豐田下跌 0.84%。

    豐田於 2018 年 5 月 24 日宣布,為了因應計劃在 2020 年以後將 FCV 全球年銷售量提高至 3 萬台以上水準的目標,決議將增產 FCV 關鍵零件,計劃在愛知縣豐田市的本社工廠廠區內興建新廠房、增產燃料電池堆(Fuel Cell stack),且也計劃在愛知縣三好市的下山工廠內增設用來儲存氫燃料的高壓氫氣槽專用產線。上述新廠預計於 2020 年左右啟用。

    (本文內容由 授權使用。首圖來源: CC BY 2.0)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • JVM 問題排查和性能優化常用的 JDK 工具

    JVM 問題排查和性能優化常用的 JDK 工具

    JDK 提供了一系列用於監控、診斷 Java 進程的工具,它們在 JDK 安裝目錄的 bin 目錄下,有 jps、jcmd、jstack、jinfo、jmap 等。其中jmc、jconsole、jvisualvm 是 GUI 工具,其他大部分都是命令行工具。

    cd $JAVA_HOME/bin
    ls

    本篇只是個入門介紹,不涉及深入分析。每一個工具都有它專門的作用,掌握使用方法只是很簡單的入門階段,更重要的是根據工具得到的信息去分析系統存在的問題以及性能瓶頸,每一個工具的使用和分析都可以單獨成文。

    jps

    如果你用過 Linux,那肯定熟悉 ps 命令,用來查看進程列表的。jps 就好比是 ps 命令的子集,它查詢的是當前用戶下已經啟動的 Java 進程。這是進行線上問題排查的大門鑰匙,有了它才能下手後面的動作。

    下面是 jps 的幫助文檔

    usage: jps [-help]
           jps [-q] [-mlvV] [<hostid>]
    
    Definitions:
        <hostid>:      <hostname>[:<port>]

    一般的用法是 jps -l,前面一列显示 pid,後面一列显示進程名稱。

    還可以用下列參數查看更具體的 Java 進程信息,用法為 jps -lv

    jstack

    查看 Java 進程內當前時刻的線程快照,也就是每條線程正在執行的方法棧情況,用於定位線程停頓、死鎖等長時間等待的問題。

    以下是 jstack 的幫助文檔。

    Usage:
        jstack [-l] <pid>
            (to connect to running process)
        jstack -F [-m] [-l] <pid>
            (to connect to a hung process)
        jstack [-m] [-l] <executable> <core>
            (to connect to a core file)
        jstack [-m] [-l] [server_id@]<remote server IP or hostname>
            (to connect to a remote debug server)
    
    Options:
        -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
        -m  to print both java and native frames (mixed mode)
        -l  long listing. Prints additional information about locks
        -h or -help to print this help message
    

    最常用的就是 jstack -pid 或者 jstack -l pid,打印線程狀態、棧使用情況。

    如果是線上查看不方便的話,可以用命令 jstack -l pid > stack.log,輸出到文件中下載到本地查看。

    jstack -m pid,打印 Java 和 Native 棧信息

    如果 -l 和 -m 都不起作用的時候,可以使用 java -F pid 強制 dump。

    jinfo

    它的主要作用是查看 JVM 配置參數,還可以動態設置部分參數值。jinfo 使用時需要 attach 到目標 JVM 上。關於 attach jvm 可以點擊查看

    使用 jinfo -h查看幫助文檔

    Usage:
        jinfo [option] <pid>
            (to connect to running process)
        jinfo [option] <executable <core>
            (to connect to a core file)
        jinfo [option] [server_id@]<remote server IP or hostname>
            (to connect to remote debug server)
    
    where <option> is one of:
        -flag <name>         to print the value of the named VM flag
        -flag [+|-]<name>    to enable or disable the named VM flag
        -flag <name>=<value> to set the named VM flag to the given value
        -flags               to print VM flags
        -sysprops            to print Java system properties
        <no option>          to print both of the above
        -h | -help           to print this help message

    jinfo -flags pid

    查看 JVM 參數,其中 Non-default VM flags 是虛擬機默認設置的參數,Command line 是用戶指定的參數,比如命令行啟動 jar 包的時候加上的參數。

    jinfo -flag 參數名 pid

    可以查看指定參數的值,比如查看堆的最大值(-XX:MaxHeapSize 也就是 -Xmx ):

    jinfo -flag MaxHeapSize 92041
    
    -XX:MaxHeapSize=20971520

    jinfo -sysprops pid

    查看系統參數

    jinfo pid

    查看 jvm 參數和系統參數

    以上信息,如果我們用過 visualVM 等監控工具,一定非常熟悉。另外,我之前做過一個 ,也實現了這個功能。

    另外,還可以修改部分參數值。

    jinfo -flag [+|-] pid

    jinfo -flag = pid

    可以修改部分 JVM 參數。

    前者可以修改布爾值參數,比如開啟簡單 GC 日誌

    jinfo -flag +PrintGC 92041

    後者是設置非布爾值參數的,比如設置 HeapDumpPath

    jinfo -flag HeapDumpPath=/users/fengzheng/jvmlog

    哪些參數是允許動態修改的呢,用下面這個命令可以查看

    #Linux 和 Mac 
    java -XX:+PrintFlagsInitial | grep manageable
    
    #windows
    java -XX:+PrintFlagsInitial | findstr manageable

    jmap

    jmap 查看給定進程、核心文件、遠程調試服務器的共享對象內存映射和堆內存細節的工具,可查看堆使用情況、堆內對象直方圖、加載類、生成堆快照等。

    Usage:
        jmap [option] <pid>
            (to connect to running process)
        jmap [option] <executable <core>
            (to connect to a core file)
        jmap [option] [server_id@]<remote server IP or hostname>
            (to connect to remote debug server)
    
    where <option> is one of:
        <none>               to print same info as Solaris pmap
        -heap                to print java heap summary
        -histo[:live]        to print histogram of java object heap; if the "live"
                             suboption is specified, only count live objects
        -clstats             to print class loader statistics
        -finalizerinfo       to print information on objects awaiting finalization
        -dump:<dump-options> to dump java heap in hprof binary format
                             dump-options:
                               live         dump only live objects; if not specified,
                                            all objects in the heap are dumped.
                               format=b     binary format
                               file=<file>  dump heap to <file>
                             Example: jmap -dump:live,format=b,file=heap.bin <pid>
        -F                   force. Use with -dump:<dump-options> <pid> or -histo
                             to force a heap dump or histogram when <pid> does not
                             respond. The "live" suboption is not supported
                             in this mode.
        -h | -help           to print this help message
        -J<flag>             to pass <flag> directly to the runtime system

    jmap -heap pid

    打印 JVM 堆概要信息,包括堆配置、新生代、老生代信息

    jmap -histo pid

    打印類的直方圖,也就是各個類實例的個數和空間佔用情況。

    如果加 :live,jamp -histo:live pid 則只打印活動類的信息。這個命令會出發 GC 動作,會導致 JVM 停頓,所以在線上環境要慎用。

    jmap -dump

    dump 當前 JVM 堆,一般用法如下:

    #dump 所有對象在堆中的分佈情況
    jmap -dump:format=b,file=/Users/fengzheng/jvmlog/jamp_dump.hprof 95463
    
    #加:live 參數 dump 存活對象在隊中的分佈情況
    jmap -dump:live,format=b,file=/Users/fengzheng/jvmlog/jamp_dump.hprof 95463

    之後再用堆分析工具,比如 visualVM、JProfile、MAT 等進行分析。和我們設置

    -XX:+HeapDumpOnOutOfMemoryError 參數后,在發生 OOM 的時候 dump 的堆信息是一樣的。

    注意,dump 的過程會比較慢,在這個過程中會發生 JVM 停頓,而且在使用 :live 參數后,會觸發 GC 操作。

    jmap -clstats pid

    Java 類加載器(ClassLoader)信息,包括加載器名稱、已加載類個數、佔用空間、父加載器、是否存活、類型信息。

    jmap -finalizerinfo pid

    查看等待被回收的對象。

    jstat

    jstat 主要用來通過垃圾回收相關信息來判斷 JVM 性能問題,也可以查看類加載、編譯的情況,主要的用法是通過持續的固定時間間隔的輸出來觀察。比如每 3 秒打印一次 GC 回收次數,連續打印 10 次,通過動態的變化來觀察 GC 是否過於密集。

    下面是 jstat 的幫助手冊。

    Usage: jstat -help|-options
           jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    
    Definitions:
      <option>      An option reported by the -options option
      <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                         <lvmid>[@<hostname>[:<port>]]
                    Where <lvmid> is the local vm identifier for the target
                    Java virtual machine, typically a process id; <hostname> is
                    the name of the host running the target Java virtual machine;
                    and <port> is the port number for the rmiregistry on the
                    target host. See the jvmstat documentation for a more complete
                    description of the Virtual Machine Identifier.
      <lines>       Number of samples between header lines.
      <interval>    Sampling interval. The following forms are allowed:
                        <n>["ms"|"s"]
                    Where <n> is an integer and the suffix specifies the units as 
                    milliseconds("ms") or seconds("s"). The default units are "ms".
      <count>       Number of samples to take before terminating.
      -J<flag>      Pass <flag> directly to the runtime system.

    通過 jstat -options 可以看到 jstat 支持查看哪些信息。

    $ jstat -options
    -class  #類加載情況 加載個數和空間使用
    -compiler #即時編譯器信息
    -gc  # GC情況 包括 young gc、full gc 次數、時間等
    -gccapacity #年輕代、老年代的使用情況
    -gccause #GC 統計信息和回收原因
    -gcmetacapacity #显示有關metaspace大小的統計信息
    -gcnew #新生代 GC 統計
    -gcnewcapacity #新生代內存統計
    -gcold #老年代 GC 統計
    -gcoldcapacity #老年代內存使用情況
    -gcutil #GC 匯總信息
    -printcompilation #編譯方法統計

    上述這些大多數可以對應到 visualVM 的這一部分显示

    示例用法,如下是打印 5301 進程下的垃圾回收情況,-h 3 表示每 3 行輸出一次標題信息,3s 5 表示每 3s 輸出一次,一共輸出 5 次

    jstat -gcutil -h 3 5301 3s 5

    最後輸出的內容如下:

    jstat -gcutil -h 3 5301 3s 5
      S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
     99.92   0.00  11.90  35.29  94.96  94.08     34   12.675     3    1.946   14.621
     99.92   0.00  11.90  35.29  94.96  94.08     34   12.675     3    1.946   14.621
     99.92   0.00  11.90  35.29  94.96  94.08     34   12.675     3    1.946   14.621
      S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
     99.92   0.00  11.94  35.29  94.96  94.08     34   12.675     3    1.946   14.621
     99.92   0.00  11.94  35.29  94.96  94.08     34   12.675     3    1.946   14.621

    jcmd

    jcmd 會將命令發送給 JVM。這些命令包括用於控制 Java Flight Recording(飛行記錄)、診斷命令等。 必須運行在 JVM 本地,不能遠程使用,並且必須用 JVM 啟動用戶執行。

    通過 jps 命令找到一個 JVM 進程,然後使用下面的代碼可以看到 jcmd 支持的命令

    #進程 5173 
    jcmd 5173 help 
    
    5173:
    The following commands are available:
    JFR.stop
    JFR.start
    JFR.dump
    JFR.check
    VM.native_memory
    VM.check_commercial_features
    VM.unlock_commercial_features
    ManagementAgent.stop
    ManagementAgent.start_local
    ManagementAgent.start
    GC.rotate_log
    Thread.print
    GC.class_stats
    GC.class_histogram
    GC.heap_dump
    GC.run_finalization
    GC.run
    VM.uptime
    VM.flags
    VM.system_properties
    VM.command_line
    VM.version
    help

    基本包含了問題排查的常用命令,並且和上面介紹的幾個工具有部分重合。

    通過命令 jcmd 5173 help GC.heap_dump 可以查詢到 GC.heap_dump 命令的使用方法,其他命令都可以通過這個方法找到使用說明

    jcmd 5173 help GC.heap_dump
    5173:
    GC.heap_dump
    Generate a HPROF format dump of the Java heap.
    
    Impact: High: Depends on Java heap size and content. Request a full GC unless the '-all' option is specified.
    
    Permission: java.lang.management.ManagementPermission(monitor)
    
    Syntax : GC.heap_dump [options] <filename>
    
    Arguments:
        filename :  Name of the dump file (STRING, no default value)
    
    Options: (options must be specified using the <key> or <key>=<value> syntax)
        -all : [optional] Dump all objects, including unreachable objects (BOOLEAN, false)

    然後通過如下代碼就可以 dump 堆信息下來了,和 jmap -dump 的作用一樣

    jcmd 5173 GC.heap_dump /Users/fengzheng/jvmlog/jcmd_heap_dump.hprof

    拋磚引玉就到此了,之後會對 jinfo、jmap、jstack、jstat、jcmd 做詳細說明,記得關注啊。

    相關閱讀:

    歡迎關注,不定期更新本系列和其他文章
    古時的風箏 ,進入公眾號可以加入交流群

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • Facebook改進換臉術:無需“投喂”圖片,從視頻里直接變臉

    Facebook改進換臉術:無需“投喂”圖片,從視頻里直接變臉

      曉查 發自 凹非寺 
      量子位 報道 公眾號 QbitAI

      近兩年來,Deepfakes 讓許多歐美明星吃盡了苦頭,面對自己的頭像被替換到各種視頻中,卻無能為力。

      比如黑寡婦就對自己的臉被替換到小電影中感到很無奈,呼籲大家停止用 AI 作惡。

      而最近,Facebook 人工智能研究院讓換臉技術再次進化。

      過去 Deepfakes 這項技術需要很多準備材料:一是被替換人臉的原視頻,二是來自換臉人面部各個角度的照片。有這兩樣東西才能造出完美無暇的換臉視頻。

      而來自 Facebook 的技術不需要照片,可以從原視頻直接生成換臉視頻,甚至能對實時視頻進行換臉。

      它讓“大表姐”變得不再熟悉。 

      這項技術的換臉實際上是毫無違和感地修改五官特徵,好讓 AI 無法識別出,因此也就不需要照片了。

      而且 Facebook 的研究人員還表示,這項技術修改后的明星臉仍然可以被人識別出來,但是 AI 卻不行。 

      Facebook 研發這項技術可不是為了換臉好玩,最近因使用人臉識別技術飽受爭議,這家公司希望通過這項新技術來保護用戶的隱私。

      人臉識別和換臉技術對普通民眾的隱私也造成了很大的威脅。比如前一陣大熱的換臉應用 ZAO,讓每個人都享受到換臉帶來的樂趣,但同時也會收集用戶圖片。

      研究人員在論文摘要中說:“人臉識別可能會導致隱私丟失,而換臉技術可能會被用於製作誤導性視頻。”Facebook 用後者來去除視頻中的隱私信息。

      Facebook 聲稱,該技術屬於業內首創,足以抵禦複雜的人臉識別系統。

      Facebook 將在下周韓國首爾舉行的國際計算機視覺國際會議(ICCV)上介紹該工作。

      本周,Facebook 還聯合微軟和亞馬遜,提供 Deepfakes 換臉挑戰數據集,希望能夠提高識別換臉視頻算法的魯棒性,以控制假視頻的傳播。

      此舉頗有些以彼之矛攻彼之盾的意味。

      原文鏈接:

      https://venturebeat.com/2019/10/25/facebook-alters-video-to-make-people-invisible-to-facial-recognition/

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 是什麼觸發了宇宙大爆炸?

    是什麼觸發了宇宙大爆炸?


    圖片來源:Christine Daniloff, MIT, ESA/Hubble and NASA

      1.

      根據大爆炸理論,我們的宇宙誕生於 138 億年前,從一個無限小的緻密“火球”,不斷地擴張膨脹,並慢慢冷卻。漸漸地,宇宙中形成了第一批恆星、星系,以及我們如今所見到的所有形式的物質。

      物理學家相信,就在大爆炸將宇宙推向不斷膨脹的進程之前,早期宇宙還經歷了另一個更具爆炸性的階段——宇宙暴脹。這個過程持續的時間不到萬億分之一秒,但膨脹的速度卻是以指數級增長的。  


    Guth 的筆記

      上個世紀 80 年代,物理學教授 Alan Guth 首次提出了宇宙膨脹理論,該理論預測宇宙最初是一個極微小的物質點,其大小可能只有質子的千億分之一。這個點中充滿了超高能物質,能量非常之大,以至於內部的壓力產生了一種排斥性的引力——這就是暴脹背後的驅動力。就像火花之於引信一樣,這種引力以前所未有的速度將新生的宇宙向外推,在不到萬億分之一秒的時間內,使宇宙膨脹到接近原始大小的 10²⁷倍。

      許多天文觀測結果都支持了大爆炸和宇宙暴脹理論。但是,這是兩個截然不同的過程,科學家們一直難以理解其中一個是如何緊隨另一個之後出現的。

      在一項新的研究中,物理學家詳細地模擬了早期宇宙中一個可能連接了宇宙暴脹和大爆炸的中間階段。這個階段被稱為“再熱”,這一過程出現在宇宙暴脹末期和大爆炸開始之前的階段,將暴脹產生的冷的、均勻的物質轉變成超熱的、複雜的物質湯。

      論文的作者David Kaiser說:“后暴脹再熱時期為大爆炸創造了條件,在某種意義上,是它啟動了‘爆炸’,正是在這個橋樑時期,所有的事物都開始鬆動,物質的行為變得非常複雜。”

      2.

      對於這個連接了宇宙暴脹和大爆炸的橋樑階段,研究人員很好奇它最初會是什麼樣子。

      Kaiser 說:“再熱的最初階段應該用共振來標記。一種高能物質佔據主導地位,它在廣闊的空間中與自身同步來回擺動,導致爆炸式地產生新的粒子。但這種行為不會永遠持續下去,一旦它開始將能量轉移到另一種形式的物質上,它自身的擺動將在空間中變得更加起伏不平。我們想要測量的是,需要多長的時間共振效應才會破裂,產生的粒子才會彼此分散並且達到某種熱平衡,讓人想起大爆炸發生時的情況。”

      他們的計算機模擬中展示了一個很大的晶格,在這個晶格上,他們繪製了多種形式的物質,並追蹤了當某些條件被改變時,能量和分佈會如何隨之在空間和時間上發生變化。模擬的初始條件是基於一個特定的暴脹模型而設置的,這個模型是一組關於早期宇宙的物質分佈在宇宙暴脹期間的行為得到一系列預測。

      他們之所以選擇這一特定的暴脹模型,是因為它的預測與高精度的宇宙微波背景測量結果非常吻合。

      3.

      在模擬中,他們研究了兩種可能在暴脹期間佔主導地位的物質的行為,這些物質與希格斯玻色子非常相似。

      在進行模擬之前,研究人員對模型中的引力描述進行了一個微小的調整。我們如今看到的普通物質在引力下的作用應正如愛因斯坦廣義相對論中所預測的那樣;但在更高的能量下,比如在宇宙暴脹期間,物質的行為或許會略有不同,與之產生相互作用的引力是由量子力學修正過的。

      在廣義相對論中,引力的強度被表示為一個常數,物理學家稱之為是最小耦合,這意味着,無論一個特定粒子的能量為何,它都會以一個由普適常數所設定的強度對引力效應做出反應。

      然而,在宇宙暴脹的高能量下,物質與引力的相互作用會以一種更為複雜的方式進行。而量子力學效應預測,當與超高能物質發生相互作用時,引力的強度在空間和時間中會發生變化,這是一種被稱為非最小耦合的現象。

      研究人員將這一個非最小耦合項納入了他們的暴脹模型中,並觀察了物質和能量的分佈是如何隨着量子效應的漲落變化的。

      最後他們發現,量子修正過的引力效應對物質的影響越強,宇宙就會越快地從暴脹中寒冷、均勻的物質過渡到更熱、更多樣的大爆炸過程中特有的物質。

      “再熱是一個瘋狂的過程,一切都不受控制。我們發現,當時物質之間的相互作用非常強烈,以至於它可以相應地快速放鬆下來,為大爆炸創造了合適的條件。我們以前並不知道會是這個樣子,但這些都是我們用已知的物理學從模擬中得出的結論。這正是讓我們興奮的地方。”

      對於新的發現,其他物理學家認為,關於造成了暴脹階段的提議有數百種,但從暴脹階段到所謂的‘熱大爆炸’之間的過渡卻是人們最不了解的部分,而這篇論文則通過包含多個獨立的場和複雜的動力學在模型中精確地模擬后暴脹階段,開闢了新的領域。這是極具挑戰性的數值模擬,併為研究早期的宇宙非線性動力學提供了最新的技術。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

  • Gogoro Network 拆分成為獨立事業體,聚焦電池交換與能源管理

    Gogoro Network 拆分成為獨立事業體,聚焦電池交換與能源管理

    Gogoro 於開放式 Gogoro Network 智慧電池交換平台上,發展出多款電動機車於市場上熱賣,進一步帶動合作夥伴包括 YAMAHA、宏佳騰、PGO 開發出 Powered by Gogoro Network 電動機車。在 Gogoro Network 提供的電池交換模式即將邁向服務 20 萬名用戶之際,Gogoro 22 日宣布將 Gogoro Network 獨立成全新事業體,更加專注於開放式智慧電池交換平台以及智慧移動服務上。

    Gogoro Network 智慧電池交換平台以電池交換為主、充電為輔的模式,翻轉了過去電動機車充電時間漫長的現象。從 2015 年以來,全台購買電動機車的消費者逾 95% 的車主選擇以「電池交換」為基礎的電動車。Gogoro Network 在其雙軌並行的模式下,僅約 1% 左右的車主加購,也證明電池交換是電動機車車主補充動力能源的主流方式。目前 Gogoro Network 平台已累計突破 4,400 多萬次的電池交換次數,平均每日交換次數高達 10 萬餘次。

    Gogoro 發展出「Powered by Gogoro Network」,讓可在 Gogoro 電控系統、智慧電池、電池交換平台等基礎上開發電動機車,其中 YAMAHA 日前正式推出新款電動機車 ,與 PGO 摩特動力也預計在今年下半年接續發表新車。

    Gogoro Network 涵蓋了電動機車解決方案的 4 大關鍵要素:

    雲端基礎設施

    Gogoro Network 整合了 AI 人工智慧、機器學習等技術,創造了新一代智慧電池交換平台。搭配 24 小時 Network Operation Center(NoC)雲端網路管理中心,是全球最穩定、具規模的電池交換系統。

    GoStation 電池交換站

    車主於城市中隨處可見 GoStation 電池交換站點進行交換電池,目前 Gogoro Network 於全台灣的電池交換站,包括即將啟用的站點已突破 1,292 站,合作夥伴包括中油、台塑等直營或加盟加油站逾 390 站,7-ELEVEN、全家、全聯、萊爾富等超商逾 400 站,還有桃園市政府停車場、台北捷運等政府單位逾 100 站。預計年底前,全台將達 1,500 站電池交換站,在人口密集的都會區,車主平均騎車 3 分鐘就有一座電池交換站。

    Gogoro Network 智慧電池

    Gogoro 採用的智慧電池結合了多項突破性專利技術,在安全與效能方面均領先業界;此外,智慧電池具備完善的自我防護機制,可持續更新、優化並且執行電池健康診斷。從今年 7 月底開始,Gogoro Network 也將逐步投放採用 21700 電池芯的,與特斯拉(Tesla)使用的電芯同級,車主們將有機會交換到性能提升達 27%、比競品多出 2.8 倍電力容量的電池,騎乘里程數可達 170 公里。

    Gogoro Network App

    不僅在基礎建設等硬體方面,也透過 、 平台全新推出《Gogoro Network》App,引領用戶迅速且輕鬆地找到最近的電池交換站,並且隨時進行電池服務資費方案變更、疑難排除以及帳務管理,更能查詢歷史騎乘紀錄,這種一站式的解決方案可以確保 Gogoro Network 用戶獲得最多與最有價值的資訊。

    升任 Gogoro Network 總經理的潘璟倫表示,Gogoro Network 是目前全球最大的智慧電池交換平台,接下來除了持續專注於智慧電池技術的提升,並透過人工智慧優化電池交換服務以及電池交換站步局以外,也將全力支援更多合作夥伴開發 Powered by Gogoro Network 智慧電動機車,也將開發更多以此平台與電池技術為基礎的創新服務型態。

    (合作媒體:。圖片來源:Gogoro)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    收購3c,收購IPHONE,收購蘋果電腦-詳細收購流程一覽表

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※高價收購3C產品,價格不怕你比較

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • TrendForce:油電混合車已成為國際趨勢,中國電動車發展優勢也將朝向多元化

    TrendForce:油電混合車已成為國際趨勢,中國電動車發展優勢也將朝向多元化

    受惠於中國新版新能源車積分制度以及歐、美、日等市場規模擴大,油電混合動力車的市場商機備受關注。TrendForce 綠能研究(EnergyTrend)預估,2019 年全球油電混合車市占將達 5%,相較之下,全球純電動乘用車僅 2%。

    TrendForce 資深研究經理呂理舜指出,中國政府於六月份宣布了新的積分制度,油電混合車的積分重要性大幅提升。原先油電混合車在中國一律視為傳統車輛,不具有積分資格,但在新制度下,開始具有積分點數的市場價值。另外,福斯汽車(Volkswagen)也宣布 2020 年旗下主流車款將開始導入油電混合系統,讓電池產業的觸角從中高階車款往大眾化車款拓展。在電動車仍需克服充電環境的基礎建設問題時,傳統汽油車已開始掀起混合動力平價化的風潮。

    混合動力市場目前分為兩大主流,分別是以歐洲為主的輕混/微混(Mild/Micro Hybrid),以及日系車廠為首的強混合動力(Strong Hybrid)。以各國發展來看,混合動力市場主要的驅動力還是來自於逐年加嚴的排放法規。針對 48V 微混系統,歐洲預計 2020~2021 年將全面實施二氧化碳排放量不得超過 95g/km 的嚴苛限制,尤其是銷量較多的中型主流車款。

    歐洲因為導入油電混合動力系統的速度較慢,在專利與成本都不具優勢的情況下,選擇以汽油車為主要架構,搭配改動較少的微混/輕混合動力形式,來達成最基本的排放標準要求,並有效控制動力系統的改動成本。目前油電混合動力系統已經逐步推展至主流車款。

    至於日本主要是以全混合動力為主。日本會形成以強混乃至於插電油電混合車(PHEV))為主的市場,主因在於開發投入較早,讓整體車輛成本能夠維持在中價位。此外,隨著電池價格下滑,日本車廠逐漸從鎳氫電池逐漸轉往鋰電池,加上充電環境改善,近來積極將部分強混合動力引導至插電油電混合系統。

    中國近年來也開始重視汽油車節油率,中國政府規劃 2015 年至 2020 年平均油耗從 6.9 降至 5 L/100km,新能源車將成為滿足油耗和排放需求的關鍵。中國發展新能源車已久,然而受到補貼金額的引導,大多以純電動車為主。TrendForce 認為,混合動力將成為歐、美、日本市場的主力車種,成長速度也將超過純電動車,而中國是否能在新版積分制度的推動下跟上混合動力潮流,也將是 2019 年至 2020 年的關注焦點。

    油電混合車整體電池用量成長近五成,車廠將優先採用鋰電池

    以電池系統來看,雖然部分車廠已開發出 12V 或 48V 的微混動力系統,但是 48V 設計可以往上支援到輕度混合動力,整體電池設計仍會保留 12V 電池,負載較大時才會轉換成 48V 來驅動,例如空調壓縮機。混合動力車輛若為 12V 以上的電壓系統,可以選擇鉛酸電池與鋰電池。鉛酸電池成本較低但空間占比較高,TrendForce 觀察,為實現輕型化設計,針對 12V 以上電壓系統,車廠大多會優先採用鋰電池。在 12V 以上油電混合車持續成長的帶動下,2019 年油電混合車整體電池用量(鋰電與鎳氫電池,不含 12V 鉛酸)將達 10.68GWh,較去年成長 49%。

    [ 分析師:  ]

    報告綱要

    IT電池的趨勢

    3Q19 高分子電池芯價格持續下滑
    中國開始成為 IT 電池主要供應地
    貿易戰電池產業搬遷成本過高
    轉戰新興國家對於電池價格要求更嚴苛
    電池芯供應鏈板塊不因貿易戰而有所改變

    新能源汽車市場

    中美貿易戰開啟整車與零組件產業洗牌
    HEV 滲透率不受整體汽車需求量下降影響
    純電動車與油電混合車都是新能源車推廣目標
    環境與感測器的建立將逐步落實電力消耗的預測
    彈性的電價可影響充電習慣進而創造新的商業模式

    HEV 系統架構與市場

    輕度混合的不同類型比較
    以電機位置為例來區分混合動力類型
    P0/ PHEV 市占率將快速提升
    節油率隨著電池容量與電機功率增加
    HEV 市場逐漸朝向 PHEV 發展
    48V 系統開始推升鋰電池需求
    HEV 高功率輸出對鋰電池有利
    HEV 電池的價格與壽命需求更有利於鋰電池
    2019 年 PHEV 電池需求高於 HEV

    Contact US

    Taipei:
    Grace Li
    graceli@trendforce.com
    +886-2-8978-6488 ext. 916
    Eric Chang
    eric.chang@trendforce.com
    +886-2-8978-6488 ext. 822
    Paula Peng
    paulapeng@trendforce.com
    +886-2-8978-6488 ext. 820

    ShenZhen:
    Perry Wang
    perrywang@trendforce.cn
    +86-755-8283-8931 ext.6800
    +86-13825284100(微信同號)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    收購3c,收購IPHONE,收購蘋果電腦-詳細收購流程一覽表

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※高價收購3C產品,價格不怕你比較

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!