2014年12月24日 星期三

[Jenkins] 安裝Jenkins到Mac上的一些狀況

如果你的Git repository跟Jenkins是放在同一台Mac上的話,直接用Jenkins官網
的安裝檔來安裝Jenkin比較好,不要用Bitnami的Jenkins。

試過用Bitnami的版本時git很容易出問題,主要是會卡在無法clone 自機的 git repository
(抓github的倒是沒問題)。但是在terminal我自己下command又可以clone。改成
直接用Jenkins官網的安裝檔來使用時就可以了。

推測原因是bitnami的Jenkins是跑在app上,而他自己所取用的git是app package中
自帶的git,(似乎呼叫自機本來的git會有一些權限上的問題,有看到一些App sandbox 的錯誤訊息),但是app中自帶的git版過舊,無法辨識新版本的git repository,而 且無法更新git(原因應該是git包在app package中)。

安裝時Jenkins我碰到兩點要注意:

  1. 安裝git plugin時要選對Git plugin這個選項,我一開始只選了git client這個plugin,會 在專案設定中找不到設定要用git的選項。
  2. 安裝完plugin要重開Jenkins時,在網址上輸入localhost:8080/restart 即可,我一開 始找半天不知道該怎麼重新開啟。
以上的原因是我自己猜測,不知道對不對就是了....

2014年11月22日 星期六

[Open source] Unity版本2048練習

嗯....好久沒爆肝寫程式了....

花了三個晚上寫了一個2048的變種版本,可能還是有一些bug沒測到,不過先這樣放出來吧~

做了一點小改變:
1.每完成五次方塊合併後會隨機選擇原有的方塊產生一顆炸彈(先這樣稱呼吧),以紅色外框標示。
2.倘若該炸彈被成功消去的話,會將相同數字的方塊一同升級。

例如有個數字為32的方塊成為了炸彈,在成功將此方塊合併為64後,場上所有數字為32的方塊也會同樣變成64。

程式碼在gitHub:
https://github.com/stanley1108/Practice_2048

好累,來去睡覺.....


2014年7月30日 星期三

UnityVS免費版本釋出

Unity預設是用MonoDeveloper編輯以及除錯程式碼,但是到了MonoDeveloper4.0之後的版本很容易crash(不知道是Unity或是mono的問題),特別是在debug中再去改動程式碼的時候。

UnityVS是一個收費的Unity plugin,可以讓我們在Unity中使用virtual studio除錯,原本的Unity是只能用VS編輯但不能除錯。

前陣子Microsoft宣布收購了UnityVS的開發商,並將免費發布給使用者,今天正式發布了。

http://blogs.msdn.com/b/visualstudio/archive/2014/07/29/visual-studio-tools-for-unity-1-9.aspx

用了一下下發現有個好處是,當我們用UnityVS debug時其實不能再去改動code,算是強制避免了一些問題。

2014年7月24日 星期四

[XCode 6 beta 4] iOS8 beta 4無法取得Location的問題

在ios8中,要在plist裡加上NSLocationWhenInUseUsageDescription這個property,否則LocationManager的didUpdateLocations 不會正確被呼叫到。

NSLocationWhenInUseUsageDescription是在iOS8才出現的關鍵字。

http://stackoverflow.com/questions/24874997/core-location-not-working-in-ios-8
http://stackoverflow.com/questions/24717547/ios-8-map-kit-obj-c-cannot-get-users-location

2014年5月20日 星期二

Unity上開啟WebView(iOS/Android)

Unity上有提供Application.OpenURL(string)的函式來開啟網頁,但是這功能其實是開啟safari/chorme中的網頁,而不是在Unity的app中打開網頁。那麼,要如何做到在Unity app中內嵌一個網頁呢?

https://github.com/Kogarasi/Unity-Webview

gitHub是我們的好朋友~XD

這個專案看來應該是延續gree的webView做修改的:
   https://github.com/gree/unity-webview

使用上並不難,看一下它的範例檔就可以了。但是我有碰到幾個問題:

1.開啟了第一個url後,如果要開另一個url的話會沒有反應,會閃一下然後又開啟第一個url。這個問題在Mac上沒有發生,但是在iOS上會出現,我不確定PC/Android是否也有這個問題。
   解決方法是Destroy第一個webView後,另建一個新的WebView來開啟新的url。

2.在Android上有碰到網頁雖然開啟了,但是卻無法操作的狀況,在討論中有提到怎麼解決:
   https://github.com/Kogarasi/Unity-Webview/issues/2

   基本上就是改動AndroidManifest.xml中的設定,在Unity官網上其實本來就有講到這個部份,不過我跟Android不熟就是了XDD
   http://docs.unity3d.com/Documentation/Manual/PluginsForAndroid.html

以上

2014年4月7日 星期一

iGov

在FB上說好的五毛黨遊戲prototype。
雖然到這場運動都要暫時喘一口氣時才生出來一個prototype,但總算還是弄出了點東西。

https://github.com/stanley1108/iGov

2014年3月9日 星期日

[翻譯]Unity, C#, .Net Mono的記憶體節省方法

[翻譯]Unity, C#, .Net Mono的記憶體節省方法

這篇斷斷續續混了好久才翻完....

==以下為翻譯內文=================================================
iOS上的Unity使用非常早期的Mono heap記憶體管理機制。這個機制不包裝中介層,所以一旦你讓heap碎片化,它會直接抓一塊新的記憶體給你。我的印象中Unity的實驗室怪傑們在做一個新的heap管理機制來處理這個問題,但現在即使是一個沒有memory leak的遊戲也會因為不斷增加的記憶體數量而耗盡記憶體。

C#是個有趣的程式語言,可讓你在不犧牲可讀性的狀況下快速寫出功能強大的的程式碼。然而事情的另一面是撰寫C#程式碼會自然的生出許多的garbage collection,解決掉這問題的唯一方法就是消除或是減少heap allocation。我在不減少功能性的情況下列了個簡單的解決方案清單。

最終的效果就是你的C#程式碼會看起來更像是C++,而且你將失去一些C#所帶來的威力,不過這就是人生。作為獎勵,heap的alloc在CPU上會比stack alloc更加集中(應該是指不會那麼頻繁alloc),所以你應該可以節省下一些frame time。

要標定記憶體削減目標時,Unity profiler可以幫你找到哪些function做了很多allocation。它並沒有提供很多資訊,但至少有。打開Profiler後啟動你的遊戲,選擇CPU profiler並點選GC Alloc欄位,這樣可以依照GC狀況的糟糕程度來排出先後。先使用下列的方針來處理這些function:

  • 避免使用foreach()。這會在你的list type中呼叫GetEnumerator(),進而allocate一個很快就會被殺掉的enumerator在heap中,你得改用更囉唆的c++ for(;;)語法才行。
  • 避免使用string。string在.NET中是建立在heap中且長度不可變的。你無法像c語言的版本一樣操作string。就UI而言,使用StringBuilders來建立一個string會是個對記憶體較有效率的作法,它會延遲轉換成string的時機直到最後需要的時候才做。你依然可以用string作為keys(應該是指Directory的key),因為literals應該要指到記憶體中的同一個instance,但是別太過度去操作string。
  • 使用struct。Struct型別在mono是allocate在stack中,所以當你有個工具類別不想要放掉,用struct。記住struct是傳值(而不是傳reference),使用到struct時可以加個ref的修飾字在函式參數前以避免copy的效能損耗。
  • 用structs取代固定大小且在scope內array。如果你有個固定大小而且在scope內的array(像是只在某function內存在),考慮建立一個member array(class內)或是一個struct來代替(或暫存)它。我曾經將每個frame中呼叫spline class都要建立的Vector3[4]改成用一個有四個欄位的ControlList struct代替。我只需要多加一個[]屬性來做為index存取用,而這省下了大量使用該函式而產生的allocation。(註,簡單說來就是用多一些stack或是事先建立好暫存的資料來避免動態allocation)
  • 填入ref傳入的lists優先於回傳一個新的lists。傳進去時我們還是需要heap-alloc一個list,所以聽來像是沒有省下什麼東西?但是這讓我們可以使用下一個最佳化的骯髒手段。
  • 考慮暫存一個常使用的function內的資料為class member。如果你有個funciton每次呼叫時都要用到很大的list,把那個list存成class member讓該資料空間可以一直保存下來。在C#中呼叫.Clear()並不會清掉buffer,所以在下一個frame時我們幾乎或不會有任何的allocs。這看起來很髒也讓程式碼不好讀,但是可以產生很大的效能差異。
    (註,一樣是用事先暫存的手段)
  • 避免IEnumerable extension methods。不用說,大多的Linq IEnumerable extension methods就如同他們有多好用一樣的也同樣會建立一些allocations。然而令我驚訝的是,在IList<>中呼叫.Any()應該只是呼叫一個Count>0的虛擬函式計算,在這裡卻會觸發一個allocation。其他在IList<>中微不足道的操作在IEnumerable中都會有同樣狀況,像是First()以及Last()。如果有人可以告訴我原因的話我會很感激的。基於如此以及foreach()的問題,我目前會說避免使用IEnumerable abstraction作為interface,改用IList<>。
  • 盡量減少使用function pointer。將一個類別方法放到delegate或是一個Func<>中會導致box(轉型成c#物件的動作,http://msdn.microsoft.com/zh-tw/library/25z57t8s(v=vs.80).aspx),而這會觸發一次記憶體配置。我找不到可以儲存一個method link而不觸發boxing的方法。我留下了大部分的function pointer,因為它在解耦物件關係上有極大幫助,所以對我來說還好,但我也處理掉了一些。
  • 小心複製material。如果你從任何的renderer中取得material property,這個material會在你即使沒做任何事的狀況下也會clone一份。這個clone出來的material不會被GC掉,除非你換了關卡或是呼叫了Resources.UnloadUnusedAssets(),否則它不會被清掉。如果你沒有要改動該material,改用myRenderer.sharedMaterial。
歡迎各位給予指教。

2014年1月6日 星期一

貓也會的:如何用Unity iOS開啟另一個Unity程式

其實很簡單,是利用URL Scheme的方式。

先假設要被開啟的APP叫做BeenOpenAPP,然後要開啟別的程式的APP叫RootAPP。

第一件事當然是先建立BeenOpenAPP這個APP,但要注意的是不要直接在Unity中Build and Run,接下來必須要在XCode project中做一些手腳。
第二件事是在Unity所建立的BeenOpenAPP專案檔中的Info.plist中加上我們要作為識別用的URL Scheme:



在這個例子裡我就直接設定叫做BeenOpen。

然後,在RootAPP的Unity程式碼中找個你想要開啟BeenOpenAPP的地方,加上:
    Application.OpenURL("BeenOpen://test");
這樣會去開啟有BeenOpen這個URL Scheme的app(也就是我們的BeenOpenAPP)。

而後面所帶的"test"可以用另外的方式在native code中取出來,但會需要修改到BeenOpenAPP的XCode專案檔,再用UnitySendMessage()的方式由iOS的native code傳送這個訊息到Unity中。


我自己試驗的時候有意外碰到一個小問題,是Unity所建立出來的App都會是同一個,也就是說我建好的BeenOpenAPP會在Build出RootAPP時被蓋掉。

解決方法是在Xcode Build Setting中設好Product Name,因為從Unity直接Build出來的Xcode Project會預設Product Name就是"Product Name",所以才導致後build的App會蓋掉先前的。
Build Setting->Packaging->Product Name


參考資料:
http://fredandrandall.com/blog/2011/07/30/how-to-launch-your-macios-app-with-a-custom-url/