Android - Откриване на сблъсък / Оптимизация на двигателя - големи, отворени, пясъчни карти

Кратка версия

Какъв е лесен за изпълнение начин за откриване на сблъсъци в голяма отворена карта, където обектите се генерират в движение?

Дълга версия

В момента работя върху пресъздаването на първата игра за Android, която някога съм правил (https://play.google.com/store/apps/details?id=com.Joey_Ant.Lite&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5Kb2V5X0FudC5MaXRlIl0.)

Възстановявам го от нулата и добавям около сто нови функции.

Описание на играта: Потребителят ще контролира колония от мравки, която има подземна, решетъчна карта и надземно открито поле за игра. Мравките ще имат AI и може да има голям брой мравки. (Което означава, че трябва да оптимизирам глупостите от всичко.) Картите ще бъдат силно променливи. (Планирам да направя създател на карти и да позволя на потребителите да създават и изтеглят карти онлайн.)

И така, в карта, пълна с голям брой обекти и други мравки/същества, какъв е оптималният начин за откриване на сблъсъци? Не мога да преглеждам всички други обекти, за да открия сблъсъци, тъй като това ще трябва да се случи за всяко същество и ще отнеме твърде много процесорно време.

Какво взех предвид

Мрежа: Създаване на произволен мрежов обект. Обектът на мрежата ще създаде подрегиони (действителната мрежа) и всеки път, когато дадено същество "мисли". това ще актуализира мрежовия обект с препратка към себе си. След това съществото ще попита решетъчния обект за други обекти в неговата мрежа. Надяваме се, че това ще намали значително броя на проверките, които трябва да бъдат направени. Но режийните разходи за това може да са повече. Тази решетка може да бъде от полза, тъй като позволява на същества да откриват и други същества в общата й зона, тъй като решенията на AI ще бъдат повлияни от други обекти и същества в тази зона.

Заети решетки: По същество същата като горната опция за решетка, само обектът на решетка е създаден от обекти. Да кажем, че имам 3 обекта (A, B и C). Когато инициализирам обект A, той създава решетъчна клетка с определена ширина и височина. Обект B е инициализиран, но е в същата област като обект A, така че се добавя към тази област на мрежата. Обект C се инициализира извън зоната, така че създава решетъчна клетка за своето местоположение. Ако обект C влезе в клетката, в която се намира обект A, предишната му клетка се унищожава. Предполагам, че можете да си представите това като издухване на мехурчета.

Някакви идеи за по-добър начин да направите това?


person teynon    schedule 28.07.2012    source източник


Отговори (1)


Това е доста стар въпрос, не знам дали стигнахте до решение, но защо не използвате някой от вече разработените двигатели за откриване на сблъсък и физика, вместо да измисляте топлата вода. Ето някои възможности:

  1. androidbox2d

  2. andengine

Има и добри примери как да ги използвате.

person d.popov    schedule 26.04.2013
comment
В крайна сметка направих втората си опция във въпроса си. В момента работя върху намирането на път между множество движещи се обекти. - person teynon; 26.04.2013