2-я игровая физика?

Все вышеперечисленные решения «работают», но менее оптимальны для производительности и все они подходят к проблеме таким же образом, что и линейный поиск всех записей в каждой точке с помощью Array.prototype.indexOf или Array.prototype.includes . Более быстрое решение (гораздо быстрее, чем бинарный поиск в большинстве случаев) - это сортировка массивов и проскальзывание вперед, как вы видите ниже. Однако один недостаток заключается в том, что для этого требуется, чтобы все записи в массиве были числами или строками. Однако, однако, бинарный поиск может в некоторых редких случаях быть быстрее, чем прогрессивный линейный поиск. Эти случаи возникают из-за того, что мой прогрессивный линейный поиск имеет сложность O (2n1 + n2) (только O (n1 + n2) в более быстрой версии C / C ++ ) (где n1 - искомый массив, а n2 - массив фильтров), тогда как бинарный поиск имеет сложность O (n1ceil (log2n2)) (ceil = round up - ceil ing), и, наконец, поиск indexOf имеет весьма переменную сложность между O (n1) и O (n1n2) , усредняя по O (n1ceil (n2 ÷ 2)) . Таким образом, indexOf будет только самым быстрым, в среднем, в случаях (n1, n2) , равных {1,2} , {1,3} или {x, 1 | x∈N} . Тем не менее, это все еще не идеальное представление современного оборудования. IndexOf оптимизирован в максимально возможной степени в большинстве современных браузеров, что делает его очень подверженным законам предсказания ветвей . Таким образом, если мы сделаем такое же предположение на indexOf, как и в случае с прогрессивным линейным и двоичным поиском, - чтобы массив был предварительно настроен, то, согласно статистическим данным, перечисленным в ссылке, мы можем ожидать примерно 6-кратное ускорение для IndexOf, смещение его сложности между O (n1 ÷ 6) и O (n1n2) , усреднение по O (n1ceil (n27 ÷ 12)) , Наконец, обратите внимание, что приведенное ниже решение никогда не будет работать с объектами, потому что невозможно получить внутренний указатель объекта (для численного сравнения) в javascript.

function sortAnyArray(a,b) { return a>b ? 1 : (a===b ? 0 : -1); }
function sortIntArray(a,b) { return a - b; }
var Math_clz32 = Math.clz32;
function filterArrayByAnotherArray(searchArray, filterArray, isInteger = false, i = 0) {
    if (isInteger) { // if all entries in both arrays are integers
        searchArray.sort(sortIntArray);
        filterArray.sort(sortIntArray);
    } else {
        searchArray.sort(sortAnyArray);
        filterArray.sort(sortAnyArray);
    }
    var searchArrayLen = searchArray.length, filterArrayLen = filterArray.length;
    var progressiveLinearComplexity = ((searchArrayLen<<1) + filterArrayLen)>>>0
    var binarySearchComplexity= (searchArrayLen * (32-Math_clz32(filterArrayLen-1)))>>>0;
    // After computing the complexity, we can predict which algorithm will be the fastest
    if (progressiveLinearComplexity < binarySearchComplexity) {
        // Progressive Linear Search
        return searchArray.filter(function(currentValue){
            while (filterArray[i] < currentValue) ++i;
            // +undefined = NaN, which is always false for <, avoiding an infinite loop
            return filterArray[i] !== currentValue;
        });
    } else {
        // Binary Search
        return searchArray.filter(function(currentValue) {
            var lo = -1, hi = filterArrayLen;
            while (1 + lo !== hi) {
                const mi = (hi + lo) >> 1;
                if (currentValue <= filterArray[mi]) hi = mi; else lo = mi;
            }
            return filterArray[hi] !== currentValue;
        });
    }
}

Чтобы доказать разницу в скорости, давайте рассмотрим некоторые JSPerfs. Для фильтрации массива из 16 элементов бинарный поиск примерно на 17% быстрее, чем indexOf, тогда как filterArrayByAnotherArray примерно на 93% быстрее, чем indexOf. Для фильтрации массива из 256 элементов бинарный поиск примерно на 291% быстрее, чем indexOf, тогда как filterArrayByAnotherArray примерно на 353% быстрее, чем indexOf. Для фильтрации массива из 4096 элементов бинарный поиск примерно на 2655% быстрее, чем indexOf, тогда как filterArrayByAnotherArray примерно на 4627% быстрее, чем indexOf.

12
задан juan 2 October 2008 в 19:49
поделиться

11 ответов

Это походит , Бурундук мог бы удовлетворить Ваши потребности.

22
ответ дан 2 December 2019 в 02:55
поделиться

, Какую платформу Вы ищете? то, Какой библиотекой Вы пользуетесь, будет зависеть от этого.

Для платформы XNA, Farseer довольно хорош.

5
ответ дан 2 December 2019 в 02:55
поделиться

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

12
ответ дан 2 December 2019 в 02:55
поделиться

Физика в большинстве 2D прокручивающих сторону игр платформы так проста, что Вы могли легко реализовать их сами. Какие эффекты Вы ищете?

2
ответ дан 2 December 2019 в 02:55
поделиться

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

4
ответ дан 2 December 2019 в 02:55
поделиться

Этот парень сделал большую работу с играми JavaScript:

http://blog.nihilogic.dk/

2
ответ дан 2 December 2019 в 02:55
поделиться

Вы могли посмотреть на механизм Havok. Я полагаю, что они выпустили бесплатную версию для использования non-commerical. Существует ограничительный набор для него, который позволит Вам ограничивать физику к 2 плоскостям, в Вашем случае, X и Y.

2
ответ дан 2 December 2019 в 02:55
поделиться

Если все, в чем Вы нуждаетесь, является силой тяжести, можно программировать это сами через 5 минут. Свободно падающие объекты ускоряются вниз на уровне 9,8 метров в секунду в секунду - то есть, объект, нисходящий скорость увеличения на 9,8 метров в секунду свободного падения. Для игры Вы захотите разделить это 9.8 на то, что Ваша частота кадров. Для перехода просто выберите значительную отрицательную вертикальную скорость, примените это к символу в момент, они переходят и постепенно уменьшают его Вашим инкрементом силы тяжести на кадр. Это - действительно все, в чем Вы нуждаетесь для чего-то как Mario, если Вы не ищете 3-й фон для своего 2-го скроллера стороны.

, Если Вы хотите стать более необычными, можно попытаться принять силу влияния объекта во внимание, делая падающих людей вреда объектов или взломанный тротуар или что-то. Для этого используйте формулу для Кинетической энергии: KE = 1/2 * M * V^2, где M является массой и V, является скоростью.

9
ответ дан 2 December 2019 в 02:55
поделиться

Если бы Вы получили время, то Вы могли бы использовать PhysX, но его вероятные уничтожают для 2D. Кроме того того, что если Вы планируете наличие Вашей игровой работы над ПК и хотите некоторую прохладную физику, пытаетесь гуглить для "verlet интеграция", я знаю, что существует довольно много verlet реализаций вокруг (хороши для частиц и 2D рэгдоллов).

2
ответ дан 2 December 2019 в 02:55
поделиться

Я использовал Box2D в персональных проектах. Это - 2D физический API моделирования. Но, это могло бы быть излишество, если то, что Вы хотите, является больше игровым API / графическим API.

2
ответ дан 2 December 2019 в 02:55
поделиться

Можно сделать, 2-я физика с открылась также

2
ответ дан 2 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

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