Wednesday, May 29, 2013
Monday, May 27, 2013
Monday, January 14, 2013
Friday, October 19, 2012
詭異的 iCloud
現在寫的 App 支援 iCloud,因為儲存的格式改變,得先把已存在 iCloud上的資料清除,然後上傳新的格式來對應新的改變(還在開發階段,所以沒有相容的問題)。鬼打牆了幾個小時後終於開始運作了。
iOS 5 的 iCloud 很怪,居然缺了最基本的功能,導致在 iOS 5 上需要至少一個檔案在 iCloud 上,然後監視這個檔案的狀態來做對應的處置(比如 user 登出iCloud)。雖然 iOS 6 解決了這個問題 (NSUbiquityIdentityDidChangeNotification of NSFileManager),但是我不想寫兩份code啊!
測試的 device 分別是含iOS 5 的iPhone 4,和已經更新 iOS 6 的 new iPad。我遇到的問題是這樣:
- 移除App後,用 iPad的Settings清掉iCloud的資料。(Settings -> iCloud -> Storage & Backup -> Manage Storage -> Your App under "Documents & Data")
- 移除 iPhone 上的 App。
然後開始在 iPad 上測試,詭異的事情發生了,設定裡已經看不到舊的資料,但是執行程式時
[[NSFileManager defaultManager] isUbiquitousItemAtURL:url];
卻一直傳回TRUE,表示這個資料已經存在,而且還真的存在,會讀到舊的資料然後因為格式不符而執行異常。但是在 iPhone 上試的話則回傳 FALSE,因此 App 就做份新的資料並上傳。實在沒時間深究原因,最後就直接用 iPhone 上傳,然後再用 iPad測試,終於正常了。
iOS 5 的 iCloud 很怪,居然缺了最基本的功能,導致在 iOS 5 上需要至少一個檔案在 iCloud 上,然後監視這個檔案的狀態來做對應的處置(比如 user 登出iCloud)。雖然 iOS 6 解決了這個問題 (NSUbiquityIdentityDidChangeNotification of NSFileManager),但是我不想寫兩份code啊!
Tuesday, October 2, 2012
Objective-C 101 [000]
我也寫過c/c++,但那不合我的胃口;痛苦太多,收穫太少。
NSClassFromString
[AnyNSObjectClass conformsToProtocol:@protocol(AnyProtocol)];
[AnyNSObject conformsToProtocol:@protocol(AnyProtocol)];
在c++裡,interface這個詞表示的是一個包含一組method的class,這個概念在Objective-C裡叫作protocol,Objective-C裡interface這個關鍵字被拿去定義class用了。conformsToProtocol讓我們可以知道任一物件是否實作了某個介面,作用與windows COM的QueryInterface類似。這讓我們處裡容器中的物件時,有辦法對特別的物件做處理,比如有些物件有計時器,有些沒有,那就可以設計一個「計時器protocol」來運用。
[AnyNSObject respondsToSelector:@selector(aSelector)];
這讓我們可以檢查任一物件是不是能接受指定的message,比較常用到的地方是檢查 iOS 的版本,有些message是後來才加入的,詢問物件對message的反應可以做為要不要使用某個功能的依據(沒有反應表示該device的OS版本不支援)。
這只是玩笑話,我覺得Objective-C好用的地方在有個好用的 foundation framework,整個系統也因此能做一些 c/c++ 不易完成的工作,這也是最吸引我的地方。太久沒寫東西實在不知如何下筆,就先從條列式的文章開始吧。
NSClassFromString
NSStringFromClass
在app執行的時候,class也只是一個指標,神奇的是我們可以拿到這個class的名字(一個字串),也可以用名字找到對應的class,這使得程式與腳本更容易結合,比如當我希望在遊戲的某個角落放置一個特定的物件,在設定檔裡可以直接記錄物件類別的名稱,執行時就有機會生成對應的物件了。
[AnyNSObjectClass class];
[AnyNSObject class];
則可以取得類別的指標。
[AnyNSObjectClass class];
[AnyNSObject class];
則可以取得類別的指標。
[AnyNSObjectClass conformsToProtocol:@protocol(AnyProtocol)];
[AnyNSObject conformsToProtocol:@protocol(AnyProtocol)];
在c++裡,interface這個詞表示的是一個包含一組method的class,這個概念在Objective-C裡叫作protocol,Objective-C裡interface這個關鍵字被拿去定義class用了。conformsToProtocol讓我們可以知道任一物件是否實作了某個介面,作用與windows COM的QueryInterface類似。這讓我們處裡容器中的物件時,有辦法對特別的物件做處理,比如有些物件有計時器,有些沒有,那就可以設計一個「計時器protocol」來運用。
[AnyNSObject respondsToSelector:@selector(aSelector)];
這讓我們可以檢查任一物件是不是能接受指定的message,比較常用到的地方是檢查 iOS 的版本,有些message是後來才加入的,詢問物件對message的反應可以做為要不要使用某個功能的依據(沒有反應表示該device的OS版本不支援)。
Wednesday, April 4, 2012
2d shadows with multiple light sources
On iPhone4 with retina, render 3 objects with 5 point light sources. To test the limitation of GPU, I achievement this by 4 passes:
- render every objects on a texture (shadow map).
- render background on the frame buffer.
- render point light one by one, multiple pixel color with alpha on shadow map (shifted coordinate).
- render all object again.
This scene can be rendered in 30+ fps. I think it can be better with more optimization, but the defer method seems not good on this platform.
當二維的場景需要影子時,大概都會直接貼圖搞定吧,這次碰到可能需要多光源的情況,就想試試 defer rendering 加 shadow map 的效果,雖然伙伴們說應該不會碰到這種情況,但是我手癢,所以就花了一天亂試,效果還不錯,但是效能上需要改善,主要的瓶頸大概是:
- alpha blending 讓 tile based defer rendering 沒辦法加速。
- fill rate,在我的 iPhone4上,5 個batch填 130x100x100x4 pixels, 差不多是60fps的極限(大約可以填滿八個retina 全螢幕)。
- batch,defer shading 的大量光源需要大量的 batch。我用 40個batch畫 100x100x4 pixels,就開始不到 60fps了。
Subscribe to:
Posts (Atom)