當前位置:首頁 » 文件管理 » 緩存對象池

緩存對象池

發布時間: 2022-11-16 15:38:34

⑴ 為什麼要使用EJB 使用EJB的理由

為什麼使用EJB我原先認為這不是一個討論的話題,因為EJB是J2EE重要的組成部分,可以說沒有EJB的J2EE只是一種Web系統,這樣的系統非常容易喪失了多層結構的大部分優點(仔細想想那些混合多種層次功能javaBeans和傳統兩層結構有什麼區別?)。

當然,可以人為地在Javabeans之間進行層次劃分,例如Hibernate算數據持久層,某些JavaBeans是業務核心層,但是因為都是普通JavaBeans,這種劃分沒有一種強制性和明顯標志性,這樣的系統更換了主創人員或設計師,可能就會被新的程序員修改得非常混亂。

我們先看看一個包含EJB的J2EE系統是如何清晰地表達層次。如下圖:

Web完全只是一個MVC模式的實現,關鍵業務核心是在EJB的服務層實現,這樣做的優點是,Web只負責界面相關部分,因為,如果是一個智能客戶端,如Swing或J2ME,在不需要修改任何業務核心的情況下能夠方便地更換。同樣,提供Web Services功能,也只是在 Web層修改,不會涉及EJB方面的修改,同樣保證了系統的穩定性,保證了系統升級和未來的擴展性。

如果不使用EJB,在EJB服務層實現的業務核心將由普通JavaBeans實現,使用何種架構或設計能夠保證負責MVC的JavaBeans和負責業務核心的JavaBeans清晰地分開,又如何保證在新的程序員不會破壞和打亂你精心布局的JavaBeans架構?

EJB提供性能優化支持

最主要的是性能問題,由於以前國內中文Java網站有些人彎曲EJB,認為EJB性能低,其實這是一種非常膚淺錯誤的認識,我們首先看看在一般Java環境中是如何提高性能。

假定一個JavaBeans為A,那麼一般使用這個JavaBeans命令如下:

A a = new A();

但是,在高訪問量的環境中,new A()其實是很費時消耗系統性能的,因此,能不能在軟體系統啟動時候就預先建立一些對象,這樣,系統運行時,從這些已經生成的對象池中借用一個,這樣,就無需在使用時進行New,節約了開銷,提高了性能,因此,真正成熟性能解決方案都是需要對象池等支持。

在一個純Web結構的系統(也就是只能運行在Tomat環境中),例如Struts Hibernate等這樣的系統,除非自己動手做,一般是沒有對象池技術支持的,因此他們的性能只能算是Demo演示版本的性能,根本無法承受大容量並發訪問,也無法稱為一個成熟的系統,所以,我們研究成熟的開源Web系統,如Jive、OFBize,LifeRay等,他們都在Web層擁有自己的對象池和緩存池。

對象池和緩存機制是J2EE必須的嗎?當然,是所有成熟系統必須的,Windows系統如果去掉緩存將會變得怎樣?

自己動手開發對象池和緩存機制並不是一件簡單的事情,需要對多線程以及同步鎖等底層原理有深層次的把握,這其實也是一門非常深入的Java研究分支,所以,你可以拋開你的客戶焦急的催促,精心研究開發自己的對象池和緩存池。

但是,EJB容器(如JBoss)已經提供了對象池和緩存機制,所以,沒有事務機制的無狀態Session Bean的性能肯定要強於普通JavaBeans。EJB容器不但在單機中提供了對象池和緩存,而且可以跨伺服器實現動態負載平衡,這些都無需開發者自己開發任何軟體代碼,結構如下:

EJB組件能提供真正的可重用框架

每一個jar包代表一個EJB組件,一個系統可以由多個可重用的EJB組件構成,例如:樹形結構EJB組件;自增序號EJB組件;用戶資料EJB組件等,這樣的EJB組件可以象積木一樣搭配在大部分應用系統中,提高了系統的開發效率,保證了開發質量。

下圖是某個新的具體系統時應用到的EJB組件圖,在這個新的應用中,由於使用了以前大量可重用的EJB組件,新的開發工作基本集中在界面設計和流程安排上:

EJB提供了事務機制

事務機制對於一些關鍵事務是很重要的,例如ATM機提款,提款有多個動作:修改資料庫以及數錢等,如果這其中有任何一個環節出錯,那麼其它已經實現的操作必須還原,否則,就會出現,提款人沒有拿到錢,但是卡上已經扣款等不可思議的事情發生。

EJB提供的事務機制非常周全,但事務機制帶來的缺點是性能的降低,因此,有些人認為EJB很重,因為在實際應用中,有的用戶系統可能不需要事務機制,只是需要EJB提供的性能優化機制,這樣,如果使用EJB,就象叫一個人來背東西,他除了背著我要的東西外,還背著我不要的東西。

除非你是一個完美主義,在一般企業應用或資料庫系統應用中,EJB不會對你構成很重的包袱。

CMP獨特的優點

開源以及一些資料庫持久層技術崇拜者,一直抨擊CMP,認為CMP慢無用,實際最大的問題是他們的設計和使用問題。

由於EJB容器(如JBoss)對CMP實現有事務機制的緩存優化,因此,CMP特別適合多個用戶同時更新同一個數據源的情況,CMP這種嚴格的事務完整性保證多個用戶同時操作一個數據記錄時,能夠保證性能優化和數據的完整性,如果這個數據記錄是是軟體系統的狀態標志,它的狀態會影響系統中很多的環節,那麼狀態更改的重要性不言而喻。

如果沒有事務完整性支持,你的軟體系統在用戶訪問量變大,就會變得發生各種不可能發生的邏輯錯誤,查看程序邏輯是正確的,那麼問題出在哪裡?出在數據完整性上。

由於每個CMP在內存中都有一個緩存,在實際應用中,如果使用CMP批量讀資料庫數據,幾萬條查詢完畢,內存中充滿了幾萬條CMP緩存,如果這時你的EJB容器設置不當(如使用JBoss預設配置),那麼JVM的垃圾回收機制就會頻繁啟動,導致你的系統變慢甚至死機,這也是一些人抨擊CMP慢的原因所在,其實他們使用方法不當,或者沒有正確配置EJB容器CMP緩存。

對於這種情況,根據J2EE核心模式,推薦使用DAO JDBC方式。

小結

除非你對設計模式非常精深,能夠將自己系統中的JavaBeans使用模式或某種框架進行固定分層,同時,你孜孜不倦研發出對象池,又熟練於JTA等事務機制,你可以選擇沒有EJB的純Web結構,就象Jive、OFBiz那樣。當然還有一個前提,老闆不懂或者非常有挑戰性(做與IBM SUN 微軟齊名的公司和技術)。

不要再被TSS那些狂熱的開源先生誤導,他們有時間有保障可以做他們喜歡的事情,作為專業的J2EE程序員,按照J2EE標准去學習去行動,也不要認為,只要使用了J2EE其中某個技術如Jsp或JavaBeans就心安理得認為自己的系統是J2EE了。

當然,我並不是說純Web系統不能實現多層結構,但是至少在很多方面沒有Web EJB結構完善和清晰,所以,EJB不是J2EE可以忽視的部分,而是主要的重要的部分,重要業務功能核心都封裝在EJB中,相反Web層是一種次要的、和界面相關的層次。

⑵ golang sync.pool對象復用 並發原理 緩存池

在go http每一次go serve(l)都會構建Request數據結構。在大量數據請求或高並發的場景中,頻繁創建銷毀對象,會導致GC壓力。解決辦法之一就是使用對象復用技術。在http協議層之下,使用對象復用技術創建Request數據結構。在http協議層之上,可以使用對象復用技術創建(w,*r,ctx)數據結構。這樣即可以回快TCP層讀包之後的解析速度,也可也加快請求處理的速度。

先上一個測試:

結論是這樣的:

貌似使用池化,性能弱爆了???這似乎與net/http使用sync.pool池化Request來優化性能的選擇相違背。這同時也說明了一個問題,好的東西,如果濫用反而造成了性能成倍的下降。在看過pool原理之後,結合實例,將給出正確的使用方法,並給出預期的效果。

sync.Pool是一個 協程安全 臨時對象池 。數據結構如下:

local 成員的真實類型是一個 poolLocal 數組,localSize 是數組長度。這涉及到Pool實現,pool為每個P分配了一個對象,P數量設置為runtime.GOMAXPROCS(0)。在並發讀寫時,goroutine綁定的P有對象,先用自己的,沒有去偷其它P的。go語言將數據分散在了各個真正運行的P中,降低了鎖競爭,提高了並發能力。

不要習慣性地誤認為New是一個關鍵字,這里的New是Pool的一個欄位,也是一個閉包名稱。其API:

如果不指定New欄位,對象池為空時會返回nil,而不是一個新構建的對象。Get()到的對象是隨機的。

原生sync.Pool的問題是,Pool中的對象會被GC清理掉,這使得sync.Pool只適合做簡單地對象池,不適合作連接池。

pool創建時不能指定大小,沒有數量限制。pool中對象會被GC清掉,只存在於兩次GC之間。實現是pool的init方法注冊了一個poolCleanup()函數,這個方法在GC之前執行,清空pool中的所有緩存對象。

為使多協程使用同一個POOL。最基本的想法就是每個協程,加鎖去操作共享的POOL,這顯然是低效的。而進一步改進,類似於ConcurrentHashMap(JDK7)的分Segment,提高其並發性可以一定程度性緩解。

注意到pool中的對象是無差異性的,加鎖或者分段加鎖都不是較好的做法。go的做法是為每一個綁定協程的P都分配一個子池。每個子池又分為私有池和共享列表。共享列表是分別存放在各個P之上的共享區域,而不是各個P共享的一塊內存。協程拿自己P里的子池對象不需要加鎖,拿共享列表中的就需要加鎖了。

Get對象過程:

Put過程:

如何解決Get最壞情況遍歷所有P才獲取得對象呢:

方法1止前sync.pool並沒有這樣的設置。方法2由於goroutine被分配到哪個P由調度器調度不可控,無法確保其平衡。

由於不可控的GC導致生命周期過短,且池大小不可控,因而不適合作連接池。僅適用於增加對象重用機率,減少GC負擔。2

執行結果:

單線程情況下,遍歷其它無元素的P,長時間加鎖性能低下。啟用協程改善。

結果:

測試場景在goroutines遠大於GOMAXPROCS情況下,與非池化性能差異巨大。

測試結果

可以看到同樣使用*sync.pool,較大池大小的命中率較高,性能遠高於空池。

結論:pool在一定的使用條件下提高並發性能,條件1是協程數遠大於GOMAXPROCS,條件2是池中對象遠大於GOMAXPROCS。歸結成一個原因就是使對象在各個P中均勻分布。

池pool和緩存cache的區別。池的意思是,池內對象是可以互換的,不關心具體值,甚至不需要區分是新建的還是從池中拿出的。緩存指的是KV映射,緩存里的值互不相同,清除機制更為復雜。緩存清除演算法如LRU、LIRS緩存演算法。

池空間回收的幾種方式。一些是GC前回收,一些是基於時鍾或弱引用回收。最終確定在GC時回收Pool內對象,即不迴避GC。用java的GC解釋弱引用。GC的四種引用:強引用、弱引用、軟引用、虛引用。虛引用即沒有引用,弱引用GC但有空間則保留,軟引用GC即清除。ThreadLocal的值為弱引用的例子。

regexp 包為了保證並發時使用同一個正則,而維護了一組狀態機。

fmt包做字串拼接,從sync.pool拿[]byte對象。避免頻繁構建再GC效率高很多。

⑶ Spring AOP 一般用在什麼場景中

AOP,在程序開發中主要用來解決一些系統層面上的問題,比如日誌,事務,許可權等待,Struts2的攔截器設計就是基於AOP的思想,是個比較經典的例子。

在不改變原有的邏輯的基礎上,增加一些額外的功能。代理也是這個功能,讀寫分離也能用aop來做。

(3)緩存對象池擴展閱讀:

AOP/OOP區分

AOP、OOP在字面上雖然非常類似,但卻是面向不同領域的兩種設計思想。OOP(面向對象編程)針對業務處理過程的實體及其屬性和行為進行抽象封裝,以獲得更加清晰高效的邏輯單元劃分。

而AOP則是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。這兩種設計思想在目標上有著本質的差異。

⑷ 如何獲取ceph的緩存池中對象的大小和偏移

連續容器如:Vector,內部是預先分配一段連續緩存來保存對象,所分配內存可以保存對象的個數為容量,而已保存的對象個數為長度。
當程序調用push時候,如果容量不夠了,Vector自動重新分配一段緩存,大小是原來的2倍,然後把原來的內容拷貝到新緩存中,最後釋放原來的緩存。出現這種情況是很費時間的!所以Vector內部的指針的地址是可能變得的!

list 是每次添加對象的時候動態分配內存,所以沒有容量的概念!

⑸ 如何使用對象池緩存節點提高性能

如何使用對象池緩存節點提高性能
因為Redis具有在數據存儲中快速讀寫數據的能力,所以它比關系型資料庫更具有性能優勢。但是,關鍵值數據存儲是簡單的;它們沒有一個類似於
SQL的查詢語言或者結構化的數據模型。相反,它們有一個把鍵值作為與數值相關的標識符來使用的簡單字典或哈希模式。管理員使用這些鍵來進行數值的存儲和
檢索。

鍵值存儲是簡單快速的,它可用於實現豐富數據模型和關系型資料庫查詢功能的良好匹配。但是,有時候還是使用鍵值與關系型資料庫的組合為好。此外,還有很多商業支持的鍵值資料庫,包括Redis、Riak和Areospike等。

⑹ Android圖片框架對比

對比現在主流圖片框架的優勢和缺點,在實際項目中如何選擇適合自己的框架;

Glide、Fresco、Picasso、ImageLoader
共同優點:

以上名詞介紹

在分析他們的差異、優缺點之前,我們先了解圖片緩存通用的概念:

以上概念在不同框架之間可能不同,比如Displayer在ImageLoader中叫做ImageAware,在Picasso和Glide中叫做Target。

以上為Glide的總體設計圖。
整個庫分為RequestManager(請求管理器)、Engine(數據獲取引擎)、Fetcher(數據獲取器)、MemoryCache(內存緩存)、DiskLRUCache(本地緩存)、Transformation(圖片處理)、Encoder(編碼處理)、Registry(圖片類型以及解析器配置)、Target(目標)等模塊。

簡單流程: Glider收到載入及顯示資源任務,創建Request並將它交給RequestManager,Request啟動Engine去數據源獲取資源,得到資源後通過Transformation處理後交給Target.
Glide依賴DiskLRUCache、GifDecoder等開源庫去完成本地緩存和Gif圖片解密工作;

為Bitmap 維護一個BitmapPool對象池, 對象池的主要目的是通過減少大對象的分配以重用來提高性能!

缺點
①圖片質量低:因為機制不同,速度快,但是圖片的質量降低了RGB565;
②多尺寸緩存導致內存和磁碟佔用多:根據ImageView大小來緩存,可能會導致一張圖片可能根據展示情況來緩存不同尺寸的幾份;

擴展理解參考: https://www.jianshu.com/p/1ab5597af607

以上為Picasso的總體設計圖。
整個庫分為Dispatcher、RequestHandler以及Downloader、PicassoDrawable等模塊。
簡單流程: Picasso收到載入顯示圖片任務後,創建Request並將它交給Dispatcher,Dispatcher分發任務到具體RequestHandler,任務通過MemoryCache及Handler(數據獲取介面)獲取圖片,圖片獲取成功後通過PicassoDrawable顯示到Target中;

上面Data的File system部分,Picasso沒有自定義本地緩存的介面,默認使用http的本地緩存,API19以上使用okhttp,一下使用UrlConnection,所以如果需要自定義本地緩存就需要自定義Downloader;

缺點 :載入速度沒有其他框架快;
特點 :只緩存一個全尺寸的圖片,根據需求的大小在壓縮轉換;

以上為Fresco的總體設計圖
整個庫分為UI:DraweeView(View控制項)、Drawable(圖片數據)、DraweeController(圖片控制器)、DraweeHiierarchy(圖片體系);Core:DataSource(數據源)、ImagePipeline(圖像管道)、Procer(生產者)、ProcerFacotry(生產工廠)、Subcriber(訂閱)、Supplier(供應者)、Consumer(消費者);IO/Data:MemoryCache(內存緩存)、Network、DiskCache(磁碟緩存)、Recourse(本地資源)

簡單流程: 從上面的結構可以看出,fresco主要採用了工廠+建造者的模式實現功能,邏輯劃分比較清楚;Fresco框架整體是一個MVC模式,DrawableView--->View用來顯示頂層視圖、DrawableController--->Control控制載入圖片的配置 事件的分發、DrawableHierarchy--->Model 用於存儲和描述圖片信息,同時也封裝了一些圖片的顯示和視圖層級的方法;ImagePipeline模塊負責從網路、本地文件系統、本地資源載入圖片

缺點:
①框架大,影響Apk體積;
②一定的學習成本,使用比較繁瑣,需要使用內部提供的ImageView控制項,使用起來比較復雜;

⑺ javascript對象池應用場景是什麼樣的

具體實現思路:
我們使用一個數組來存儲已創建的xmlhttp對象實例,然後每次調用從池中去取一個實例。xmlhttp實例通訊完畢後我們不用做任何處置,因為它自身的readyState屬性可以標識出它是否可用,如果當時沒有空閑的xmlhttp實例,且池中的實例數小於最大實例個數,那麼就創建一個新的實例並放入池中。重新改進的實現代碼如下:

復制代碼代碼如下:

//封裝XMLHTTP的MyAjaxObj類
var MyAjaxObj = new Object();
var maxXmlHttpCount = 5; //最多5個xmlhttp對象存在

MyAjaxObj.reqList = []; //可以清空裡面的項

MyAjaxObj.getFreeObj = function() {
var req = null;
var len = this.reqList.length;
//先從當前的池裡取
for (var i = 0; i < len; i++) {
if (this.reqList[i]) {
if (this.reqList[i].readyState == 4 || this.reqList[i].readyState == 0) {
req = this.reqList[i];
break;
}
}
}
//如果沒有閑置的對象,自己獨立創建
if (req == null) {
if (this.reqList.length < maxXmlHttpCount) {
req = getXmlHttp();
this.reqList.push(req);
}
}
return req;
}

//創建一個XMLHTTP對象,兼容不同的瀏覽器
function getXmlHttp() {
var xmlHttp = false;
var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"];
for (var i = 0; i < arrSignatures.length; i++) {
try {
xmlHttp = new ActiveXObject(arrSignatures[i]);
return xmlHttp;
}
catch (oError) {
xmlHttp = false; //ignore
}
}
// throw new Error("MSXML is not installed on your system.");
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
return xmlHttp;
}

/*封裝XMLHTTP向伺服器發送請求的操作
url:向伺服器請求的路徑;method:請求的方法,即是get/post;***callback:當伺服器成功返回結果時,調用的函數(類似c#回調函數)***
data:向伺服器請求時附帶的數據;urlencoded:url是否編碼;cached:是否使用緩存; callBackError;當伺服器返回錯誤時調用的函數
*/
MyAjaxObj.send = function(url, method, callback, data, urlencoded, cached, callBackError) {
var req = this.getFreeObj(); //從池裡或者直接實例化一個XMLHTTP的實例

//當XMLHTTP的請求狀態發生改變時調用 (核心處理函數)
req.onreadystatechange = function() {
// 當請求已經載入

if (req.readyState == 4) {
// 當請求返回成功
if (req.status == 200) { //或者 req.status < 400
// 當定義了成功回調函數時,執行成功回調函數
if (callback)
callback(req, data);
}
// 當請求返回錯誤

else {
//當定義了失敗回調函數時,執行失敗回調函數
if (callBackError)
callBackError(req, data);
}

// 有池的管理,我們可以省卻釋放資源的方法
// try {
// delete req;
// req = null;
// }
// catch (e) {
// alert(e.message);
// }
}
}

//如果以POST方式回發伺服器
if (method.toUpperCase() == "POST") {
req.open("POST", url, true);
//請求是否需要緩存(只有在req.open之後才可以設置此項)
if (cached)
req.setRequestHeader("If-Modified-Since", "0");
//請求需要編碼
if (urlencoded)
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.send(data);
MyAjaxObj.reqList.push(req);
}
//以GET方式請求
else {
req.open("GET", url, true);
//請求是否需要緩存
if (cached)
req.setRequestHeader("If-Modified-Since", "0");
req.send(null);
MyAjaxObj.reqList.push(req);
}
return req;
}

//全部清除XMLHTTP數組元素,釋放資源
MyAjaxObj.clearReqList = function() {
var len = MyAjaxObj.reqList.length;
for (var i = 0; i < len; i++) {
var req = MyAjaxObj.reqList[i];
if (req) {
try {
delete req;
} catch (e) { }
}
}
MyAjaxObj.reqList = [];
}

//進一步封裝XMLHTTP以POST方式發送請求時的代碼
//isClear:是否清除XMLHTTP數組的所有元素;其他參數的意義見 MyAjaxObj.send
MyAjaxObj.sendPost = function(url, data, callback, isClear, isCached, callBackError) {
if (isClear) {
MyAjaxObj.clearReqList();
}
MyAjaxObj.send(url, "POST", callback, data, true, isCached, callBackError); //post方法需要編碼
}
//進一步封裝XMLHTTP以GET方式發送請求時的代碼
MyAjaxObj.sendGet = function(url, args, callback, isClear, isCached, callBackError) {
if (isClear)
MyAjaxObj.clearReqList();
return MyAjaxObj.send(url, "GET", callback, args, false, isCached, callBackError);
}

最後再ps:上周周末和一個哥們聊天的時候談到ajax應用中的xmlhttp對象。那哥們ms很「虔誠」地問我說xmlhttp怎麼就非同步通信了。我當時竟然毫不思索地說因為這個對象處理我們的請求調用是「非同步」的(當然可以設置成同步的,不過這是一句廢話),當前這個請求不會影響其他的操作。這個回答是很「官方」的,顯然沒有說到問題的本質。哥們,您的眼神兒有必要那麼bs人么?現在稍作分析,個人認為其實每個xmlhttp非同步請求都會觸發一個回調函數,這個回調函數的調用不影響其他的操作,這個方法才是「非同步」。如果對比c#里的非同步處理回調方法,它們在原理上其實是相通的。 哈哈,現在終於想通了, 真是太驕傲,太有出息了,想到就興奮!
標簽: javascript xmlhttp 對象池

⑻ cocos 性能優化方案求助

一.內存優化
1.內存泄漏
在最近的項目中使用了C11的智能指針,經過一年的使用證明這是不是一個成功的選擇。雖然已經沒了自己管理的煩躁,但是增加了內存泄漏的幾率。畢竟不是所有人都能完全理解和掌握shared_ptr的使用。 建議使用cocos2dx自帶的輕量級智能指針,採用了引用計數,並且沒有了C11智能指針循環引用及其他使用容易導致引用計數異常的問題。
2.緩存(材質緩存,精靈幀緩存)管理
這里必須要引入過渡場景,用於removeunused的緩存,然後預載入下一個場景需要使用的資源。 並且cocos2dx提供了api可以查看內存中所有的緩存,做為開發必須能完全熟知內存中的這些緩存,能及時判斷哪些材質是多餘的。
這里要多提的一點是,不使用jpg,android使用pkm,ios使用pvr是非常有必要的。特別對於8000*8000超大地圖。
3.高性能對象池
傳統對象池只有一個list保存所有對象,每次使用循環遍歷查找未使用的對象。
這里的優化是新增一個隊列保存所有可使用的對象。每次對象使用完進行push_front的操作,每次使用通過pop_front獲取。
二.CPU優化
1.近似數學函數
開方、三角函數近似替換演算法,計算兩點間的距離(曼哈頓距離、牛頓迭代或者使用平方數值做比較),位移運算(針對頻繁的乘除2的n次冪)等。
2.演算法
在演算法的選擇上其實滲透在我們的每一個即使非常小的功能模塊,對於不是專門研究演算法的我們,演算法更多是一種意識。拒絕所有的時間復雜度O(n*n)的操作,永不高估CPU的計算性能,在現有的操作上力求更低的計算量。 然後有的放矢的去選擇適合自己項目的演算法。
3.分幀
分幀是比較壞的情況,因為這時候優化可能到了末尾。確實有一些cpu密集型的計算需要分幀甚至開線程來解決了。
PS:空間換時間。其實上面三條包括我的高性能的高斯模糊演算法那篇文章,基本上對於cpu的優化核心都是空間換時間。
三.GPU優化(Drawcall優化)
1.超大圖的切片
切片太小對於drawcall是非常有影響的,目前使用最大化切片2048*2048,並且圖片使用壓縮格式使用存在於緩存中。
2.合圖(多攝像機場景)
對於攝像機比較多的場景,由於底層是遍歷攝像機,每個攝像機執行一次場景的全部繪制。
所以在合圖的時候需要按照攝像機來分層合圖,不要把不同攝像機的圖片合到一起。
做為開發要能夠根據看到的場景預估drawcall數量,在判斷出異常的時候分步優化層級drawcall數量。

⑼ Integer 的常量緩存池

Integer中有個靜態內部類IntegerCache,裡面有個cache[],也就是Integer常量池,常量池的大小為一個位元組(-128~127)

Byte,Short,Long 的緩存池范圍默認都是: -128 到 127。可以看出,Byte的所有值都在緩存區中,用它生成的相同值對象都是相等的。

所有整型(Byte,Short,Long)的比較規律與Integer是一樣的。

熱點內容
在配置更新的時候沒電關機怎麼辦 發布:2024-05-18 20:36:10 瀏覽:926
win7訪問win2000 發布:2024-05-18 20:27:41 瀏覽:387
青島人社局密碼多少 發布:2024-05-18 20:19:10 瀏覽:733
無法存儲呼叫轉移 發布:2024-05-18 20:18:30 瀏覽:125
資料庫的調優 發布:2024-05-18 20:18:29 瀏覽:345
sqlserver注冊表清理 發布:2024-05-18 20:13:14 瀏覽:990
linux刪除連接 發布:2024-05-18 20:06:56 瀏覽:821
linux搭建雲伺服器平台 發布:2024-05-18 19:52:21 瀏覽:401
安卓怎麼關閉美易訂閱 發布:2024-05-18 19:29:16 瀏覽:643
蘋果手機配置代理伺服器怎麼開 發布:2024-05-18 19:29:07 瀏覽:230