顯示具有 Javascript 標籤的文章。 顯示所有文章
顯示具有 Javascript 標籤的文章。 顯示所有文章

2012年6月26日 星期二

[新案上線] TOYOTA 86


Toyota 86 (強列建議使用Chrome或Safari觀看…。)
http://www.toyota.com.tw/cars/86


 第一次完整獨立完成一個純js的商業案。
最近為了這個案子傷了不少腦袋。
這是一個html的網站,目標是要能在所有的裝置及瀏覽器上觀看,所以flash馬上被排除,但是又希望能做到像flash一樣精彩的效果,乍看之下其實沒什麼,就是播播影片而已嘛。
剛開始我參與會議時心裡也是這麼想的,應該沒什麼。

不過真正執行後就開始遇到一些問題了。

首先是影片的問題,整個網站的幾個主要大單元是由影片串場的,因為原本的需求是希望隨時能在影片中的某一個場景停下來(甚至是倒播),又希望整個串場個過程能夠順暢,因此評估之後我們採用了大量的連續圖檔來處理這一塊。
為了要讓影片播放順利,所以需要預先載入一定量的圖檔,這跟影片的buffer是一樣的道理,只不過在載入的過程中我發現電腦的記憶體使用量大量的爆增,直到整台電腦的記憶體都被吃光之後,載入的動作就會發生錯誤,這時即使再釋放記憶體,再重新載入新的圖片也會失敗,原因不明。
所以要在何時適放部份的記憶以及何時開始播放影片、何時載入新的圖檔,變成了這個案子最花工的地方…。
不過也因為這樣無意中發現了Chrome及Safari在記憶體的配置處理上真的比FF及IE厲害許多。

但礙於實在有太多圖檔無法適放,因此在部份電腦的FF及IE下,還是會發生記憶體不足的情況,因此只能說這仍然是個不完整的案子…。

另外一個問題就是手持裝置的效能問題。

原本我的寫法是用兩個div去輪流播放當下該出現的圖片,為什麼要用兩個?其中一個要墊在下面,先放入下一張圖,這樣才不會造成閃爍,這個概念好像叫做double buffer。
不過這樣的話,吃cpu似乎吃得還挺重的,在手機上(我個人是使用HTC Sensation)整個畫面跑起來非常吃力,一點都不流暢。
所以後來就在上線前我馬上改寫成canvas,但為了讓IE系列仍然能正常觀看,所以IE仍然是使用div來播放。
我想現階段這方面的效能也只能這樣調整了,至少部份的手機上跑起來雖沒有很快速但也可以接受。

再來就是音效的問題。

音效原本我是使用HTML5的Audio來處理,但是FF不吃mp3,只吃wav,這下子不得了,光背景音樂wav就要5mb,所以最後折衷,唯獨音效的部份使用了flash,放棄了行動裝置上的聲音效果。

開發心得大概是這樣,其它很多是比較細節的(解析度的調整、js的物件技巧、從外部load單元進來呈現… 等等)就不再額外提了。
但是真的是從這案子吸收到不少經驗。

2012年1月16日 星期一

Javascript用prototype進行繼承會發生的奇怪現象



這問題真的很奇怪,而且很難理解。
測試網址如下(code很簡短,可直接看原始碼):
http://labs.medialand.com.tw/jason/html/inheritance/test1.html

狀況是,
1. 建立一個Test的類別,在建構子時宣告並初始化一個陣列testValue。
2. 在Test類別建立一個function addValue,用來將傳入的值push到testValue裡。
3. 在Test類別建立一個function destroy,用來將testValue清空。
4. 建立一個AA類別繼承Test類別。
5. 實體化一個AA類別,變數名稱a1,呼叫a1.addValue(123)將123這個值push到a1.testValue裡。
6. 呼叫a1.destroy()來清空a1.testValue。
7. 目前看起來都正常,怪的來了。
8. 實體化另外一個AA類別,變數名稱a2。
9. 直接取得a2.testValue,居然不是空值,而是123!!!
照道理說,testValue裡有123這個值,不管怎樣也是屬於a1這個instance的,不應該會出現在新new出來的instance裡。更何況在a1的時候已經執行過一次destroy來清掉testValue了。
無法理解。
這種情況目前測試,只發生在testValue非一般常數型態的變數上,數字跟字串不會發生這種情況,在array或object上就會發生這種異常的狀況。

解決方法應該有很多,目前我覺得我自己最喜歡的方式,就是在AA類別的建構子裡再一次強制呼叫父類別Test的建構子,就像AS3裡的super();一樣。
再測過一次後這個問題就會被解決。
修正過後的測試網址如下(差別只在於AA的建構子裡多了一行):
http://labs.medialand.com.tw/jason/html/inheritance/test2.html