標籤:android style blog color 使用 os io strong
題記) cocos2d-x似乎很好,然其不同版本的差異性,相容性讓人無奈,其在wp下webSocket的問題,Sqlite的問題似乎始終抹不去,U3D似乎看起來不錯,開發幀-幀的調試確實不錯,基於Mono的運行環境,然在中低端機器下,3D似乎運行總是那麼不完美,2D看起來似乎總是那麼差。然引擎而已,有高有低,所有的應用-遊戲對於程式員來說,最終都是比的內功。
1)安卓的坑
開發第一個項目的時候,需求是遊戲+應用的結合,應用部分的圖片量相當的大,整個頁面幾乎全是圖片,連文字都是使用圖片打上去,遊戲部分為cocos2dx。
整個系統使用TabActivity,小雷音寺繞過ASM自行管理Activity誕生的選項卡切換是多麼的優美,直到它的出現:OOM。
在安卓系統中OOM一般分為總體OOM和單個OOM,單個OOM為一個資源載入後出現OOM,總體為記憶體中全部資源載入總和產生OOM,由於項目選項卡多達10餘個,
在切換選項卡後,小雷音寺並沒有及時的釋放前一個選項卡資源所佔用的記憶體,當快速多次切換選項卡後,出現OOM。
經過多次折騰,決定使用Fragment替換小雷音,並且將所有的資源全部手動載入,手動GC,在不同的機型測試後,效果不錯,感覺一切似乎都是那麼完美,直到它的出現:
小米3,裝在小米3後,多次切換後,毅然OOM,似乎手動GC對其並沒有生效,調試之,果然,在其他手機上手動GC後記憶體被釋放,然在小米上,手動GC後,資源依舊存在,當再次載入後直接記憶體取出,看來手動GC在小米上生效了,但是小米什麼時候才真正的GC,它說了算。由於圖片資源較大,於是一次載入背景大圖後,OOM。
不得已之,針對小米3使用程式切換,將資源切成小橫條,逐個載入,減少進入大小,同時捨棄效果極度壓縮圖片。小米3成功帶來了一天一夜的工作時間,為成長的道路添加了一點能量。
2)HTML5的坑
由於小遊戲發展不錯,公司決定花點時間差不多一天開發2-3個類似神經病貓的東西,於是著手寫了一點小東西,由於在移動端,瀏覽器核心導致雙擊放大,單擊會有300毫秒的延遲,這300毫秒乃水果公司在行動裝置剛起步的時候為了更好的在移動端展示頁面設計,被各個行動瀏覽器複製,這裡有一個問題,便是當點擊了行動裝置的超級連結,瀏覽器不知到是真的要跳轉,還是雙擊放大,於是便誕生了300毫秒延遲,如果300毫秒產生了第二次點擊,則雙擊放大,如果沒有,則視為一次點擊。
今天,由於響應式布局的產生,雙擊放大的效果不再適用了,人們迫不及待的要去掉它,於是google率先產生了:
<meta name="viewport" content="user-scalable=no"><meta name="viewport" content="initial-scale=1,maximum-scale=1">
如此以來便可以禁止雙擊放大,然而這個解決方案看似完美,但也帶來一個明顯的缺陷 —— 你必須完全禁用縮放來達到目的,而從移動端網站的可用性和可訪問性來看,縮放是相當關鍵的一環。你很可能已經遇到過這個問題,即你想要放大一張圖片或者一段字型較小的文本,卻發現無法完成操作。只能說 Android 平台上的 Chrome 和 Firefox 瀏覽器提供的禁用縮放最佳化,僅適用於 web 遊戲等某些特定的情境,但多數網站並不能從中獲益。
於是google又想出了一個辦法:
<meta name="viewport" content="width=device-width">
這條代碼告訴瀏覽器將視口大小設為裝置本身的尺寸。這在 iPhone 上的效果就是把視口寬度從預設的 980 像素改為 320 像素。
這樣可以解決螢幕顯示問題,同時可以禁掉雙擊放大的效果,沒有了雙擊放大,自然不存在300毫秒的延遲,本以為一切是這麼的順利,知道遇到了 它:
小米,當應用在小米上用開啟後,雙擊放大效果消失,點擊後依然存在300毫秒的延時,點擊事件在延遲了300毫秒後才被成功執行。唯獨在小米手機上。
行動瀏覽器上觸發click事件與一個物理Tap(敲擊)之間存在300毫秒的物理延遲,一切似乎都那麼說不通卻又擺在面前不得不解決。
既然行動瀏覽器的事件存在延遲,那麼如果接收並且處理瀏覽器事件並不是瀏覽器,而是由我們自己的代碼去接收並且處理呢,這樣似乎可以徹底解決這個問題。
大概google之後發現一個東西:FastClick,看了大概,其便是模仿瀏覽器處理事件,代替瀏覽器內建觸屏事件,同時發送訊息,響應使用者:
var methods = [‘onMouse‘, ‘onClick‘, ‘onTouchStart‘, ‘onTouchMove‘, ‘onTouchEnd‘, ‘onTouchCancel‘]; var context = this; for (var i = 0, l = methods.length; i < l; i++) { context[methods[i]] = bind(context[methods[i]], context); }
可以設定哪幾種事件被接收,同時類比事件處理:
FastClick.prototype.sendClick = function(targetElement, event) { ‘use strict‘; var clickEvent, touch; // On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24) if (document.activeElement && document.activeElement !== targetElement) { document.activeElement.blur(); } touch = event.changedTouches[0]; // Synthesise a click event, with an extra attribute so it can be tracked clickEvent = document.createEvent(‘MouseEvents‘); clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); clickEvent.forwardedTouchEvent = true; targetElement.dispatchEvent(clickEvent);};FastClick.prototype.determineEventType = function(targetElement) { ‘use strict‘; //Issue #159: Android Chrome Select Box does not open with a synthetic click event if (deviceIsAndroid && targetElement.tagName.toLowerCase() === ‘select‘) { return ‘mousedown‘; } return ‘click‘;};
申明我們的系統使用FastClick只需要:
FastClick.attach(document.body); Array.prototype.forEach.call(document.getElementsByClassName(‘test‘), function(testEl) { testEl.addEventListener(‘click‘, function() { textInput.focus(); }, false) }); }, false);
在小米上,終於沒了300毫秒的黑色延遲。
後記)
開發的道路上,越行越遠。。