動不動9速10速,變速箱真的是擋位越多越好?

但是那樣的路段少之又少,在城市裡面幾乎用不上。為什麼會導致現在這樣尷尬的局面呢。其實現在回頭看市面上搭載9速卻很難用上第9擋的車型大多數小排量車型,因為廠家把9速拿來就是為了宣傳低油耗,但是最後搭配了一個不足以配合9AT的發動機,自由光就是這個反面教材,而像奔馳的GLE400,同樣是9AT,卻可以在80公里時速就輕鬆掛上第9擋,發動機的轉速還很低。

如果要在幾年前和你談十速變速箱,你可能以為我和你說的某台貨車

而現實是謳歌RLX已經搭載了10速變速箱

甚至已經為3離合11速變速箱申請專利

搞得大家沒有個8AT都不好意思出門

在過去很長一段時間里,特別是4AT還大行其道的時候,的確存在這樣一個現象,擋數越高就意味着更高的傳動效率、更好的燃油經濟性、更平順的動力輸出、更爽快的加速體驗,這些不假!

但是現在真實的情況是消費者被一些車商洗腦了,讓大家脫離汽車本身,專註於變速箱去了。像目前6、7速變速箱仍然是大眾的主力變速箱,而且據了解在未來很長一段時間內都不會更換,寶馬也已確定8AT變速箱已基本是終極。 而奔馳通過模擬分析后得出的結論,無需再開發9擋以上的變速度箱,甚至斷言檔數到達9擋以上后,就會成為發動機的累贅,雖然如此果斷的觀點不太妥當,畢竟奔馳打臉的事情也沒少干,最近復活直六發動機的事情也算其中之一吧。

但是之前的實例像Jeep的自由光

它是全球第一台搭載橫置9AT變速箱的車,廠家曾把它的9AT吹得天化亂墜,最後用戶們發現這玩意跟期待中的完全不是那麼一回事,但卻因為它花了大價錢。雖然也有些車主說自由光的9AT也有用到9擋的時候,據統計大多數是在下坡的高速公路路段。但是那樣的路段少之又少,在城市裡面幾乎用不上。

為什麼會導致現在這樣尷尬的局面呢?

其實現在回頭看市面上搭載9速卻很難用上第9擋的車型大多數小排量車型,因為廠家把9速拿來就是為了宣傳低油耗,但是最後搭配了一個不足以配合9AT的發動機,自由光就是這個反面教材,而像奔馳的GLE400,同樣是9AT,卻可以在80公里時速就輕鬆掛上第9擋,發動機的轉速還很低。

所以這個掛不上第9擋的鍋,現在來說不一定是變速箱來背,這就像什麼呢,你去買衣服,明明是140的身高,但是一想190的和140的價格一樣,布料卻更多,買190的比較划算,所以就買了一個並不合身的衣服,布料是賺到了,但是穿着好不好只有自己知道。

而且我們並不能只看變速箱這一點,而是整車動力系統的匹配,就像你女友看到你撅屁股就知道你要放屁。

放到汽車上也是一樣,變速箱更智能积極的換擋邏輯,知道你踩油門應該升擋還是降擋,發動機同時也要能配合,升到最高擋發動機轉速低時,也不會覺得發動機乏力,這些才是我們想要的。如果能夠做到這些又何必在乎它有多少個擋呢?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

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

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※推薦台中搬家公司優質服務,可到府估價

V8,懂車的男人都很想要

1秒,最高時速為250km/h(电子限速),標配的前245/35 ZR19后265/35 ZR19輪胎也能夠提供強大的抓地力,為強大的性能提供保障。配合上AMG C 63 Sedan的陶瓷通風剎車盤、後橋限滑差速器等高科技裝備,AMG C 63 Sedan的運動性得到了最好的施展空間。

作為一名汽車編輯,小編有機會試到各種高性能車型,而最讓小編沉醉的就是大排量V8發動機。

V8發動機是目前超級性能車中最常用的發動機類型,我們熟悉的許許多多的超跑和超級性能車都使用的V8發動機,比如法拉利488、邁凱輪p1等車型都使用的V8發動機,在如今小排量車型大行其道的今天,V8發動機仍然有着不可抗拒的魅力。

為什麼V8的魅力依然無可取代?

性能車到底多少個氣缸比較好?在小編看來這個最佳氣缸數非8缸不可,8缸是一個臨界點,12缸發動機雖然有着十分兇猛的動力輸出以及更好的運轉精緻度,但是巨大的尺寸和重量會嚴重影響到性能車的操控表現以及重量分配,許多搭載12缸發動機的車型都有一個嚴重的推頭問題,實際操控性能反倒不如8缸車型。

而6缸發動機先天排量不足,小排量的結構劣勢導致了6缸發動機雖然動力輸出足夠強大,但是和真正的超級性能車型相比它的動力輸出還是有不小差距,即使加上渦輪增壓或者机械增壓之後仍然不能夠表現出性能車該有的兇悍。而如果要強行壓榨動力就必須使用更大的渦輪,這樣小排量渦輪增壓車型的渦輪遲滯問題也就隨之出現了,而使用机械增壓的話效率並不高,而且高轉速的噪音比較大,机械增壓也不利於轉速的提升。

而V8發動機中做的最好的莫過於奔馳AMG,比如說奔馳AMG C 63 Sedan上那台4.0T V8雙渦輪增壓發動機,這台V8發動機尺寸和重量都比較適中,而且由於基礎排量比較大氣缸數也比較多,所以這台V8發動機動力輸出十分強勁,發動機底氣十足,即使在低轉速下也有十分恐怖的扭矩輸出,並且發動機低沉的聲浪以及換擋收油時候的“放炮聲”都十分勾魂,這樣的聲浪聽起來是一種享受。

AMG C 63 Sedan的4.0T V8發動機最大功率476馬力,最大扭矩達到了650牛米。而且發動機的最大扭矩輸出區間為1750-4500轉,寬泛的扭矩輸出平台也保證了動力隨叫隨到,提供最強大的響應性支持。

在如此強大動力的加持下AMG C 63 Sedan的0~100km/h加速時間僅需4.1秒,最高時速為250km/h(电子限速),標配的前245/35 ZR19后265/35 ZR19輪胎也能夠提供強大的抓地力,為強大的性能提供保障。

配合上AMG C 63 Sedan的陶瓷通風剎車盤、後橋限滑差速器等高科技裝備,AMG C 63 Sedan的運動性得到了最好的施展空間。奔馳的動態選檔系統也十分實用,可以說是駕馭住這款性能猛獸的神器,動態選檔系統從運動到舒適一共有5檔可以選擇,通過改變油門的響應性、轉向力度、懸挂的阻尼等實現在運動和舒適之間的平衡。

AMG三個字母是什麼含義?

AMG是頂級性能和極致駕控魅力的代名詞,AMG的造車技術登峰造極,尤其是在發動機的設計與製造上,奔馳 A45AMG上那台2.0T發動機就能夠爆出了380馬力的恐怖輸出,而AMG C 63 Sedan上的4.0T V8雙渦輪增壓發動機的輸出恐怖程度也就可想而知了,正因為奔馳AMG能夠造出輸出十分恐怖的發動機,因此我們熟悉的頂級跑車帕加尼都使用AMG提供的發動機。

AMG的歷史可以追溯到上世紀60年代;1967年6月1日,AMG雛形“AMG 設計與測試賽車發動機技術公司”誕生,從此輝煌45載AMG名聲籍甚,在高性能汽車領域AMG無人不知無人不曉,高性能與創新是AMG至死不渝的造車理念,動力、操控和聲音上AMG都追求極致,AMG致力於製造最完美的高性能汽車,因此AMG也擁有大量的忠實擁躉。

而在創新上AMG也是高性能汽車領域的先行者,1984年工程師Melcher開發了完全獨立的氣缸蓋,因此AMG成為發動機生產公司。強調一人一機理念,目前AMG已經成為擁有1100多人的公司,其中工程師就多達500位。擁有眾多技術高超的工程師和設計師的AMG也就掌握了最先進的研發力量,而AMG每一台發動機,每一台車型都有專門的工程師負責裝配和檢驗,並且在發動機上籤下工程師的名字,細緻的檢測精心的裝配,確保每一台AMG都能夠發揮它的最強勁最穩定的性能。

發動機是AMG的靈魂,也是一台性能車的靈魂,AMG C 63 Sedan代表的不僅僅是一台性能車,而是代表着性能車同級最強的表現,V8的魅力無法拒絕,而更讓人難以拒絕的是奔馳AMG C 63 Sedan的V8。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※產品缺大量曝光嗎?你需要的是一流包裝設計!

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

網頁設計最專業,超強功能平台可客製化

這SUV空間逆天動力超猛 銷量王的昂科威都怕了嗎?

在副駕駛座前方的大塊大理石紋路木板更顯高貴。冠道的內飾則是樸實無華,各方面都按部就班,難以帶來什麼越級享受。採用按鈕式擋桿,令擋桿下方可抽空放東西。由此可見,冠道的設計都是偏向實用為主。空間對比可以看得出,冠道的後座空間是如此的變態,就算乘客在後排葛優躺,恐怕也很難頂到前排。

前言冠道是本田最新推出的5座中型SUV,意欲沖高來撼動別克昂科威在這個領域的王者地位。可是,昂科威亦絕非等閑之輩,馬上降價來迎戰強敵。究竟兩大高手誰更勝一籌?下面我就列舉兩個指導價相近的車型來對比。

昂科威 2017款 28T 四驅精英型

指導價:26.99萬

優惠幅度:兩萬元左右

冠道 2017款 370TURBO 兩驅精英版

指導價:26.98萬

優惠幅度:暫本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計最專業,超強功能平台可客製化

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

※回頭車貨運收費標準

※推薦評價好的iphone維修中心

※教你寫出一流的銷售文案?

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家公司費用怎麼算?

這款歐系SUV品質好 而且20萬內配置完虐日產奇駿?

內飾設計兩台車的內飾設計都屬於乏善可陳,沒有什麼太大的亮點。不過,奇駿烤黑鋼琴漆的中控面板會更顯高級,而科雷嘉的設計則偏向於簡潔,甚至略顯可愛。乘坐空間與感受奇駿的後排奇駿的軸距2706mm,而科雷嘉的軸距則為2645mm,這就有了61mm的差距。

科雷嘉與逍客同為雷諾-日產聯盟CMF的產物,但是科雷嘉的價格已經越級去挑戰了奇駿的售價區間,那麼下面編者我就分析一下科雷嘉可否有能力挑戰奇駿的地位。首先,為了公平起見,我會拿科雷嘉的2.0L 兩驅尊貴版與奇駿的2.0L CVT舒適版 2WD來作對比,兩者售價均為19.68萬,而終端優惠都在2萬元左右,可能奇駿還能有更大一點點的優惠。

外觀設計

科雷嘉的前臉看上去很有流線感,而且很妖嬈,充滿法式浪漫。大燈處,兩個半矩形框分別把遠近光燈半包圍住,盡顯銳利。尾部則略為簡潔,僅僅是尾燈處向側面作了延伸。

奇駿的前臉用了倒梯形的設計,各處有棱有角,既具時尚,也不失陽剛之氣。整個側面相當簡練,C柱往後線條開始上揚。

動力總成

雖然兩者的發動機型號不一樣,但是各種參數均高度一致,最大輸出150馬力和200牛米。同樣地,兩款車都搭載了CVT變速箱,不過開起來就略有差異了。

科雷嘉給人的感覺是不緊不慢,踩下油門,轉速先升上去,然後車速再慢慢攀升。雖然是CVT變速箱,但模擬出了7個擋位,因此,在換擋時,能感受到變速箱的節奏感。

奇駿則與科雷嘉調性相反,油門響應很快,市區中開起來相當輕快。然而,一旦開快以後再加速,則會有多數小排量發動機存在的問題,就是光吼不走。至於CVT的匹配很好,開起來也平順,動力銜接流暢。

內飾設計

兩台車的內飾設計都屬於乏善可陳,沒有什麼太大的亮點。不過,奇駿烤黑鋼琴漆的中控面板會更顯高級,而科雷嘉的設計則偏向於簡潔,甚至略顯可愛。

乘坐空間與感受

奇駿的後排

奇駿的軸距2706mm,而科雷嘉的軸距則為2645mm,這就有了61mm的差距。進到車廂內的後排會發現奇駿的腿部空間相當富餘,不過座椅太大,包裹性略顯不足,但舒適性可以給高分,很柔軟。值得表揚的一點就是配有後座出風口。

科雷嘉的後排

科雷嘉的後排空間就不是那麼樂觀了,腿部空間尚還可以,然而座椅靠背較直,填充料較硬大大影響了乘坐舒適性。還有一點就是缺乏後座出風口,這就不太對得起次頂配這個配置了。

配置對比

奇駿用的是腳剎,而科雷嘉用的是电子駐車。而且,科雷嘉的18寸輪胎從視覺感受與抓地力上要優於奇駿的17寸輪胎,不過油耗上會略有吃虧。除此以外,科雷嘉比奇駿多出了前後排頭部氣囊和車頂行李架。其餘的配置差異,可以看下錶對比。

油耗及保養費用

鑒於動力總成上的一致性,同時整備質量也只差了十幾公斤。因此,兩台車均做出了百公里綜合油耗8.9L的好成績。

在保養費用的對比上,奇駿以6萬公里總保養費用5225元勝出,而科雷嘉的費用為6562元。奇駿送兩次保養,同時變速箱油終身免維護,而火花塞每10萬公里更換一次,這些都是它的保養費用低於科雷嘉的原因。

編者總結:

從以上對比不難看出,科雷嘉對比奇駿優勝在更時尚的外觀,以及一些配置。但是在駕駛和乘坐感受上都要遜於奇駿。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※回頭車貨運收費標準

※產品缺大量曝光嗎?你需要的是一流包裝設計!

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

※推薦評價好的iphone維修中心

※教你寫出一流的銷售文案?

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

ASP.NET Core Blazor Webassembly 之 路由

web最精妙的設計就是通過url把多個頁面串聯起來,並且可以互相跳轉。我們開發系統的時候總是需要使用路由來實現頁面間的跳轉。傳統的web開發主要是使用a標籤或者是服務端redirect來跳轉。那今天來看看Blazor是如何進行路由的。

使用@page指定組件的路由path

我們可以在Blazor里給每個組件指定一個path,當路由匹配的時候會显示這個組件。

@page "/page/a"

 <h2>
     PAGE A
 </h2>

@code {
 
}

訪問/page/a 看到Page A頁面被渲染出來了。

注意:如果是在瀏覽器里敲入url按回車切換頁面,會發生一次http請求,然後重新渲染blazor應用。

使用a標籤進行頁面跳轉

a標籤作為超鏈接是我們web開發最常用的跳轉方式,blazor同樣支持。
新建Page B

@page "/page/b"

 <h2>
     PAGE B
 </h2>

@code {
 
}

在Page A頁面添加一個a標籤進行跳轉:

@page "/page/a"

 <h2>
     PAGE A
 </h2>
<p>
    <a href="/page/b">Page B</a>
</p>

@code {
 
}

運行一下試試:

注意:使用a連接在頁面間進行跳轉不會發生http請求到後台,頁面是直接在前端渲染出來的。

通過路由傳參

通過http的url進行頁面間傳參是我們web開發的常規操作。下面我們演示下如何從Page A傳遞一個參數到Page B。我們預設Page A裏面有個UserName需要傳遞到Page B,並且显示出來。

通過path傳參

通過url傳參一般有兩種方式,一種是直接把參數組合在path里,比如“/page/b/小明”這樣。

修改Page A:

@page "/page/a"

 <h2>
     PAGE A
 </h2>
<p>
    <a href="/page/b/@userName">Page B</a>
</p>

@code {
    private string userName = "小明";
}

通過把userName組合到path上傳遞給Page B。

修改Page B:

@page "/page/b/{userName}"

 <h2>
     PAGE B
 </h2>
<p>
    userName: @userName
</p>

@code {
    [Parameter]
    public string userName { get; set; }
}

Page B 使用一個“/page/b/{userName}” pattern來匹配userName,並且userName需要標記[Parameter]並且設置為public。

通過QueryString傳參

除了把參數直接拼接在path里,我們還習慣通過QueryString方式傳遞,比如“/page/b?username=小明”。

修改Page A:

@page "/page/a"

<h2>
    PAGE A
</h2>
<p>
    <a href="/page/b?username=@userName">Page B</a>
</p>

@code {
    private string userName = "小明";
}

首先安裝一個工具庫:

Install-Package Microsoft.AspNetCore.WebUtilities -Version 2.2.0

修改Page B:

@page "/page/b"

<h2>
    PAGE B
</h2>
<p>
    userName: @UserName
</p>

@using Microsoft.AspNetCore.WebUtilities;

@inject NavigationManager NavigationManager;

@code {
    [Parameter]
    public string UserName { get; set; }


    protected override void OnInitialized()
    {
        var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
        QueryHelpers.ParseQuery(uri.Query).TryGetValue("username", out Microsoft.Extensions.Primitives.StringValues userName);
        Console.WriteLine(NavigationManager.Uri);
        UserName = userName.ToString();
        Console.WriteLine(UserName);

        base.OnInitialized();
    }
}

頁面獲取QueryString的傳參比較麻煩,Blazor並沒有進行封裝。所以我們需要通過QueryHelpers.ParseQuery方法手工把QueryString格式化成字典形式,然後獲取對應的參數。QueryHelpers類存在Microsoft.AspNetCore.WebUtilities這個庫里,需要通過nuget安裝。

NavLink

NavLink是個導航組件,它其實就是封裝了a標籤。當選中的時候,也就是當前的url跟它的href一致的時候,會自動在class上加上active類,所以可以用來控制選中的樣式。默認的3個導航菜單就是用的NavLink。

比如導航到counter的NavLink:

   <NavLink class="nav-link" href="counter">
                <span class="oi oi-plus" aria-hidden="true"></span> Counter
    </NavLink>

最後翻譯成html:

<a href="counter" class="nav-link active">
                <span class="oi oi-plus" aria-hidden="true"></span> Counter
</a>

NavigationManager

有的時候我們可能需要在代碼里進行導航,如果是JavaScript我們會用window.location來切換頁面,Blazor為我們提供了相應的封裝:NavigationManager。使用NavigationManager可以通過代碼直接進行頁面間的跳轉。我們在Page A頁面放個按鈕然後通過按鈕的點擊事件進行跳轉:

@page "/page/a"

<h2>
    PAGE A
</h2>
<p>
   <button @onclick="GoToB">
       go to B
   </button>
</p>

@inject NavigationManager NavigationManager
@code {

    private void GoToB()
    {
        NavigationManager.NavigateTo("/page/b?username=小貓");
    }

}

修改Page A的代碼,注入NavigationManager對象,通過NavigationManager.NavigateTo方法進行跳轉。

擴展Back方法

Blazor封裝的NavigationManager咋一看以為跟WPF的NavigationService一樣,我想當然的覺得裏面肯定有個Back方法可以進行後退。但是查了一番發現還真的沒有,這就比較尷尬了,沒辦法只能使用JavaScript來實現了。

為了方便我們給NavigationManager直接寫個擴展方法吧。
首先修改Program把IServiceCollection暴露出來:

    public class Program
    {
        public static IServiceCollection Services;

        public static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);
            builder.RootComponents.Add<App>("app");

            builder.Services.AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
            Services = builder.Services;

            await builder.Build().RunAsync();
        }
    }

擴展類:

  public static class Ext
    {
        public static void Back(this NavigationManager navigation)
        {
            var jsruntime = Program.Services.BuildServiceProvider().GetService<IJSRuntime>();
            jsruntime.InvokeVoidAsync("history.back");
        }
    }

這個擴展方法很簡單,從DI容器里獲取IJSRuntime的實例對象,通過它去調用JavaScript的history.back方法。

修改Page B:

@page "/page/b"

<h2>
    PAGE B
</h2>
<p>
    userName: @UserName
</p>
<p>
    <button @onclick="GoBack">
        Go back
    </button>
</p>

@using Microsoft.AspNetCore.WebUtilities;

@inject NavigationManager NavigationManager;

@code {
    [Parameter]
    public string UserName { get; set; }


    protected override void OnInitialized()
    {
        var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
        QueryHelpers.ParseQuery(uri.Query).TryGetValue("username", out Microsoft.Extensions.Primitives.StringValues userName);
        Console.WriteLine(NavigationManager.Uri);
        UserName = userName.ToString();
        Console.WriteLine(UserName);

        base.OnInitialized();
    }

    private void GoBack()
    {
        NavigationManager.Back();
    }
}

在Page B頁面上添加一個按鈕,點擊調用NavigationManager.Back方法就能回到上一頁。

總結

到此Blazor路由的內容學習的差不多了,整體上沒有什麼特別的,就是NavigationManager只有前進方法沒有後退是比較讓我震驚的。

相關內容:

ASP.NET Core Blazor Webassembly 之 數據綁定
ASP.NET Core Blazor Webassembly 之 組件
ASP.NET Core Blazor 初探之 Blazor WebAssembly
ASP.NET Core Blazor 初探之 Blazor Server

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

我去,這麼簡單的條件表達式竟然也有這麼多坑

最近,小黑哥在一個業務改造中,使用三目運算符重構了業務代碼,沒想到測試的時候竟然發生 NPE 的問題。

重構代碼非常簡單,代碼如下:

// 方法返回參數類型為 Integer
//  private Integer code;
SimpleObj simpleObj = new SimpleObj();
// 其他業務邏輯
if (simpleObj == null) {
    return -1;
} else {
    return simpleObj.getCode();
}

這段 if 判斷,小黑哥看到的時候,感覺很是繁瑣,於是使用條件表達式重構了一把,代碼如下:

// 方法返回參數類型為 Integer
SimpleObj simpleObj = new SimpleObj();
// 其他業務邏輯
return simpleObj == null ? -1 : simpleObj.getCode();

測試的時候,第四行代碼拋出了空指針,這裏代碼很簡單,顯然只有 simpleObj#getCode才有可能發生 NPE 問題。

但是我明明為 simpleObj做過判空判斷,simpleObj 對象肯定不是 null,那麼只有 simpleObj#getCode 返回為 null。但是我的代碼並沒有對這個方法返回值做任何操作,為何會觸發 NPE?

難道是又是自動拆箱導致的 NPE 問題?

在解答這個問題之前,我們首先複習一下條件表達式。

點贊再看,養成習慣。微信搜索『程序通事』,關注查看最新文章~

三目運算符

三目運算符,官方英文名稱:Conditional Operator ? :,又叫條件表達式,本文不糾結名稱,統一使用條件表達式。

條件表達式的基本用法非常簡單,它由三個操作數的運算符構成,形式為:

<表達式 1>?<表達式 2>:<表達式 3>

條件表達式的計算從左往右計算,首先需要計算計算表達式 1 ,其結果類型必須為 Booleanboolean,否則發生編譯錯誤。

當表達式 1 的結果為 true,將會執行表達式 2,否則將會執行表達式 3。

表達式 2 與表達式 3 最後的類型必須得有返回結果,即不能為是 void,若為 void ,編譯時將會報錯。

最後需要注意的是,表達式 2 與表達式 3 不會被同時執行,兩者只有一個會被執行。

踩坑案例

了解完三目運算符的基本原理,我們簡化一下開頭例子,復現一下三目運算符使用過程的一些坑。假設我們的例子簡化成如下:

boolean flag = true; //設置成true,保證表達式 2 被執行
int simpleInt = 66;
Integer nullInteger = null;

案例 1

第一個案例我們根據如下計算 result 的值。

int result = flag ? nullInteger : simpleInt;

這個案例為開頭的例子的簡化版本,運算上述代碼,將會發生 NPE 的。

為什麼會發發生 NPE 呢?

這裏可以給大家一個小技巧,當我們從代碼上沒辦法找到答案時,我們可以試試查看一下編譯之後字節碼,或許是 Java 編譯之後增加某些東西,從而導致問題。

使用 javap -s -c class 查看 class 文件字節碼,如下:

可以看到字節碼中加入一個拆箱操作,而這個拆箱只有可能發生在 nullInteger

那麼為什麼 Java 編譯器在編譯時會對表達式進行拆箱?難道所有数字類型的包裝類型都會進行拆箱嗎?

條件表達式表達式發生自動拆箱,其實官方在 「The Java Language Specification(簡稱:JLS)」15.25 節中做出一些規定,部分內容如下:

JDK7 規範

If the second and third operands have the same type (which may be the null type), then that is the type of the conditional expression.

If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T.

用大白話講,如果表達式 2 與表達式 3 類型相同,那麼這個不用任何轉換,條件表達式表達式結果當然與表達式 2,3 類型一致。

當表達 2 或表達式 3 其中任一一個是基本數據類型,比如 int,而另一個表達式類型為包裝類型,比如 Integer,那麼條件表達式表達式結果類型將會為基本數據類型,即 int

ps:有沒有疑問?為什麼不規定最後結果類型都為包裝類那?

這是 Java 語言層面一種規範,但是這個規範如果強制讓程序員執行,想必平常使用三目運算符將會比較麻煩。所以面對這種情況, Java 在編譯器在編譯過程加入自動拆箱進制。

所以上述代碼可以等同於下述代碼:

int result = flag ? nullInteger.intValue() : simpleInt;

如果我們一開始的代碼如上所示,那麼這裏錯誤點其實就很明顯了。

案例 2

接下來我們在第一個案例基礎上修改一下:

boolean flag = true; //設置成true,保證表達式 2 被執行
int simpleInt = 66;
Integer nullInteger = null;
Integer objInteger = Integer.valueOf(88);

int result = flag ? nullInteger : objInteger;

運行上述代碼,依然會發生 NPE 的問題。當然這次問題發生點與上一個案例不一樣,但是錯誤原因卻是一樣,還是因為自動拆箱機制導致。

這一次表達式 2 與表達式 3 都為包裝類 Integer,所以條件表達式的最後結果類型也會是 Integer

但是由於 result是 int 基本數據類型,好傢伙,數據類型不一致,編譯器將會對條件表達式的結果進行自動拆箱。由於結果為 null,自動拆箱將報錯了。

上述代碼等同為:

int result = (flag ? nullInteger : objInteger).intValue();

案例 3

我們再稍微改造一下案例 1 的例子,如下所示:

boolean flag = true; //設置成true,保證表達式 2 被執行
int simpleInt = 66;
Integer nullInteger = null;
Integer result = flag ? nullInteger : simpleInt;

案例 3 與案例 1 右邊部分完全相同,只不過左邊部分的類型不一樣,一個為基本數據類型 int,一個為 Integer

按照案例 1 的分析,這個也會發生 NPE 問題,原因與案例 1 一樣。

這個之所以拿出來,其實想說下,上述條件表達式的結果為 int 類型,而左邊類型為 Integer,所以這裏將會發生自動裝箱操作,將 int類型轉化為 Integer

上述代碼等同為:

Integer result = Integer.valueOf(flag ? nullInteger.intValue() : simpleInt);

案例 4

最後一個案例,與上面案例都不一樣,代碼如下:

boolean flag = true; //設置成true,保證表達式 2 被執行
Integer nullInteger = null;
Long objLong = Long.valueOf(88l);

Object result = flag ? nullInteger : objLong;

運行上述代碼,依然將會發生 NPE 的問題。

這個案例表達式 2 與表達式 3 類型不一樣,一個為 Integer,一個為 Long,但是這兩個類型都是 Number的子類。

面對上述情況,JLS 規定:

Otherwise, binary numeric promotion (§5.6.2) is applied to the operand types, and the type of the conditional expression is the promoted type of the second and third operands.

Note that binary numeric promotion performs value set conversion (§5.1.13) and may perform unboxing conversion (§5.1.8).

大白話講,當表達式 2 與表達式 3 類型不一致,但是都為数字類型時,低範圍類型將會自動轉為高範圍數據類型,即向上轉型。這個過程將會發生自動拆箱。

Java 中向上轉型並不需要添加任何轉化,但是向下轉換必須強制添加類型轉換。

上述代碼轉化比較麻煩,我們先從字節碼上來看:

第一步,將 nullInteger拆箱。

第二步,將上一步的值轉為 long 類型,即 (long)nullInteger.intValue()

第三步,由於表達式 2 變成了基本數據類型,表達式 3 為包裝類型,根據案例 1 講到的規則,包裝類型需要轉為基本數據類型,所以表達式 3 發生了拆箱。

第四步,由於條件表達式最後的結果類型為基本數據類型:long,但是左邊類型為 Object,這裏就需要把 long 類型裝箱轉為包裝類型。

所以最後代碼等同於:

Object result = Long.valueOf(flag ? (long)nullInteger.intValue() : objLong.longValue());

總結

看完上述四個案例,想必大家應該會有種感受,沒想到這麼簡單的條件表達式,既然暗藏這麼多「殺機」。

不過大家也不用過度害怕,不使用條件表達式。只要我們在開發過程重點注意包裝類型的自動拆箱問題就好了,另外也要注意條件表達式的計算結果再賦值的時候自動拆箱引發的 NPE 的問題。

最好大家在開發過程中,都遵守一定的規範,即保持表達式 2 與表達式 3 的類型一致,不讓 Java 編譯器有自動拆箱的機會。

建議大家沒事經常看下阿里出品的『Java 開發手冊』,在最新的「泰山版」就增加條件表達式的這一節規範。

ps:公號消息回復:『開發手冊』,獲取最新版的 Java 開發手冊。

最後一定要做好的單元測試,不要慣性思維,覺得這麼簡單的一個東西,看起來根本不可能出錯的。

參考

  1. Java 開發手冊-泰山版
  2. 《Java 開發手冊》解讀:三目運算符為何會導致 NPE?

歡迎關注我的公眾號:程序通事,獲得日常乾貨推送。如果您對我的專題內容感興趣,也可以關注我的博客:studyidea.cn

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

※回頭車貨運收費標準

C#中的Singleton模式

目錄

  • 前言
  • 實現思路
  • 實現方法
    • 最簡單的實現方法
    • 如果多線程亂入?
    • 線程安全的單例模式
      • Lock版本
      • 靜態構造器版本
      • Lazy版本
  • 總結

前言

Singleton是二十三個設計模式中比較重要也比較經常使用的模式。但是這個模式雖然簡單,實現起來也會有一些小坑,讓我們一起來看看吧!

實現思路

首先我們看看這個設計模式的UML類圖。

很清晰的可以看到,有三點是需要我們在實現這個模式的時候注意的地方。

  • 私有化的構造器
  • 全局唯一的靜態實例
  • 能夠返回全局唯一靜態實例的靜態方法

其中,私有化構造器是防止外部用戶創建新的實例而靜態方法用於返回全局唯一的靜態實例供用戶使用。原理清楚了,接下來我們看看一些典型的實現方式和其中的暗坑。

實現方法

最簡單的實現方法

最簡單的實現方法自然就是按照UML類圖直接寫一個類,我們看看代碼。

    class Program
    {
        static void Main(string[] args)
        {
        	var single1 = Singleton.Instance;
            var single2 = Singleton.Instance;
            Console.WriteLine(object.ReferenceEquals(single1, single2));
            Console.ReadLine();
        }
    }

    class Singleton
    {
        private static Singleton _Instance = null;
        private Singleton()
        {
            Console.WriteLine("Created");
        }

        public static Singleton Instance
        {
            get
            {
                if (_Instance == null)
                {
                    _Instance = new Singleton();
                }
                return _Instance;
            }
        }

        public void DumbMethod()
        {

        }
    }

這段代碼忠實的實現了UML類圖裡面的一切,查看輸出結果,

證實了Singleton確實起了作用,多次調用僅僅產生了一個實例,似乎這麼寫就可以實現這個模式了。但是,真的會那麼簡單嗎?

如果多線程亂入?

現在我們給剛剛的例子加點調料,假設多個對實例的調用,並不是簡單的,彬彬有禮的順序關係,二是以多線程的方式調用,那麼剛剛那種實現方法,還能從容應對嗎?讓我們試試。把Main函數裏面的調用改成這樣。

	static void Main(string[] args)
        {
            int TOTAL = 10000;
            Task[] tasks = new Task[TOTAL];
            for (int i = 0; i < TOTAL; i++)
            {
                tasks[i] = Task.Factory.StartNew(() =>
                {
                    Singleton.Instance.DumbMethod();
                });
            }
			Task.WaitAll(tasks);
            Console.ReadLine();
        }

通過Factory創造出1萬個Task,幾乎同時去請求這個單例,看看輸出。

咦,我們剛剛寫的Singleton模式失效了,這個類被創造了5次(這段代碼運行多次,這個数字不一定相同),一定是多線程搞的鬼,我們剛剛寫的代碼沒有辦法應對多線程,換句話說,是非線程安全的(thread-safe),那有沒有辦法來攻克這個難關呢?

線程安全的單例模式

Lock版本

提到線程安全,很多同學第一反應就是用lock,不錯,lock是個可行的辦法,讓我們試試。添加一個引用類型的對象作為lock對象,修改代碼如下(什麼?你問我為什必須是引用類型的對象而不能是值類型的對象?因為lock的時候,如果對象是值類型,那麼lock僅僅鎖住了它的一個副本,另外一個線程可以暢通無阻的再次lock,這樣lock就失去了阻塞線程的意義)

	private static object _SyncObj = new object();
        public static Singleton Instance
        {
            get
            {
                lock (_SyncObj)
                {
                    if (_Instance == null)
                    {
                        _Instance = new Singleton();
                    }
                    return _Instance;
                }                
            }
        }

運行一下,輸出

只有一個實例創建,證明Lock起作用了,這個模式可行!不過有些不喜歡用Lock的同學可能要問,還有沒有其他辦法呢?答案是有的。

靜態構造器版本

回想一下,C#中的類靜態構造器,只會在這個類第一次被使用的時候調用一次,天然的線程安全,那我們試試不用Lock使用類靜態構造器?修改Singleton類如下:

    class Singleton
    {
        private static Singleton _Instance = null;
        private Singleton()
        {
            Console.WriteLine("Created");
        }

        static Singleton()
        {
            _Instance = new Singleton();
        }

        //private static object _SyncObj = new object();
        public static Singleton Instance
        {
            get { return _Instance; }
        }

        public void DumbMethod()
        {

        }
    }

去掉了Lock,添加了一個類靜態構造器,試一試。

完美!對於不喜歡用Lock(在這個例子中,實例只會創建一次但是之後的所有線程都要先排隊Lock再進入Critical code進行檢查,效率比較低下)的同學,類靜態構造器提供了一種很好的選擇。
不過俗話說,人心苦不足 , 我們總是追求卓越。這個版本比Lock版本似乎更好一點,那還有沒有更好的版本呢?有的。

Lazy版本

從net 4.0開始,C#開始支持延遲初始化,通過Lazy關鍵字,我們可以聲明某個對象為僅僅當第一次使用的時候,再初始化,如果一直沒有調用,那就不初始化,省去了一部分不必要的開銷,提升了效率。如果你不熟悉Lazy或者想更多了解它,請參考。我們今天關注的重點在於,Lazy也是天生線程安全的,所以我們嘗試用它來實現Singleton模式?修改代碼如下:

    class Singleton
    {
        private static Lazy<Singleton> _Instance = new Lazy<Singleton>(() => new Singleton());
        private Singleton()
        {
            Console.WriteLine("Created");
        }

        public static Singleton Instance
        {
            get
            {
                return _Instance.Value;
            }
        }

        public void DumbMethod()
        {

        }
    }

輸出結果中可以看到,我們達到了想要的效果:

在上面的代碼中,私有變量_Instance現在是被聲明為延遲初始化,這樣不但天然實現了線程安全,同時在沒有調用Instance靜態方法的時候(也即沒有調用_Instance.Value),初始化不會發生,這樣就提高了效率。

總結

Singleton模式很常見,實現起來也很簡單,只是要小心線程安全。以上三種方法都可以實現線程安全的Singleton模式。如果net 版本在4.0之上,建議使用Lazy版本,畢竟對比Lock版本,Lazy版本可以免去實現手動Lock之苦,對比Static版本,又有延遲初始化的性能優勢,何樂而不為呢?

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

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

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

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

小米11 虐機耐用性測試,究竟能通過一連串嚴苛考驗嗎?

在 YouTube 的知名虐機頻道 JerryRigEverything 上個月才回顧完 2020 年智慧型手機耐用獎,而 2021 年目前為止已發表的旗艦新機中,不久前才在中國以外市場進行全球發表的小米11 ,這次也不意外在 JerryRigEverything 進行一連串的虐機耐用性測試,未來小米11 也有機會在不久後引進台灣市場販售,對於未來有意入手的消費者不妨能將這次測試作為購買前的參考依據。

小米11 虐機耐用性測試,究竟能通過一連串嚴苛考驗嗎?

小米於 2020 年底在中國發表首款搭載高通 Snapdragon 888 旗艦手機小米11 ,也很快在本月 8 日「小米11 全球線上發佈會」正式在國際市場推出,後續也將在台灣登場。
在國際市場發表後, YouTube 以嚴苛耐用性測試著名的 JerryRigEverything 日前也釋出了小米11 虐機耐用性測試影片,其中小米11 螢幕升級為 6.81 吋 WQHD+ 解析度、120Hz TrueColor AMOLED 四曲面螢幕,加上螢幕玻璃則採用康寧最新大猩猩玻璃 Gorilla Glass Victus 保護,官方抗摔性相較前代提升 1.5倍、耐刮性能提升 2 倍,至於在實測下來如何呢?就讓 JerryRigEverything 帶著大家看下去吧!

小米11 不僅盒裝標配軟質的手機保護套,出廠時也預先貼上螢幕保護貼,讓小米11 用戶能省下一筆保護貼的開銷,也同時為手機能有螢幕有基礎保護。不過既然要測試耐用性,還是得將原廠的保護貼給卸下:

按照慣例在手機螢幕上貼上寫著數字的標籤,接著莫氏硬度標準進行測試:

小米11 的螢幕玻璃採用康寧大猩猩玻璃 Victus ,不過實測下來與之前像是採用超瓷晶盾面板的 iPhone 12 系列,或其他數十款智慧型手機沒有太大差別,耐刮程度仍為第 6 級開始出現刮痕,接著在第 7 級開始會出現更深的刮痕:

小米11 在邊框則採用電鍍工藝的 7000系鋁合金邊框,不過在銳利的刀片的刮過還是留下明顯痕跡:

至於機身背面,小米11 之前在中國版推出時分為 AG工藝的玻璃材質或皮質質感的聚碳酸酯塑料材質,不過先前在小米11 國際版僅有玻璃材質可選擇。不過機身背面的玻璃在美工刀這類物品劃過並未留下刮痕:

主相機鏡頭部份也順利通過考驗:

後來也針對小米11 進行了耐火測試,但小米11 並未像是之前採用超瓷晶盾面板的 iPhone 12 系列那般令人意外強大,最終在打火機燃燒後還是留下因熱量讓顯示面板的像素損壞的痕跡:

最後,也針對小米11 進行彎曲測試,所幸還是輕易地通過考驗沒有被扳彎。

完整測試影片

 

圖片/消息來源: JerryRigEverything(YouTube)

延伸閱讀:
小米11 國際版正式發表:盒裝標配 55W GaN 氮化鎵充電器、售價約 25,150 元

小米11 骨牌挑戰影片!以 4100支成功完成挑戰

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

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

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

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

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※回頭車貨運收費標準

小米11 Ultra 實機動手玩影片流出!配備 120x 變焦相機和副螢幕

在本月 25 日 Redmi K40 系列才要發表,也外傳小米接下來在不久後也會發表多款小米11 系列新機,其中也包括最大尺寸、規格最旗艦的小米11 Ultra 。稍早,在 YouTube 頻道 Tech Buff PH 聲稱取得兩款尚未發表的「小米11 Ultra」手機,也讓小米11 Ultra 就這樣突如其來其然的被提前曝光!

小米11 Ultra 實機動手玩影片流出!配備 120x 變焦相機和副螢幕

日前小米才剛在「小米11 全球線上發佈會」正式在國際市場率先在歐洲推出小米11 標準版後,也傳聞小米11 系列有望推出多款新機,包括小米11 Lite 、小米11 Pro 和小米11 Ultra 。稍早有名菲律賓 YouTuber Tech Buff PH 豪不客氣地直接搶先洩密聲稱取得分別為白色和黑色的兩款小米11 Ultra 實機,儘管無法完全確認這次洩漏的真實性,不過各方面透露的資訊可信度確實相當高。

在機身背面顯示的型號為 M2102K1G ,與最近通過印度 BIS 和歐盟 EEC 認證的小米裝置相吻合。

根據 Tech Buff PH 的描述,小米11 Ultra 硬體規格方面除了支持高螢幕更新率螢幕、搭載 Qualacomm Snapdragon 888 旗艦行動平台,內建 5000mAh 大容量電池快速充電支持小米三重快充技術,分別為 67W 有線快充、67W 無線快充以及 10W 無線反向充電。

螢幕方面,小米11 Ultra 同樣配備 6.81 吋 WQHD+ 解析度、120Hz 更新率的 TrueColor AMOLED 四曲面螢幕,螢幕採用孔洞式設計並配備 2000 萬像素前置自拍相機,螢幕表面也比照小米11 覆蓋康寧最新 Gorilla Glass Victus 大猩猩玻璃保護。

另外,從影片多角度也顯示這款手機預載 MIUI 12.5 Global 版本,或許這次也不像是去年小米10 Ultra(小米10 至尊紀念版)僅限於中國市場販售,終於要將小米旗艦系列最高規的機種推向國際市場。

至於相機也是小米11 Ultra 最具辨識度的設計重點,畢竟在機身背面橫向排列著如此龐大具有凸起的相機模組,內部容納了三鏡頭主相機和一個小型的副螢幕:

根據他的說明,小米11 Ultra 主相機配備 5000 萬像素主鏡頭、 4800 萬像素超廣角鏡頭和 4800 萬像素潛望式望遠變焦鏡頭所組成,在相機上文字顯示「120X Ultra Pixel AI Camera」可得知小米11 Ultra 相機擁有著 120X 變焦、 12-120mm 等效焦距,不過目前尚無法得知光學變焦的倍率為何。

小米11 Ultra 機身背面主相機位置除了擁有碩大的鏡頭,另一側則搭載微型的副螢幕設計,即便目前無法得知該顯示器的規格、尺寸尺寸看似也不大,但實用性或許比大家想像中來得高呀!因為這塊小型的副螢幕並非只能顯示新訊息、未接來電這種通知類的內容,
,從 Tech Buff PH 的動手玩影片我們能看到他可以顯示小米11 Ultra 主螢幕的完整畫面,甚至是開啟瀏覽器或各種應用程式都沒問題。

當然,這塊副螢幕最主要的目的並非是用來觀看手機螢幕的整個畫面,主要的用途還是用於輔助用戶進行自拍照片或影片。筆者認為,小米11 Ultra 之所以能顯示整個主螢幕的原因在於,許多用戶在自拍時並不會使用系統內建的相機 App ,而是使用這種自己慣用的美顏 App ,那麼這樣的設計就顯得相當貼心了。

小米11 Ultra 採用四曲面機身設計,機身中框比照去年小米10 Ultra 的模式改為不鏽鋼材質,也毫無意外配備 Harman Kardon 專業調音的雙立體揚聲器系統,小米11 Ultra 提供影院級音效體驗。其他方面,小米11 Ultra 當然也支持 IP68 防水等級。

最後,即便現階段無法證實 Tech Buff PH 影片洩漏的小米11 Ultra 外觀以及透露的規格配置是否屬為真,以及小米11 Ultra 何時才會發表,不過根據先前微博的爆料指出小米11 Ultra 預計會在 Redmi K40 之後,最快在 3 月份就會正式發表。

完整影片(備份)

目前 Tech Buff PH 已將原影片瀏覽權限改為私人,不過目前已經有人將影片備份上傳(如影片下架請見諒)。

 

圖片/消息來源: TECH BUFF PH(YouTube)

延伸閱讀:
小米11 虐機耐用性測試,究竟能通過一連串嚴苛考驗嗎?

小米11 骨牌挑戰影片!以 4100支成功完成挑戰

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

※產品缺大量曝光嗎?你需要的是一流包裝設計!

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

EPIC 推出 MetaHuman Creator,在網頁上就能製作擬真人像

EPIC Games 宣布推出一款全新的瀏覽器工具,該工具由 Unreal Engine 所構建,名為「MetaHuman Creator」,可讓用戶製作高度逼真的人臉,並幫助打造更逼真的身體動作與臉部動畫。該公司也推出一系列影片來展示使用這項工具的成品範例(稱為 MetaHuman)。

EPIC 推出 MetaHuman Creator,在網頁上就能製作擬真人像

EPIC 表示,MetaHuman Creator 可以與現代動作捕捉和動畫技術結合使用,為遊戲、電影、電視和其他內容建立逼真的動作和人類互動場景。該公司說,這些逼真的擬真人像可以在數分鐘內生成,並且擁有獨特的服裝與髮型,並且可進一步地定製,以滿足創作者的各種需求。 這些 MetaHuman 可以在工具內直接即時操作,不需下載安裝,透過網路瀏覽器即可完成。

截至目前為止,3D 內容創作中最困難的部分之一就是構建出具說服力的數位人類,即使是經驗豐富的老手也需要耗費大樣時間、精力與精良的設備來雕琢一個角色。使用 EPIC 新工具所創造的擬真人像並不是以接近照片為目的的現實主義,但作為一款遊戲角色創作工具,MetaHuman Creator 能夠創造令人驚豔的影像,可以更容易地捕捉現實生活中的動作。

目前還不知道 EPIC 打算在 2021 年的何時推出瀏覽器外的版本,但感興趣的開發者或創作者可以在官方網站上註冊獲取更新。其實擬真人像、機器人最可怕的恐怖谷理論目前還沒有能逃離的例子,只能等工具真正掌握在第三方創作者手中後從成品裡見真章。

◎資料來源:The Verge

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※教你寫出一流的銷售文案?

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

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※推薦台中搬家公司優質服務,可到府估價