2011-01-31 20 views
0

Я хочу реализовать функцию записи игрового процесса в проекте, которая будет записывать только вход игрока и семя RNG в начале уровня. Тогда я мог бы взять такую ​​запись и воспроизвести ее на своем компьютере, чтобы проверить ее на достоверность.Точность поплавка и математика на разных системах

Я интересуюсь только некоторыми численными отличиями, которые могут возникать между версией Flash Player, операционными системами или процессорами (или чем бы они ни были затронуты). Проект будет написан для Flash Player 10.0.0+. Что меня интересует:

  • Операции над числами: умножение, деление; бит (возможно, смещение бит); сложение и вычитание; modulo
  • Math class: sin, cos и atan2; округление
  • localToGlobal/globalToLocal с вращением и масштабированием

Я не буду использовать такие вещи, как Трассировка, getObjectsUnderPoint, hitTestPoint, GetBounds и так далее, все столкновения будут геометрическое.

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

ответ

0

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

+0

Не для геймплея, а для проверки того, изменен ли пользователь или нет, и было бы сложно проверить, что, если, скажем, из-за некоторых несовместимых с поплавками, игрок упал на яму прямо в начале вместо того, чтобы прыгать с последнего полуапикселя, эффективно разрушая весь повтор и не позволяя мне проверять :). – Maurycy

+0

Я считаю, что эти случаи будут достаточно редкими, что это не повлияет. Я бы построил двигатель и не беспокоился об этом на данный момент, и когда вы закончите тест, играя много раз и гарантируя, что игрок заканчивается на той же позиции (в пределах 0,01 единицы) как в реальной игре, так и в симуляции. Если они этого не сделают, то вы можете изолировать проблему, но я был бы очень удивлен, если бы вступили в игру закругленные различия числа (двойная точность, 64 бит). – StapleGun

+0

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

1

Это интересный вопрос ...

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

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

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

Точность плавающей запятой должна быть в порядке. Алгоритмы, которые определяют, когда округлять, хорошо документированы в IEEE-754, и все виртуальные машины используют 64-разрядные номера независимо от того, на какой ОС они работают. Я предполагаю, что математические операции одинаково понятны.

Я думаю, что хорошо избегать hitTest и еще много чего. Я полагаю, на них теоретически может повлиять, используется ли аппаратное ускорение. Но я не эксперт, возможно, нет.

Теперь localToGlobal/globalToLocal ... Я просто не знаю. У них может быть проблема теоретического аппаратного ускорения, но я склонен сомневаться в этом.

Так что, я думаю, я не дал никаких реальных ответов.

+0

О сроках это не проблема, так как я не использую delta. Я думаю, что тогда я просто подготовлю некоторый тест и отправлю его где-нибудь, чтобы получить данные. Спасибо, в любом случае :). – Maurycy

1

Триг функции НЕ РАБОТАЮТ! Вы должны создать пользовательские реализации следующих: acos, asin, atan, atan2, cos, exp, log, pow, sin и sqrt. И, очевидно, random().

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

+0

Любая другая информация? Я полагаю, что триггеры ненадежны, потому что они вычисляются процессором? По крайней мере, я помню, много лет назад, читая, что они обычно выполняются процессором, и он не уверен, как каждый из них справится с этим. Случайно не проблема, так как я бы использовал пользовательскую реализацию Marsenne Twister, но меня все еще интересует поведение Number. – Maurycy

Смежные вопросы