Monotouch ipad проблема с памятью / анимацией - PullRequest
1 голос
/ 01 сентября 2011

Все, я работаю над тем, что мне показалось довольно простым приложением. Я использую несколько контроллеров представления с видом - под которым есть кнопки и один вид изображения. событие нажатия кнопки запускает представление другого viewcontroller для отображения. Это работает отлично. Тем не менее, я также хочу анимировать переход для имитации переворачивания страницы. Я использую код ниже, чтобы сделать это. Это работает хорошо, однако, каждый раз, когда я использую этот метод, используемая память увеличивается. Используемая память, кажется, отключена от фактического размера массива изображения. Кроме того, я изменил с png на jpeg (изображения намного меньшего размера), и это не имеет большого значения. Я думал об использовании .mov, но время загрузки очень заметно.

Пожалуйста, помогите. Я пробовал кучу других способов принудительного сбора мусора. Я просмотрел ограниченные тексты и искал этот сайт безрезультатно.

Вот пример кода.

открытый частичный класс 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);
    }

Ответы [ 3 ]

2 голосов
/ 01 сентября 2011

Вот несколько советов (просто читая код):

  • Нет разницы между JPEG и PNG после загрузки изображений в память.Формат имеет значение только тогда, когда изображение сохраняется, а не отображается.После загрузки (и распаковки) они занимают немного (Width * Height * BitCount) памяти.

  • Рассмотрите возможность кэширования ваших изображений и загружайте их только потому, что они недоступны.ГК решит, когда их собирать (столько копий может существовать одновременно).Прямо сейчас вы загружаете каждое изображение дважды, когда вы можете сделать это один раз (и используете отдельный массив для их упорядочивания).

  • Даже если вы кешируете их, будьте готовы очистить их по требованиюНапример, если iOS предупреждает, что у вас недостаточно памяти.Переопределите ReceiveMemoryWarning, чтобы очистить свой список (или более подходящие массивы).

  • Не вызывайте ToArray, если вы можете избежать его (например, ваш пример кода).Если вы знаете, сколько у вас изображений, просто создайте массив с правильным размером (и кешируйте оба массива тоже ;-).Это сократит (немного) распределение;

  • Даже рассмотрите возможность кэширования UIImageView 'myAnimatedView' (если вышеупомянутое не помогло достаточно)

  • Будь полезным для других, попробуй их один за другим и расскажи нам, что тебе больше всего поможет: -)

0 голосов
/ 05 сентября 2011

Хорошо, вот лучшее решение, которое я нашел, оно не сбивает аппаратное обеспечение и обычно полезно для других задач.

Это код, который идет в обработчике для нажатия кнопки, каждый NavImage - это UIImage, который я построил в том же виде в конструкторе интерфейса. Сначала я просто установил альфа на 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; });});});});});});});});});});
0 голосов
/ 01 сентября 2011

Изображения "оживляют" поворот страницы ... это для навигации по приложению?

Например, вы начинаете с «домашней» страницы, нажимаете кнопку, после чего она оживляет страницу, переходя к следующему экрану в вашем приложении?

Я думаю, что вам лучше использовать CoreGraphics, чтобы попытаться достичь этого эффекта, и то, и другое будет намного эффективнее с точки зрения памяти, и, вероятно, будет выглядеть намного лучше.В Objective-C есть несколько проектов, с которых можно начать, например, Отличный проект Тома Броу Leaves.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...