Лучший подход для игровой анимации?

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

Я создаю новый массив со всеми точками данных в формате строки, который вам нужен в качестве вывода, но я пропускаю запятую.
Когда цикл завершен, я добавляю выходной массив с запятой и новой строкой.

<!DOCTYPE HTML>
<html>
<head>  
  <script type="text/javascript">
  window.onload = function () {
    var chart = new CanvasJS.Chart("chartContainer",
    {
      title:{
      text: "Multi-Series Line Chart"  
      },
      data: [
      {        
        type: "line", //you can echo php array here as dataPoints variable
        dataPoints: [

<?PHP
    foreach($arr as $key => $v){
        $output[] = "{ x: " . $x[$key] . ", y: " . $v . " }";
    }
    echo implode(",\n", $output);
?>


        ]
      }
      ]
    });

    chart.render();
  }
  </script>
 <script type="text/javascript" src="https://canvasjs.com/assets/script/canvasjs.min.js"></script></head>
<body>
  <div id="chartContainer" style="height: 300px; width: 100%;">
  </div>
</body>
</html>
9
задан shoosh 7 March 2009 в 22:22
поделиться

7 ответов

Представьте и вычислите с такой скоростью, как Вы можете для получения максимальной частоты кадров (как ограничено вертикальной синхронизацией)

Не используйте таймер, они не надежны <50-100 мс в Windows. Проверьте, сколько передало время. (Обычно, Вам нужны и дельта t и в абсолютное значение, в зависимости от того, если Ваша анимация является физикой или базирующимся ключевым кадром.)

Кроме того, если Вы хотите быть стабильными, используйте верхнюю / нижнюю границу на своем такте, для входа в замедленную съемку, если кадр берет несколько secs для рендеринга (доступ к диску другим процессом?) или пропуск обновление, если Вы получаете двух из них в, говорит 10 мс.

Обновление (Так как это - довольно популярный ответ),

Я обычно предпочитаю иметь фиксированный такт, поскольку он делает все более стабильным. Большинство механизмов физики довольно устойчиво против переменного времени, но другие вещи, как системы частиц или различные более простые анимации или даже игровая логика, легче настроить при выполнении всего в фиксированном временном интервале.

Update2 (Так как я получил 10 upvotes ;)

Для дальнейшей устойчивости за длительные периоды выполнения (> 4 часа), Вы, вероятно, хотите удостовериться, что Вы не используете, плавает/удваивает для вычислений большой разницы во времени, так как Вы теряете точность, делающую так, и анимации/физика Вашей игры пострадают. Используйте фиксированную точку (или 64-разрядный основанный на микросекунде) целые числа вместо этого.

Для волосатых деталей я рекомендую читать вопрос точности Tom Forsyth.

10
ответ дан 4 December 2019 в 13:05
поделиться

Опция 2 безусловно предпочтена. Это масштабируется приятно через другое выполнение аппаратных средств.

Книга "Игровые Драгоценные камни Программирования 1" имела главу, которая касается точно, в чем Вы нуждаетесь:

Частота кадров независимая линейная интерполяция

1
ответ дан 4 December 2019 в 13:05
поделиться

Прочитайте эту страницу об игровых циклах.

Короче говоря, установите таймер:

  • Обновите состояние игры в фиксированной частоте (что-то как каждые 25 мс = 1s/40fps). Это включает свойства игровых объектов, входа, физики, AI, и т.д. Я называю это Моделью и Контроллером. Потребность в фиксированной частоте обновления прибывает из проблем, которые могут появиться на слишком медленных или слишком быстрых аппаратных средствах (прочитайте статью). Некоторый механизм физики также предпочитает обновлять в фиксированной частоте.

  • Обновите кадр (графика) игры максимально быстро. Это было бы Представление. Тем путем Вы обеспечите гладкую игру. Можно также включить vsync, таким образом, дисплей будет ожидать видеокарты (обычно, это - 60 кадр/с).

Так каждое повторение цикла, Вы проверяете, необходимо ли обновить модель/контроллер. Если поздно, обновление, пока они не актуальны. Затем обновите кадр однажды и продолжите Ваш цикл.

Хитрая часть - то, что из-за различных частот обновления, в быстрых аппаратных средствах, представление будет обновлять несколько раз перед моделью и контроллером. Поэтому необходимо интерполировать положение игровых объектов в зависимости от, "где они были бы то, если игровое состояние будет обновлено". Это действительно не настолько трудно.

Вам, вероятно, придется поддержать 2 различных структуры данных: один для модели и один для представления. Например, у Вас могли быть график сцены для Вашей модели и дерево BSP для Вашего представления.

4
ответ дан 4 December 2019 в 13:05
поделиться

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

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

1
ответ дан 4 December 2019 в 13:05
поделиться

Используйте второй метод. Сделал игру для моего старшего проекта и на основе опыта, нет никакой гарантии, что Ваша логика будет сделана, обрабатывая, когда таймер захочет стрелять.

0
ответ дан 4 December 2019 в 13:05
поделиться

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

Когда я сделал это, в формате анимации я основывал все на оперативных значениях. Дельта, в которой я передал, равнялась 1 / 30 секунд, но это могло быть что-либо. С этой системой можно получить или первую или вторую опцию, в зависимости от того, передаете ли Вы в фиксированной дельте или если Вы передаете за количество времени, который передал начиная с последнего кадра.

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

0
ответ дан 4 December 2019 в 13:05
поделиться

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

0
ответ дан 4 December 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: