·如果有大量的線程,會(huì)影響性能,因?yàn)椴僮飨到y(tǒng)需要在它們之間切換。·的線程需要的內(nèi)存空間。·線程可能會(huì)給程序帶來“bug”,因此要小心使用?!ぞ€程的中止需要考慮其對(duì)程序運(yùn)行的影響?!ねǔK模型數(shù)據(jù)是在多個(gè)線程間共享的,需要防止線程死鎖情況的發(fā)生。一些線程模型的背景可以重點(diǎn)討論一下在Win32環(huán)境中常用的一些模型?!尉€程模型在這種線程模型中,一個(gè)進(jìn)程中只能有一個(gè)線程,剩下的進(jìn)程必須等待當(dāng)前的線程執(zhí)行完。這種模型的缺點(diǎn)在于系統(tǒng)完成一個(gè)很小的任務(wù)都必須占用很長的時(shí)間。·塊線程模型(單線程多塊模型STA)這種模型里,一個(gè)程序里可能會(huì)包含多個(gè)執(zhí)行的線程。在這里,每個(gè)線程被分為進(jìn)程里一個(gè)單獨(dú)的塊。每個(gè)進(jìn)程可以含有多個(gè)塊,可以共享多個(gè)塊中的數(shù)據(jù)。程序規(guī)定了每個(gè)塊中線程的執(zhí)行時(shí)間。所有的請(qǐng)求通過Windows消息隊(duì)列進(jìn)行串行化,這樣保證了每個(gè)時(shí)刻只能訪問一個(gè)塊,因而只有一個(gè)單獨(dú)的進(jìn)程可以在某一個(gè)時(shí)刻得到執(zhí)行。這種模型比單線程模型的好處在于,可以響應(yīng)同一時(shí)刻的多個(gè)用戶請(qǐng)求的任務(wù)而不只是單個(gè)用戶請(qǐng)求。但它的性能還不是很好,因?yàn)樗褂昧舜谢木€程模型,任務(wù)是一個(gè)接一個(gè)得到執(zhí)行的。·多線程塊模型(自由線程塊模型)多線程塊模型(MTA)在每個(gè)進(jìn)程里只有一個(gè)塊而不是多個(gè)塊。這單個(gè)塊控制著多個(gè)線程而不是單個(gè)線程。這里不需要消息隊(duì)列,因?yàn)樗械木€程都是相同的塊的一個(gè)部分,并且可以共享。這樣的程序比單線程模型和STA的執(zhí)行速度都要快,因?yàn)榻档土讼到y(tǒng)的負(fù)載,因而可以優(yōu)化來減少系統(tǒng)idle的時(shí)間。這些應(yīng)用程序一般比較復(fù)雜,因?yàn)槌绦騿T必須提供線程同步以保證線程不會(huì)并發(fā)的請(qǐng)求相同的資源,因而導(dǎo)致競爭情況的發(fā)生。這里有必要提供一個(gè)鎖機(jī)制。但是這樣也許會(huì)導(dǎo)致系統(tǒng)死鎖的發(fā)生。進(jìn)程和線程都是操作系統(tǒng)的概念。進(jìn)程是應(yīng)用程序的執(zhí)行實(shí)例,每個(gè)進(jìn)程是由私有的虛擬地址空間、代碼、數(shù)據(jù)和其它各種系統(tǒng)資源組成,進(jìn)程在運(yùn)行過程中創(chuàng)建的資源隨著進(jìn)程的終止而被銷毀,所使用的系統(tǒng)資源在進(jìn)程終止時(shí)被釋放或關(guān)閉。線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行單元。系統(tǒng)創(chuàng)建好進(jìn)程后,實(shí)際上就啟動(dòng)執(zhí)行了該進(jìn)程的主執(zhí)行線程,主執(zhí)行線程以函數(shù)地址形式,比如說main或WinMain函數(shù),將程序的啟動(dòng)點(diǎn)提供給Windows系統(tǒng)。主執(zhí)行線程終止了,進(jìn)程也就隨之終止。每一個(gè)進(jìn)程至少有一個(gè)主執(zhí)行線程,它無需由用戶去主動(dòng)創(chuàng)建,是由系統(tǒng)自動(dòng)創(chuàng)建的。用戶根據(jù)需要在應(yīng)用程序中創(chuàng)建其它線程,多個(gè)線程并發(fā)地運(yùn)行于同一個(gè)進(jìn)程中。一個(gè)進(jìn)程中的所有線程都在該進(jìn)程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統(tǒng)資源,所以線程間的通訊非常方便,多線程技術(shù)的應(yīng)用也較為廣泛。多線程可以實(shí)現(xiàn)并行處理,避免了某項(xiàng)任務(wù)長時(shí)間占用CPU時(shí)間。要說明的一點(diǎn)是,到2015年為止,大多數(shù)的計(jì)算機(jī)都是單處理器(CPU)的,為了運(yùn)行所有這些線程,操作系統(tǒng)為每個(gè)獨(dú)立線程安排一些CPU時(shí)間,操作系統(tǒng)以輪換方式向線程提供時(shí)間片,這就給人一種假象,好象這些線程都在同時(shí)運(yùn)行。由此可見,如果兩個(gè)非常活躍的線程為了搶奪對(duì)CPU的控制權(quán),在線程切換時(shí)會(huì)消耗很多的CPU資源,反而會(huì)降低系統(tǒng)的性能。這一點(diǎn)在多線程編程時(shí)應(yīng)該注意。C++11標(biāo)準(zhǔn)中,STL類庫也實(shí)現(xiàn)了多線程的類std::thread,使得多線程編程更加方便。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),昌江企業(yè)網(wǎng)站建設(shè),昌江品牌網(wǎng)站建設(shè),網(wǎng)站定制,昌江網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,昌江網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
Android模塊化設(shè)計(jì)方案系列文章:
1、 Android模塊化設(shè)計(jì)方案模型圖
2、 Android模塊化設(shè)計(jì)方案之接口API化
3、 Android模塊化設(shè)計(jì)方案之使用代理模式解耦
本篇是Android模塊化設(shè)計(jì)方案的第三篇,也是對(duì) 第一篇 中ThridLibs Proxy模塊進(jìn)行說明。
很多人覺得對(duì)那些優(yōu)秀的第三方依賴庫再次封裝是一件多余的事情,因?yàn)檫@些庫可能出自大神/大廠,或有非常高的star并且使用起來十分穩(wěn)定,可以在項(xiàng)目中直接拿來使用。當(dāng)然每個(gè)開發(fā)者都有自己的態(tài)度,我也只是根據(jù)以往的經(jīng)驗(yàn),表達(dá)一下自己的看法。
作為從了解四大組件就不愁找不到工作的互聯(lián)網(wǎng)大時(shí)代中一路走來的Android老鳥,經(jīng)歷了網(wǎng)路請(qǐng)求框架從HttpConnection到Volley再到OkHttp,也經(jīng)歷了圖片加載框架從UniversalImageLoader到Picasso再到Gilde,技術(shù)的迭代隨時(shí)都會(huì)發(fā)生。讓項(xiàng)目架構(gòu)具有良好的擴(kuò)展性是在設(shè)計(jì)之初就需要考慮的東西。
那么接下來我用一個(gè)簡單的demo來演示一下如何使用代理模式對(duì)第三方框架進(jìn)行解耦。
現(xiàn)在我們有一個(gè)名為 thirdlib 的模塊,為我們提供圖片加載功能。
第一步:我們創(chuàng)建了一個(gè)新的模塊 thridlibproxy ,并且該模塊依賴于 thirdlib ,我們?cè)谠撃K中創(chuàng)建包私有的接口ImageLoaderInterface,這個(gè)接口中把thirdlib模塊中提供的功能抽象為接口:
第二步:創(chuàng)建包私有的接口的實(shí)現(xiàn)類ImageLoaderOneImpl,類中圖片加載的業(yè)務(wù)邏輯是通過調(diào)用 thirdlib 中的ImageLoader類實(shí)現(xiàn)的:
第三步:我們提供一個(gè)供外部調(diào)用的ImageLoaderOneImpl接口代理類ImageLoaderProxy:
最后我們就可以通過ImageLoaderProxy中提供的loadImage方法進(jìn)行圖片的加載了。
看到這里有些盆友就會(huì)問了,在第二步的時(shí)候,我們就完成了 thirdlib 的封裝工作,為什么還要有第三步?還有我寫一個(gè)單例類直接對(duì) thirdlib 進(jìn)行封裝不就行了,為什么還要抽象出接口?
原因很簡單,為的就是盡可能的滿足軟件設(shè)計(jì)七大原則中的第一個(gè): 開閉原則 。
一個(gè)好的軟件設(shè)計(jì),需要對(duì)拓展開放,對(duì)修改關(guān)閉。我們?cè)谠O(shè)計(jì)之初就要想到,在更換圖片加載框架之后如何最大程度上滿足開閉原則。
如果直接對(duì) thirdlib 進(jìn)行封裝,是面向類的開發(fā)而不是面向接口。如果此時(shí)更換圖片加載類庫,那必然會(huì)對(duì)封裝出來的類進(jìn)行大量的修改,把原來的實(shí)現(xiàn)替換為新的實(shí)現(xiàn)。
使用代理模式的好處就是,我新創(chuàng)建一個(gè)被代理的類ImageLoaderTwoImpl:
然后只需要對(duì)第三步中的被代理類進(jìn)行替換就行了。
在想要達(dá)到相同效果的時(shí)候,最大程度的滿足了開閉原則。
我們業(yè)務(wù)層模塊也和第三方庫實(shí)現(xiàn)了完全的解耦,我不需要知道 thridlibproxy 是如何幫我完成圖片加載工作的,但是只要調(diào)用它提供的方法就完事兒的,這也符合軟件設(shè)計(jì)七大原則中的: 最少知道原則 。
關(guān)于為何以及怎么通過代理調(diào)用第三方依賴庫,到這里就介紹完畢了,趕快動(dòng)手試試吧~
我只想說: 原則是死的,人是活的????
如果覺得有收獲的話,歡迎點(diǎn)贊評(píng)論以及關(guān)注~
jvm運(yùn)行時(shí)數(shù)據(jù)區(qū)域解析
劉望舒的BLOG
虛擬機(jī)的內(nèi)存模型
1.程序計(jì)數(shù)器: 確定程序指令執(zhí)行順序的,是唯一一塊不會(huì)發(fā)生內(nèi)存溢出的區(qū)域
2. Java虛擬機(jī)棧
**它也是線程私有的,負(fù)責(zé)存儲(chǔ)方法內(nèi)的局部變量,方法出口等。每執(zhí)行一個(gè)方法都相當(dāng)于壓如一個(gè)棧幀,方法執(zhí)行完比后這個(gè)棧幀從Java虛擬機(jī)棧中彈出。
3.本地方法區(qū)
負(fù)責(zé)管理虛擬機(jī)用到的 C 的方法。
4.堆內(nèi)存區(qū)域
Java堆是一塊被所有線程共享的區(qū)域,用來存放對(duì)象的實(shí)例。它不需要物理上連續(xù),只需要邏輯上連續(xù)就可以。
5.方法區(qū)
方法區(qū)是被所有線程共享的的內(nèi)存區(qū)域,用來存放已經(jīng)被Java虛擬機(jī)加載的類的結(jié)構(gòu)信息:運(yùn)行時(shí)常量池,字段,方法信息,靜態(tài)變量等數(shù)據(jù)。
class文件的內(nèi)容
在Android OpenGLES2.0(十四)——Obj格式3D模型加載中實(shí)現(xiàn)了Obj格式的3D模型的加載,加載的是一個(gè)沒有貼圖,沒有光照處理的帽子,為了呈現(xiàn)出立體效果,“手動(dòng)”加了光照,擁有貼圖的紋理及光照又該怎么加載呢?
本篇博客例子中加載的是一個(gè)卡通形象皮卡丘,資源是在網(wǎng)上隨便找的一個(gè)。加載出來如圖所示:
obj內(nèi)容格式如下:
mtl文件內(nèi)容格式如下:
關(guān)于Obj的內(nèi)容格式,在上篇博客中已經(jīng)做了總結(jié),本篇博客中使用的obj,可以看到f后面的不再跟的是4個(gè)數(shù)字,而是 f 2/58/58 3/59/59 17/60/60 這種樣子的三組數(shù),每一組都表示為頂點(diǎn)坐標(biāo)索引/貼圖坐標(biāo)點(diǎn)索引/頂點(diǎn)法線索引,三個(gè)頂點(diǎn)組成一個(gè)三角形。而頭部的 mtllib pikachu.mtl 則指明使用的材質(zhì)庫。
而mtl格式文件中,主要數(shù)據(jù)類型為:
模型加載和之前的模型加載大同小異,不同的是,這次我們需要將模型的貼圖坐標(biāo)、頂點(diǎn)法線也一起加載,并傳入到shader中。其他參數(shù),有的自然也要取到。
模型加載以obj文件為入口,解析obj文件,從中獲取到mtl文件相對(duì)路徑,然后解析mtl文件。將材質(zhì)庫拆分為諸多的單一材質(zhì)。obj對(duì)象的 加載,根據(jù)具使用材質(zhì)不同來分解為多個(gè)3D模型。具體加載過程如下:
頂點(diǎn)著色器
片元著色器
完成了以上準(zhǔn)備工作,就可以調(diào)用 readMultiObj 方法,將obj文件讀成一個(gè)或多個(gè)帶有各項(xiàng)參數(shù)的3D模型類,然后將每一個(gè)3D模型的參數(shù)傳入shader中,進(jìn)而進(jìn)行渲染:
在工具選項(xiàng)中更改。更改方法。
1、首先打開VisualStudio進(jìn)入軟件主界面。
2、進(jìn)入軟件主界面,點(diǎn)擊工具。
3、進(jìn)入工具選項(xiàng),選擇選項(xiàng)。
4、選擇IntelliCode,常規(guī)。
5、找到AndroidXML基礎(chǔ)模型。
6、更改選項(xiàng)。然后點(diǎn)擊確定即可。
分享標(biāo)題:android模型,mobile模型
文章源于:http://chinadenli.net/article10/dsshsgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站導(dǎo)航、App開發(fā)、網(wǎng)站制作、小程序開發(fā)、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)