Загрузка дисплея не появится - PullRequest
0 голосов
/ 22 декабря 2011

Я пишу флэш-приложение с as3, вот это, если вы хотите посмотреть: http://www.kongregate.com/games/yossefki/nqueensolver

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

loadingText.visible = true

и после того, как я напишу

loadingText.visible = false

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

Вот функция:

public function solve():void{
    //sizeOfBoard:int , solutionNumber:int):Array

    trace("start solving at queens");
    loadingText.visible = true;
    trace("loading set to visible");
    solutionNumDes++;
    solutionNumCounter = solutionNumDes;
    for(var i:int=0;i<_size;i++)
        solution[i] = 0;

    resetBoard();
    if(solveRec(0))
        display();
    trace("loading set to unvisible");
    loadingText.visible = false;
    trace("finised solving at queens");

}//solve

, где solveRec - тяжелый расчет

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Если ваш расчет занимает больше времени, чем интервал обновления кадра, экран будет зависать до завершения операции.Вы должны распределить свои расчеты по рамкам, и тогда установка клипа на видимый и невидимый действительно покажет некоторые результаты.

Выезд Псевдооболочки .Это удобный и удобный способ разделить длинные вычисления на большие части и оставить достаточную вычислительную мощность для того, чтобы Flash Player вовремя перерисовал экран.

1 голос
/ 22 декабря 2011

Возможно, проблема в том, что вы выполняете вычисления и переключаете видимость в одном кадре.

Итак, в основном то, что вы, вероятно, делаете, это:

  1. кнопка нажата
  2. loadingText.visible = true;
  3. тяжелые расчеты
  4. loadingText.visible = false;
  5. кадр отображается

Проблема здесь в том, что в отличие от асинхронных операций (например, загрузка контента), вам нужно «дождаться» окончания вычислений. Этого можно избежать, подождав фрейм, пока не начнутся вычисления Для простоты loadingText.visible может быть флагом, указывающим на необходимость расчета, который будет проверяться каждый кадр.

  1. кнопка нажата
  2. loadingText.visible = true;
  3. рамка визуализирована, загрузка текста теперь видна
  4. во входящем фрейме: отметьте if(loadingText.visible)
  5. тяжелые расчеты
  6. loadingText.visible = false;
  7. рамка отображается

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

Вы можете разделить функции следующим образом:

private function solveButtonClicked():void {
    loadingText.visible = true;
}

private function enterFrame(e:Event):void {
    if(loadingText.visible) solve();
}

private function solve():void {

    solutionNumDes++;
    solutionNumCounter = solutionNumDes;
    for(var i:int=0;i<_size;i++)
        solution[i] = 0;

    resetBoard();
    if(solveRec(0))
        display();
    trace("loading set to unvisible");
    loadingText.visible = false;
    trace("finised solving at queens");

}//solve
...