2012年9月17日 星期一

AS3 -SetInterval V.S. Timer 效能對照

因為工作需求,所以對SetInterval 及 Timer做記憶體及每一週期所需時間做了稍為的比較


測試結論:
1.大致上可知道Timer的記憶體用量比SetInterval來的穩定,不會因為週期數而有影響
2.不過有一個地方比較詭異,當swf的FPS設定為24所算出來的週期時間是放大值
    設定值為42 ms,週期時間換算為83.32 ms ,調整FPS後,即接近設定值
3.設定值為42 ms會有2~3 ms的誤差值,不管是哪一個模式都會有

比較過後,Timer 的記憶體用量穩定度高 , 時間誤差都一樣,所以還是case by case,不過還是推薦用Timer,畢竟記憶體爆量可不好玩


測試數據:

Timer  
初始化記憶體(M) 使用後記憶體(M)  所花時間(ms)  加總值 周期所花時間(ms) 記憶體用量(M)
    2.7890625    3.7578125    41664    500    83.328    0.96875
    2.7890625    3.75390625    41628    500    83.256    0.96484375
    2.796875    3.76171875    22240    500    44.48    0.96484375
    2.78515625    3.75    22219    500    44.438    0.96484375
    2.79296875    3.7578125    44465    1000    44.465    0.96484375
    2.7890625    3.75390625    44470    1000    44.47    0.96484375
    2.796875    3.76171875    44476    1000    44.476    0.96484375
    2.7890625    3.7578125    44510    1000    44.51    0.96875
                       
setInterval  
初始化記憶體(M) 使用後記憶體(M)  所花時間(ms)  加總值 周期所花時間(ms) 記憶體用量(M)
    2.7890625    3.75    41660    500    83.32    0.9609375
    2.78125    3.74609375    22240    500    44.48    0.96484375
    2.7890625    3.75390625    22239    500    44.478    0.96484375
    2.78125    3.75390625    44426    1000    44.426    0.97265625
    2.7890625    3.76171875    44436    1000    44.436    0.97265625
    2.79296875    3.75390625    44480    1000    44.48    0.9609375
    2.7890625    3.765625    44485    1000    44.485    0.9765625

2012年9月4日 星期二

誠徵 Flash工程師 職缺

目前公司正在徵Flash工程師,下面是職缺需求:

需求: 1~2人

工作條件:
   Flash AS3:1年經驗

工作項目:
  1.flash game開發
 
福利:
   1.教育訓練
   2.勞健保
   3.三節獎金
   4.專案獎金


如果有興趣請mail到:matis@sgd108.com

2012年7月11日 星期三

Stage3D 2D Framework測試

最近為了做效能優化,所以使用了Stage 3D來提高效能

Stage 3D是透過GPU做加速運算

因此測試了2套2D的library,一套是Starling,一套是ND2D
下面是分析
-----------------------------------------------------------------------------
1,Starling
  優點:
      1.文件資源多
      2.版本更新算快的
     
  缺點:
     1.架構龐大要運用的話需要額外包一層Class才能方便使用
     2.記憶體用量比ND2D多了7 M
-----------------------------------------------------------------------------
2.ND2D
  優點:
    1.使用記憶體量比Starling少
    2.架構簡單,也可以透過其類似的架構 (ND3D) 寫3D Game
   
  缺點:
    1.文件嚴重短缺
    2.一般設定Sprite2D的FPS設定為24讀取時會過於緩慢,需設為60,但是對系統的loading並不會有影響
   
-----------------------------------------------------------------------------
比較表:
-----------------------------------------------------------------------------
Starling
 Flash Player記憶體用量[Stats]:56M   
 CPU:12%
 GPU:5%
 GPU RAM:370M
-----------------------------------------------------------------------------
ND2D:
 Flash Player記憶體用量[Stats]:49M   
 CPU:11%
 GPU:5%
 GPU RAM:370M
 -----------------------------------------------------------------------------

結論:
   在一些國外的測試數據上Starling的效能算是前2名內,再加上其文件資源很多,對於想要學習的人比較適合學Starling
   至於ND2D,他在記憶體用量少了 7M 主要是因為他的動畫結構比較簡單,在開發上比較容易,但是文件真的很少,初學者建議先學Starling了解stage3D的概念
   再去學ND2D會比較適當

2012年5月29日 星期二

Open RTMFP 伺服器架設教學

最近在使用Flash的P2P技術,找到了這一套免費的P2P status server,如果要用adobe的就要用FMS了

下面教大家怎麼安裝:

OpenRTMFP軟體需求:
1.lua 5.1版(不要用5.2的會出錯)
2.poco 1.4版
3.openSSL


請先安裝以下套件才可執行OpenRTMFP安裝
 1.gcc(lua需要)
     1-1.gcc
     1-2.gcc-c++
 2.unixODBC(poco需要)
 3.lua 5.1
 4.openSSL
 5.poco 1.4

poco 1.4 安裝
 1../configure
 2.make -s all
 3.sudo make -s install

LUA 5.1安裝
 1.make linux
 2.make install

OpenRTMFP安裝:
 1.進入RTMFP的lib目錄並執行make
  1.cd rtmfp/CurimusLib
  2.make
 2.進入RTMFP的Server目錄並執行make
  1.cd ../CurimusServer
  2.make
 
 執行:
  1.背景處理並使用預設port
   nohup ./CurimusServer &



FAQ:
 1.POCO安裝出現g++ command not found
  A:yum install gcc-c++
 2.LUA安裝出現/usr/bin/id: can not found -lreadline or -lxxxx
  A:使用ln建立動態link
   範例:
   2-1.cd /usr/lib64/
   2-2.ln -s readline.so.5 readline.so
  
   ln [-sf] 來源檔 目標檔
   ln -s readline.so.5 readline.so
    選項與參數:
    -s  :如果不加任何參數就進行連結,那就是hard link,至於 -s 就是symbolic link
    -f  :如果 目標檔 存在時,就主動的將目標檔直接移除後再建立!
   
 2.luaconf.h:275:31: error: readline/readline.h: No such file or directory
  luaconf.h:276:30: error: readline/history.h: No such file or directory
  A:yum install readline-devel
 
 3..sources/Script.h lua5.1/lua.h not found
  A:進入到有問題的檔案中修改"lua5.1/lua.h"改為"lua.h"就可以
   Script.h
   Script.cpp
   都會有該問題存在
   编辑Makefile,把-llua5.1修改为-llua
 4.編譯成功後執行出現錯誤:“error while loading shared libraries: libPocoFoundation.so.12”
  A:執行:
   32bit
    export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
   64bit
    export LD_LIBRARY_PATH="/usr/local/lib64:$LD_LIBRARY_PATH"

2012年5月8日 星期二

AIR 及 Android原生語言 效能測試

AIR Android原生語言 效能測試
測試方式:

使用相同For迴圈測試加總所需時間



測試程式碼(AS3):

var now:Date = new Date();

        var s1:Number, s2:Number, s3:Number, s4:Number, s5:Number;

        s1 = now.getTime();

        for(var i:int = 1 ; i < 10000001 ; i++){

                if(i == 10000000){

                        var time5:Date = new Date();

                        s5 = (time5.getTime() - s1);

                        t4.text = "千萬次花了" + s5.toString() + "毫秒";

                }else if(i == 1000000){

                        var time4:Date = new Date();

                        s4 = (time4.getTime() - s1);

                        t3.text = "百萬次花了" + s4.toString() + "毫秒";

                }else if(i == 100000){

                        var time3:Date = new Date();

                        s3 = (time3.getTime() - s1);

                        t2.text = "十萬次花了" + s3.toString() + "毫秒";

                }else if(i == 10000){

                        var time2:Date = new Date();

                        s2 = (time2.getTime() - s1);

                        t1.text = "一萬次花了" + s2.toString() + "毫秒";

                }

        }

}
 

測試數據:

Android模擬器(Android 2.2)

計算次數
Java原生(ms)
AIR(ms)
差異百分比
1萬次
8
14
1.75
10
79
33
0.417722
100
791
147
0.185841



實機測試(測試機種 SE Neo V Android 2.3)

計算次數
Java原生(ms)
AIR(ms)
差異倍數(AIR/Java)
1萬次
8
8
1
10
11
28
2.545454545
100
42
82
1.952380952



結論:

AIR在實機上比原生語言慢1倍,但實際觀察所耗時間(ms),還在可容許範圍內

如果使用AIR做複雜程式開發需考慮更好的效能及程式優化技巧

2012年4月10日 星期二

PHP memcached 新手教學

作業系統:Linux

1.安裝memcached yum install memcached

2.啟動memcached
 service memcached start

3.安裝PHP memcache extension
 yum install php-pecl-memcache

4.重新啟動http server
 service httpd restart

5.PHP測試memcached
 <?PHP
  $memcache = new Memcache; //Star memcache
  $memcache->connect('localhost', 11211) or die ("Could not connect"); //Connect Memcached
  $memcache->set('uname', 'appleboy');
  $get_value = $memcache->get('uname');
  echo $get_value;
  print "<br/>";
  $b = $memcache->getStats();
  print_r($b);exit;
 ?> 


參考資料:
 http://blog.wu-boy.com/2007/09/freebsd-%E5%AE%89%E8%A3%9D-memcache-for-php/

2012年2月14日 星期二

Adobe Edge-讓你用HTML5設計動態網頁

http://www.slashgear.com/adobe-edge-html5-app-could-eat-flash-from-the-inside-01168612/
Edge影片介紹
他主要是用HTML5作網頁動畫及操作,所以可以用flash的設計觀點去設計
不過程式語法是java script,現在看起來edge的完整性滿高的,而且他很有可能會是free的
因為他的js library是公開的,只要了解library就可以自行開發新的IDE介面出來

可以期待網頁美術人員製作出純HTML5的動態網頁!!!
資源:
http://labs.adobe.com/technologies/edge/resources/
Edge下載:
http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_edge

2012年2月13日 星期一

使用PhoneGap+Canvas實作含文字的相片

最近在測試PhoneGap的功能,所以寫了這個範例
主要是透過PhjoneGap的camera api取得相片之後,轉存到canvas物件內
在透過上傳到PHP server存檔
想學的朋友就直接看原始碼八~XD
PhoneGap version:1.3
上傳的圖片資料是使用base64字串,只要用PHP的base64解碼再轉成圖就可以做存檔的動作

-----------------------------------以下為原始碼----------------------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta charset="utf-8">
    <title>File Transfer Example</title>
    <script type="text/javascript" charset="utf-8" src="phonegap.js"></script>   
    <script type="text/javascript" charset="utf-8">    
    var pictureSource;   // 圖片來源
    var destinationType; //設定回傳的圖片資源類型
    var imageURI; //圖片URI資源
    var GPSText; //GPS文字
    var img = new Image();//DOM圖片元件
    //監聽Phonegap裝置準備完成事件
    document.addEventListener("deviceready", onDeviceReady, false);       
    //PhoneGap準備完成
    function onDeviceReady() {    
     //設定圖片來源
    pictureSource=navigator.camera.PictureSourceType;       
    //設定回傳圖片資源類型
      destinationType=navigator.camera.DestinationType;     
      //取得GPS座標
      navigator.geolocation.getCurrentPosition(onGPSSuccess, onGPSError); 
    }
    //取得GPS座標並產生文字
    function onGPSSuccess(position) {
            var element = document.getElementById('geolocation');       
            element.innerHTML = 'Latitude: '           + position.coords.latitude              + '<br />' +                           
            'Longitude: '          + position.coords.longitude             + '<br />' +                           
            'Altitude: '           + position.coords.altitude              + '<br />' +                           
            'Accuracy: '           + position.coords.accuracy              + '<br />' +                           
            'Altitude Accuracy: '  + position.coords.altitudeAccuracy      + '<br />' +                           
            'Heading: '            + position.coords.heading               + '<br />' +                           
            'Speed: '              + position.coords.speed                 + '<br />' +                           
            'Timestamp: '          + new Date(position.timestamp)          + '<br />';   
            GPSText = "緯度:" + position.coords.latitude + "經度" + position.coords.longitude;
    }   
    //GPS座標取得失敗 
    function onGPSError(error) {
            alert('code: '    + error.code    + '\n' + 'message: ' + error.message + '\n');  
            GPSText = "GPS尚未定位";
    }   
    //拍照
    function capturePhoto() {
     //使用裝置的相機拍照並存成base64編碼字串
     navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50 });   
    }
    //拍照完成,儲存相片資訊並顯示預覽
    function onPhotoDataSuccess(imageData) {          
      //除錯模式,使用log顯示圖片編碼字串
      //console.log(imageData);     
      //取得預覽圖片物件
      var largeImage = document.getElementById('largeImage');  
      //使用CSS開啟預覽圖片的顯示
      largeImage.style.display = 'block';    
      //顯示圖片
      largeImage.src = "data:image/jpeg;base64," + imageData;       
      //img圖片資源
      img.src = "data:image/jpeg;base64," + imageData;       
    }   
    //拍照失敗  
    function onFail(message) {     
     alert('Failed because: ' + message);   
    }        
    //繪製GPS文字到Canvas畫布上    
  function drawGPSText() {
      //取得 Canvas物件
      var ctx = document.getElementById('canvas').getContext('2d');
      //繪製拍照出來的相片到Canvas畫布上
      ctx.drawImage(img,0,0,600,480);
      //設定GPS文字格式   
      ctx.font = 'bold 14px sans-serif';
      ctx.fillStyle    = '#FFFFFF';
    ctx.textBaseline = 'top'; 
    //繪製GPS文字到Canvas畫布上
    ctx.fillText  (GPSText, 0, 450);
  }
  //傳送圖片資料到PHP Server上並存檔成png圖檔
  function sendDataToServer(){
    var img = document.getElementById('canvas').toDataURL("image/png");
    if(img != null)
     post_to_url('http://www.sbiec.com/phonegap/canvasUpload.php', {'data':img});
  }   
  /*傳送資料到http server,使用DOM建立一個空白表單傳送資料到HTTP Server
  參數:
   1.path:HTTP Server URL路徑
   2.params:參數陣列
   3.method:傳送方式 get,post
  */
  function post_to_url(path, params, method) {
    //設定預設方法為POST,GET會有200字元上限限制
      method = method || "post";

      //建立空白表單
      var form = document.createElement("form");
      //設定方法
      form.setAttribute("method", method);
      //設定URL路徑
      form.setAttribute("action", path);
     //設定參數陣列
      for(var key in params) {
         //建立隱藏欄位物件
          var hiddenField = document.createElement("input");
          //設定屬性為隱藏
          hiddenField.setAttribute("type", "hidden");
          //設定名稱
          hiddenField.setAttribute("name", key);
          //設定值
          hiddenField.setAttribute("value", params[key]);
      //將參數新增到空白表單內
          form.appendChild(hiddenField);
      }
    //將空白表單加入到網頁文件
      document.body.appendChild(form);
      //執行送出
      form.submit();
  }
    </script>
    </script>
</head>
 <body>      
 <br>
 <button onclick="capturePhoto();">From Camera</button>
 <br />      
 <button onclick="drawGPSText();">draw Image with GPS text</button>
 <br />      
 <p id="geolocation">Finding geolocation...</p> 
 <br />       
 <canvas id="canvas" width="600" height="480">Canvas is not ready.</canvas>
 <br />      
 <img style="display:none;" id="largeImage" src="" /> 
 <br />      
 <button onClick="sendDataToServer();">SendDataToServer</button>
 </body>
</html>


更新:Android 2.3 才能使用Canvas Base 64 上傳功能