2009年11月6日星期五

一個挑戰!

最近在處理圖片時出現了一個頗為嚴重的瓶頸。由於一個角色是由多個部份的圖片合成出來,在實時繪畫上,少不免會花上一點時間;而在我的 iPhone 2G 實機上測試出來的結果,才是令我頭痛的主要原因:

以下的結果是以「秒」為單位:
測試一:
》一張全畫面的 UIImageView 背景圖
》一張 UIImageView 標誌圖
》一個 UILabel 文字
所需時間:0.0003~0.0005 秒

測試二:
》一張全畫面的 UIImageView 背景圖
》一張 UIImageView 標誌圖
》一個 UILabel 文字
》建立一個及取消一個 Device Context(每幀)
所需時間:0.0016~0.0037 秒

測試三:
》一張全畫面的 UIImageView 背景圖
》一張 UIImageView 標誌圖
》一個 UILabel 文字
》建立一個及取消一個 Device Context(每幀)
》在 Device Context 上繪製圖片(每幀)
所需時間:0.7060~1.0885 秒

足足需要接近一秒的時間才完成!是一個極低的 Frame Rate。下一步要解決的是把這個部份加快至少 30 倍,確實是一個挑戰!

2009年11月3日星期二

@selector in NSArray

除了之前學習到的 Class in NSArray 外,今日嘗試製作 Selector in NSArray。方法同樣很簡單:

- (void)runAllTest:(id)sender {
NSArray *menuList = [[NSArray alloc] initWithObjects:
@"testAttack:",
@"testForumla:",
@"testRun:",
@"testInitBattleModelStatus:",
nil];

NSString *currentTestName = [menuList objectAtIndex:currentTest];
[self addLog:[NSString stringWithFormat:@"[%@]...", currentTestName]];

// Get the selector of next test
SEL currentSelector = NSSelectorFromString(currentTestName);
int assertResult = (int)[self performSelector:currentSelector];

if (assertResult == 0) {[self addLog:@"OK\n"];}
else {[self addLog:[NSString stringWithFormat:@"ERROR %d\n", assertResult]];}

// Test complete
currentTest++;

// Stop if all tests have been ran
if (currentTest >= [menuList count]) {
[self stopTest:sender];
currentTest = 0;
return;
}

// Set timer for next test
timer = [NSTimer scheduledTimerWithTimeInterval:(0.5f) target:self selector:@selector(runAllTest:) userInfo:nil repeats:NO];
}

2009年11月1日星期日

好細緻的步行

2009年10月31日星期六

超勁的二足步行!

2009年10月30日星期五

遙控巴斯光年

2009年10月29日星期四

Leopard 捷徑

要在 Leopard 建立捷徑,只要在圖示上按右鍵,再選擇 Alias 即可。

2009年10月22日星期四

XCode 小秘技(三)

在 XCode 裡有一個名叫 Guard Malloc 的功能。它主要在程序運行時,檢查有沒有使用到非法的記憶體空間。經過試驗之後,發覺非常好用;唯一的問題是執行效率下降了不少,使得整個過程都慢起來。所以,我只會在有需要時才打開它。

2009年10月20日星期二

XCode 小秘技(二)

一直以來,我都有把 iPhone 專案內使用到的檔案以 Group 的方式分門別類;主要是方便管理及使用。但在編譯成為 IPA 後,原本按 Group 整整齊齊分類的檔案都會變得散亂地放在 IPA 內應用程式的根目錄。我一直都想解決這個問題!

現在由我開發的角色扮演遊戲,已經包含上 2500 張圖片及資料檔案,更需要清清楚楚地分門別類。我嘗試了很多次都無法成功,也找不到類似的功能;最後發現,原來先在 Finder 建立起資料夾,把相應的檔案放進去,並把資料夾拖拉到 XCode 左方檔案清單的 Resources 內;這時會有一個視窗彈出,選擇 Create Folder References for any added folders 即可。而該資料夾的圖示亦會由正常 Group 分類的黃色,變成藍色。這樣編譯出來的 IPA 便會出現該資料夾及檔案。

2009年10月19日星期一

XCode 小秘技

在開發大型軟件時,為了在最快的時間內創造出一點成果,很多時都會先建立程序框架及其部份內容;而較為複雜細微的部份會在較後的時間去實現。我習慣在相關部份加入 TODO: 註解。在 IDE 的上方會有一個快速函數跳轉功能,原來 XCode 對於「TODO:」會有特別處理。在這個快速函數跳轉功能內也會顯示「TODO:」的內容,而且還以粗體顯示,十分方便。

2009年10月16日星期五

替 Function 換名

對於日漸壯大的代碼,有時會想到把某些功能函數換過一個更合適的名字,但考慮到在現時千絲萬縷的連結下,若利用 Search & Replace 的話,錯誤的風險會很高。

原來在 XCode 下有著一個名為 Refactor 的功能,可以有效地處理以上問題。只要在功能函數上點選滑鼠右鍵,便會彈出如左圖般的選單。點選 Refactor 後輸入新的函數名稱,切記要輸入冒號!按 Preview 後會出現將要修改的地方,同時 Preview 按鈕也會變成 Apply 按鈕。其中 Snapshot 是打勾了,這個是備份功能,方便還原之用;但會把整個 Refactor 進程拖得很慢,我通常都會把它關掉!反正 Refactor 之後的代碼不會立即儲存。最後就是按 Apply 啦!