Аппаратное ускорение при утечке памяти веб-приложения

Я создавал веб-приложения с использованием PhoneGap/Cordova и работал хорошо.

Приложения состоят из серии слайдов, которые пользователь может провести, чтобы перейти к следующему слайду. Для этого я использовал idangero swiper.

Как только я попытался масштабировать свои приложения, чтобы они содержали больше слайдов, приложения вылетали с предупреждением о памяти в XCODE. Я сузил его до аппаратного ускорения в CSS3 (ниже). МАКСИМАЛЬНОЕ количество слайдов, которое я могу иметь без сбоя, равно 22. Как только я добавляю 23-й, я получаю предупреждение о памяти и происходит сбой.

Я сузил его еще больше, чтобы

.swiper-slide {
    background-color: #fff;

    -webkit-transform-style: preserve-3d;
    -webkit-transform: translate3d(0,0,0);
  }

Когда я удаляю два преобразования webkit из приведенного ниже css, приложение компилируется и запускается, но на первой странице мигает белый экран, а простая анимация раскрывающегося списка, такая как slideToggle, начинает нервничать.

идангеро css

.swiper-container {
    margin:0 auto;
    position:relative;
    overflow:hidden;
    height: 768px;
    width: 1024px;
    z-index:1;

}

.swiper-slide {
    background-color: #fff;

    -webkit-transform-style: preserve-3d;
    -webkit-transform: translate3d(0,0,0);
  }

.swiper-wrapper {
    position:absolute;
    width: 100%;
    -webkit-transition-property:-webkit-transform, left, top;
    -webkit-transition-duration:0s;
    -webkit-transition-timing-function:ease;

    -moz-transition-property:-moz-transform, left, top;
    -moz-transition-duration:0s;
    -moz-transform:translate3d(0px,0,0);
    -moz-transition-timing-function:ease;

    -o-transition-property:-o-transform, left, top;
    -o-transition-duration:0s;
    -o-transform:translate3d(0px,0,0);
    -o-transition-timing-function:ease;
    -o-transform:translate(0px,0px);

    -ms-transition-property:-ms-transform, left, top;
    -ms-transition-duration:0s;
    -ms-transform:translate3d(0px,0,0);
    -ms-transition-timing-function:ease;

    transition-property:transform, left, top;
    transition-duration:0s;
    transform:translate3d(0px,0,0);
    transition-timing-function:ease;


    transform: translate3d(0%,0,0) scale3d(1,1,1);
    -o-transform: translate3d(0%,0,0) scale3d(1,1,1);
    -ms-transform: translate3d(0%,0,0) scale3d(1,1,1);
    -moz-transform: translate3d(0%,0,0) scale3d(1,1,1);
    -webkit-transform: translate3d(0%,0,0) scale3d(1,1,1);
    overflow: hidden;
    -webkit-backface-visibility: hidden;
    -webkit-transform-style: preserve-3d;


}

.swiper-free-mode > .swiper-wrapper {
    -webkit-transition-timing-function: ease-out;
    -moz-transition-timing-function: ease-out;
    -ms-transition-timing-function: ease-out;
    -o-transition-timing-function: ease-out;
    transition-timing-function: ease-out;
    margin: 0 auto;

}
.swiper-slide {
    float: left;
}

/* IE10 Windows Phone 8 Fixes */
.swiper-wp8-horizontal {
    -ms-touch-action: pan-y;
}
.swiper-wp8-vertical {
    -ms-touch-action: pan-x;
}

пример html для 2 "слайдов"

<div class="swiper-container">
            <div class="swiper-wrapper">

                <!-- Home (Page 1) = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = -->
                <div id="home" class="swiper-slide" rel="bkg-home.jpg">
                    <div class="page">
                        <h1>TEXt HErE</h1>   
                        <h3>Header 3</h3>
                    </div><!-- /page -->
                </div><!-- /home -->

                <!-- Page 2 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =  -->
                <div id="p2" class="swiper-slide" rel="bkg-2.jpg">
                    <div class="page">
                        <div class="menu-trigger"></div>
                        <h1 style="padding-top:17px;">MORE TITLES</h1> 
                        <div class="content">
                            <div id="table-of-contents">
                                <ul>
                                     <li><a href="#p3">Issue Overview </a></li>
                                     <li><a href="#p4">Content1</a></li>
                                     <li><a href="#p6">Content2</a></li>
                                     <li><a href="#p30">Content3</a></li>
                                     <li><a href="#p17">Content4</a></li>
            </ul>
                                </ul>
                            </div><!-- /table-of-contents -->

                        </div><!-- /content -->
                        <div class="header"></div><!-- /header -->
                        <div class="footer"></div><!-- /footer -->
                        <div class="footer-segment"></div><!-- /footer-segment -->
                    </div><!-- /page -->
                </div><!-- /p2 -->
       </div>
</div>

Так что, похоже, мне нужно аппаратное ускорение CSS3, чтобы приложение работало гладко, но также кажется, что это вызывает сбой. Есть ли у кого-нибудь обходной код, который позволит моим приложениям работать без сбоев, но не приведет к сбою всего приложения?


person rjg132234    schedule 03.10.2013    source источник
comment
Имея эту же проблему. Не удалось найти быстрое решение. Я заставляю свое приложение загружать и удалять слайды, поэтому в памяти одновременно находится только 3. тьфу   -  person C.J. Bordeleau    schedule 31.03.2014


Ответы (1)


Я бы попробовал две разные вещи.

1 will-change

Предположительно будущее аппаратного ускорения — это новый атрибут will-change css.

https://dev.opera.com/articles/css-will-change-property/

.swiper-slide {
  background-color: #fff;
  -webkit-transform-style: preserve-3d;
  /* -webkit-transform: translate3d(0,0,0); */
  will-change: transform, top, left;
}

2 transform дешевле, чем позиционирование с top и left

Я не могу сказать, где именно вы используете transition на top и left, но я бы попробовал заменить top/left на translateX(), translateY() или translate().

person Jason Lydon    schedule 01.10.2014
comment
На самом деле мы создаем для Safari, поэтому, думаю, нам придется подождать, чтобы использовать will-change. Но это полезно знать на будущее. - person rjg132234; 01.10.2014