2011-08-31 53 views
1

所有,我正在處理我認爲是一個相當簡單的應用程序。我在視圖中使用了多個視圖控制器 - 其中有按鈕和單個圖像視圖。 buttonpress事件觸發另一個viewcontroller的視圖來顯示。這是完美的。不過,我也想動畫轉換來模擬翻頁。我使用下面的代碼來做到這一點。它運行良好,但是,每次使用此方法時,使用的內存都會增加。使用的內存似乎與圖像陣列的實際大小斷開。此外,我從PNG更改爲JPEG(更小的圖像),並沒有一點區別。我想過使用.mov,但加載時間非常明顯。Monotouch ipad內存/動畫問題

請幫忙。我試過了很多不同的方式來強制垃圾收集。我已經通過有限的文本挖掘,並搜索這個網站無濟於事。

下面是代碼示例。

公共部分類的AppDelegate:UIApplicationDelegate {

// This method is invoked when the application has loaded its UI and its ready to run 
    public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
    { 
     UIApplication.SharedApplication.SetStatusBarHidden(true, true); 
     // If you have defined a view, add it here: 
     // window.AddSubview (navigationController.View); 
     //window.AddSubview(mainController.View); 
     window.MakeKeyAndVisible(); 

     coverOpenbtn.TouchUpInside += HandleCoverOpenbtnTouchUpInside; 
     backBtn1.TouchUpInside += HandleBackBtn1TouchUpInside; 
     return true; 
    } 

    void HandleBackBtn1TouchUpInside (object sender, EventArgs e) 
    { 
     this.navView.RemoveFromSuperview(); 

     List<UIImage> myImages = new List<UIImage>(); 

     myImages.Add(UIImage.FromFile("c_1_00011.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00010.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00009.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00008.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00007.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00006.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00005.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00004.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00003.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00002.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00001.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00000.jpg")); 
     //myImages.Add(UIImage.FromFile("c_1_00012.jpg")); 
     var myAnimatedView = new UIImageView(window.Bounds); 
     myAnimatedView.AnimationImages = myImages.ToArray(); 
     myAnimatedView.AnimationDuration = 1; // Seconds 
     myAnimatedView.AnimationRepeatCount = 1; 
     myAnimatedView.StartAnimating(); 
     window.AddSubview(myAnimatedView); 

    } 

    void HandleCoverOpenbtnTouchUpInside (object sender, EventArgs e) 
    { 
     this.coverView.AddSubview(navView); 

     List<UIImage> myImages = new List<UIImage>(); 

     myImages.Add(UIImage.FromFile("c_1_00000.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00001.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00002.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00003.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00004.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00005.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00006.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00007.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00008.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00009.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00010.jpg")); 
     myImages.Add(UIImage.FromFile("c_1_00011.jpg")); 
     //myImages.Add(UIImage.FromFile("c_1_00012.jpg")); 
     var myAnimatedView = new UIImageView(window.Bounds); 
     myAnimatedView.AnimationImages = myImages.ToArray(); 
     myAnimatedView.AnimationDuration = 1; // Seconds 
     myAnimatedView.AnimationRepeatCount = 1; 
      opened++; 
     } 
     myAnimatedView.StartAnimating(); 
     window.AddSubview(myAnimatedView); 
    } 

回答

2

下面是一些提示(通過閱讀代碼):

  • 有JPEG和PNG之間沒有區別,一旦圖像加載在記憶中。格式只在圖像存儲時才重要,不顯示。一旦加載(並解壓縮),它們會佔用一些內存(寬*高* BitCount)。

  • 考慮緩存圖像並加載它們只有它們不可用。 GC將決定何時收集它們(同時存在許多副本)。現在,當你可以做一次的時候你會加載每個圖像兩次(並且使用單獨的數組來排序它們)。

  • 即使您緩存它們也可以隨時清除它們,例如,如果iOS警告你內存不足。重寫ReceiveMemoryWarning以清除您的列表(或更好的陣列)。

  • 如果你可以避免它(如你的示例代碼),不要調用ToArray。如果你知道你有多少圖片,只需創建大小合適的數組(並且同時緩存兩個數組;)。它會削減(一點)分配;

  • 即使考慮緩存的「myAnimatedView」的UIImageView(如果上面沒有幫助足夠)

  • 可幫助他人,試戴一個接一個,告訴我們幫您最:-)

+0

感謝Pou。我會研究這些並報告回來。 –

0

圖像是「動畫」的翻頁...這是通過應用程序導航?

例如你從「home」頁面開始,按下一個按鈕,然後將頁面轉動到應用中的下一個屏幕?

我認爲如果使用CoreGraphics來嘗試實現這種效果會更好,但它會更有效地提高內存的使用效率,而且它看起來也會好很多。 Objective-C中有幾個項目可以幫助你入門,比如Tom Brow's excellent Leaves project.

+0

感謝您的鏈接,將檢查出來,並給它一個擺動。 –

0

好的,這裏是我找到的最好的解決方案,不會使硬件崩潰,並且通常對其他任務很有用。

這是在按鈕按下處理程序中的代碼,每個NavImage是我在界面構建器中的相同視圖下構建的UIImage。我剛把alpha變成0,然後一個接一個點亮...

NSTimer.CreateScheduledTimer(.1,delegate { navImage1.Alpha = 1;  NSTimer.CreateScheduledTimer(.1,delegate { navImage2.Alpha = 1; 
      NSTimer.CreateScheduledTimer(.05,delegate { navImage3.Alpha = 1; 
        NSTimer.CreateScheduledTimer(.05,delegate { navImage4.Alpha = 1; 
        NSTimer.CreateScheduledTimer(.05,delegate { navImage5.Alpha = 1; 
         NSTimer.CreateScheduledTimer(.05,delegate { navImage6.Alpha = 1; 
          NSTimer.CreateScheduledTimer(.05,delegate { navImage7.Alpha = 1; 
           NSTimer.CreateScheduledTimer(.05,delegate { navImage8.Alpha = 1; 
            NSTimer.CreateScheduledTimer(.05,delegate { navImage9.Alpha = 1; 
             NSTimer.CreateScheduledTimer(.05,delegate { navImage.Alpha = 1; });});});});});});});});});});