簡體   English   中英

Javascript優化:在V8和IE上存在問題

[英]Javascript Optimization : issue on V8 and on IE

我目前正在嘗試優化用Java編寫的游戲引擎。 我遇到了很多問題,但是這里有2個問題讓我有點頭緒。

我有一個代表玩家游戲單元的類。 玩家有4個單位,都是在游戲開始時創建的。

我正在使用非常簡單的東西,像這樣:

function PartyCharacter()
{
this.Armor ;
this.FireResistance ;
this.CriticalStrike ;
// a hundred more like that
}

我當時認為未初始化屬性值不是很安全/良好的設計,並且它可能會影響有關變量類型的javascript優化,因此我為它們分配了一個基本值:

function PartyCharacter()
{
this.Armor = 0 ;
this.FireResistance = 0 ;
this.CriticalStrike = 0 ;
// a hundred more like that
}

它使我在Firefox上的性能有了小幅提升,但是卻使我在chrome上的整體性能下降了300%。 我很難弄清楚是什么原因造成的。 我唯一注意到的是性能下降是在一定數量的變量初始化之后發生的(大約15左右)。 如果僅初始化14,性能將保持“正常”。 只要再加上一個“ = 0”,性能就會下降很多。

我檢查了chrome profiler,問題似乎在於它現在無法優化代碼中的其他功能(對該功能進行過多的優化)。 這個新的V8優化問題所關注的2函數不會直接與播放器的單元進行交互,但是會調用其他函數。 我已經嘗試過在V8上使用--trace,但由於我一直在Widnow上,僅將stdout重定向到一個協和窗口是很痛苦的,並且Windows不允許復制/粘貼,並且垃圾郵件太亂了以至於無法在其中讀取和獲取信息。

我對這種行為一無所知。

同樣,我很努力地將這些變量聲明為原型,因為Player單位的所有實例都使用它們。 它使FF和Chrome的性能都下降了20%。 我不知道為什么。

如果可以這樣做:我可以訪問這些變量A LOT並對其進行很多更改。

function PartyCharacter()
{

}
PartyCharacter.prototype.Armor = 0 ;
PartyCharacter.prototype.FireResistance = 0 ;
PartyCharacter.prototype.CriticalStrike = 0 ;

當前讓我難以理解的另一件事是我在瀏覽器之間獲得的性能差異。 FF / Chrome差不多,但是IE總是慢3倍。

我已經嘗試了60秒來分析游戲,並查看IE上是否存在瓶頸,但是,僅從分析結果來看,我認為IE更快,O_o我肯定會丟失一些東西。

我知道FF(使用firebug atm)和IE的事件探查器的工作原理有些不同,但我無法解釋我的性能分析會話的結果。

在兩個會話中,函數調用數的比率相同。 因此,游戲邏輯不會對IE產生影響,只有在功能內部花費的時間才能解釋速度差異。

我看到在IE上,我有2個函數的“自”時間(不包括在內部調用的函數)要比FF上的相應函數高得多:IE上為33%+ 17%,FF和7%+ 2%。

問題在於,這些功能的平均時間在IE上比在FF上短。

這意味着在兩個瀏覽器上被調用相同次數的函數,在IE上執行得更快,但同時卻花費了整個游戲過程的更多時間? 哪里有問題,.....但是我不能指望它是什么。

這是我的FF分析數據的pastebin: http : //pastebin.com/sjxWaz6p#

對於IE來說也是一樣: http : //pastebin.com/9NW1E0bg#

將原始數據復制/粘貼到excel中,您就可以開始工作了!

通常,在構造函數中初始化字段絕對是有道理的,並且應該可以改善性能。 您的第一個代碼段( function PartyCharacter() { this.Armor ; ... )不創建任何字段。 讀取 .Armor字段,該字段不存在,因此讀取返回undefined 以任何方式更改的對象; V8並不以此暗示該屬性也將在以后創建。

初始化這些字段時看到的速度變慢可能是由於其中存儲了不同的類型。 V8對類字段進行一定數量的類型跟蹤,但是當這些類型在執行后期更改時,可能會導致性能損失。 以后存儲的所有值都將是整數嗎? 他們會成為雙打嗎? 它們是字符串/布爾值/對象嗎? 嘗試將字段初始化為undefined (如果它們稍后將存儲對象;或者如果它們僅是數字,則為NaN ),看看是否有幫助。

如果以后要覆蓋它們,則初始化原型上的屬性將無濟於事(因為這些寫操作不會傳遞給原型,因此它們會在對象本身上創建字段)。 另一方面,如果它們是“常量”(即從未更改),則將它們存儲在原型中是保留它們的最節省內存的方法。

(我對其他瀏覽器一無所知,因此我無法解決與FF / IE有關的問題。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM