Game Programming Patterns / Паттерны программирования в играх: 5.4 Spatial Partition

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Намеренение

Deo 22.08.14 в 18:12

0

Мотивация

kabanov 24.06.14 в 12:53

0

Игры позволяют нам посещать другие миры, но эти миры обычно не сильно отличаются от нашего.

Deo 22.08.14 в 18:17

0

Они часто используют ту же основы физики и реальность, что и наш мир.

Deo 22.08.14 в 18:19

0

Поэтому они ощущаются реальными, несмотря на то, что созданы из обычных битов и пикселей.

Deo 22.08.14 в 18:20

0

Это проявляется в нескольких вещах.

Deo 22.08.14 в 19:52

0

Самая очевидная - физика: объекты движутся, сталкиваются и взаимодействуют, однако это еще не все.

Deo 22.08.14 в 19:55

0

Это означает, что вашему игровому движку часто придется отвечать на вопрос: "Какие объекты расположены неподалеку от этой локации?"

Deo 22.08.14 в 20:01

0

Если в каждом кадре ему придется отвечать слишком часто на этот вопрос, это станет узким местом в производительности.

Deo 22.08.14 в 20:03

0

Скажем, мы создаем стратегию реального времени.

Deo 22.08.14 в 20:04

0

Враждующие армии с сотнями боевых единиц столкнутся друг с другом на поле боя.

Deo 22.08.14 в 20:05

0

Войнам нужно знать, в какого близлежащего противника можно вонзить клинок.

Deo 22.08.14 в 20:06

0

Простейший способ обработать такую ситацию - сравнивать юниты попарно, выясняя насколько далеки они друг от друга:

Deo 22.08.14 в 20:08

0

void handleMelee(Unit* units[], int numUnits)

kabanov 24.06.14 в 12:53

0

{

kabanov 24.06.14 в 12:53

0

for (int a = 0; a < numUnits - 1; a++)

kabanov 24.06.14 в 12:53

0

{

kabanov 24.06.14 в 12:53

0

for (int b = a + 1; b < numUnits; b++)

kabanov 24.06.14 в 12:53

0

{

kabanov 24.06.14 в 12:53

0

if (units[a]->position() == units[b]->position())

kabanov 24.06.14 в 12:53

0

{

kabanov 24.06.14 в 12:53

0

handleAttack(units[a], units[b]);

kabanov 24.06.14 в 12:53

0

}

kabanov 24.06.14 в 12:54

0

}

kabanov 24.06.14 в 12:54

0

}

kabanov 24.06.14 в 12:54

0

}

kabanov 24.06.14 в 12:54

0

На самом деле внутренний цикл не проходит по всем юнитам.

kabanov 24.06.14 в 12:55

0

Однако в нотации О-большого это до сих пор O(n²).

kabanov 24.06.14 в 12:56

0
Минутку...

Следующая страница →