2

мне нужна помощь/советы по улучшению/комментирование мой текущий дизайн пожалуйста :)Javascript битовая карта для простого обнаружения столкновения

Это связано с обнаружением коллизий в простой игре: Динамические органы (движущиеся из них) может столкнуться со статическими телами (т. е. земля, стены). Я портирую мою модель Obj-C на Javascript и сталкиваюсь с вопросами памяти/производительности относительно моего способа реализации этого.

Я использую очень простой подход: массив массивов представляет собой мой уровень с точки зрения физической непрозрачности.

  • бит установлен в 0: Прозрачная поверхность, тела могут пройти через

  • бит установлен в 1: непрозрачные области, тела сталкиваются

Тестирование прозрачности/непрозрачности пикселя просто идет следующим образом:

if (grid[x][y]) { 
// collide! 
} 

Мои знания о JS довольно ограничены в терминах performanc e/memory и не может оценить, насколько хорош этот подход :) Не знаю эффективности использования массивов, которые, как говорится.

Только представьте себе, что уровень шириной 1000 пикселей высотой 600 пикселей. Это небольшой уровень, но это уже означает массив, содержащий 1000 массивов, каждый из которых содержит до 600 записей. Кроме того, я не нашел способ гарантировать, что я создаю элемент размером 1 бит, например языки низкого уровня.

Используя следующее, могу ли я быть уверенным, что запись не является чем-то «еще», чем бит?

grid[x][y] = true; 
grid[x][y] = false; 

Спасибо за ваше время и комментарии/советы!

J.

+0

Btw, имеет ли кто-нибудь ссылку на использование памяти на тип значения? Я нашел это здесь, но не смог подтвердить это с помощью других источников: http://stackoverflow.com/questions/1248302/javascript-object-size – Jem

ответ

1

Если у вас есть 1000x600 сетку, вы можете гарантировать, что вы, по крайней мере, 601 массивов в памяти (1001, если вы делаете это наоборот).

Вместо этого я бы рассмотрел возможность использования либо одного массива, либо (предпочтительнее) одного объекта с помощью схемы сопоставления.

var map = {}; 
map["1x1"] = 1; 
map["1x3"] = 1; 
// assume no-hits are empty and free to move through 

function canGoIn(x, y) { 
    return map.hasOwnProperty(x + "x" + y); 
}; 

альтернативно;

var map = []; 
var width = 600; 
map.push(0); 
map.push(1); 
// etc 

function canGoIn(x, y) { 
    return map[(x * width) + y] == 1; 
} 
+0

Эй, это очень интересная идея, мне это очень нравится. В первом предложении вы используете строку «1x3» в качестве индекса в массиве. Я думаю, что «10000x10000» является самым длинным значением, это 11 символов. Разве это не так огромно с точки зрения памяти? – Jem

+0

@ jeM680000: Я бы не сказал «огромный», но он будет иметь * некоторые * использование, очевидно. Я только что провел несколько тестов, и кажется, что единственный массив работает как наиболее эффективный (~ 11000k). Несколько массивов next (~ 14000kb), а карта использует ~ 25000k). (Предполагаемый вход 1000x1000) (см. Http://jsperf.com/quickest-way-to-represent-a-map для тестов, которые я использовал, я проверил использование памяти вкладки в Chrome 16 на XP SP3) – Matt

+0

Привет спасибо, это здорово. Спасибо за ваше время, заставило меня узнать о jsperf. Очень признателен! – Jem

0

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

Если у вас возникли проблемы с памятью, вы должны рассмотреть вопрос об осуществлении BitArray как это: https://github.com/bramstein/bit-array/blob/master/lib/bit-array.js

Вам придется сделать свой 2d массива в простой вектор и преобразование х, у координаты, как это: смещение = x + (y * ширина);

Просмотр массива по-прежнему приведет к умножению для оценки смещения, поэтому использование вектора эквивалентно массивам.

Но я подозреваю, что вызов функции (в случае использования битового массива) и выполнение некоторых оценок внутри приведет к ухудшению характеристик.

Я не думаю, что вы можете одновременно выполнять функции и сохранять память.