-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathObjectPoolTask.txt
More file actions
79 lines (62 loc) · 5.66 KB
/
ObjectPoolTask.txt
File metadata and controls
79 lines (62 loc) · 5.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Система частиц (Particle System) для консольной игры
Контекст:
Ты разрабатываешь консольную RPG.
Геймдизайнер хочет добавить визуальные эффекты: когда игрок наносит урон, появляются частицы крови;
когда подбирает предмет - золотые искры; когда использует заклинание - магические вспышки.
Проблема: если каждый раз создавать новый объект частицы, а потом удалять его через сборщик мусора (GC),
игра будет тормозить. Частиц может быть сотни в секунду.
Задача: Реализовать универсальный пул объектов для переиспользования частиц.
Что нужно сделать:
1. Класс Particle (объект, который будет переиспользоваться)
У частицы должны быть:
- int X, int Y - координаты
- char Symbol - символ для отображения (например, '*', '·')
- ConsoleColor Color - цвет частицы
- float Lifetime - время жизни в секундах (или количество кадров)
- float CurrentTime - сколько уже прожила
Важно: Класс Particle должен уметь "сбрасываться" в начальное состояние.
При получении из пула частица должна быть как новая.
2. Класс ParticlePool (пул объектов)
Реализовать один обязательный метод и один опциональный:
Обязательный метод:
- public Particle Get()
- Возвращает готовую к использованию частицу.
- Если в пуле есть неактивные (свободные) частицы - берет одну, сбрасывает ее состояние и возвращает.
- Если свободных нет - создает новую частицу (но после использования она должна вернуться в пул).
Опциональный метод (но очень желательный):
- public void Return(Particle particle)
- Возвращает частицу обратно в пул.
- Помечает её как "неактивную", чтобы ее можно было переиспользовать.
3. Демонстрация работы в Main
Покажи работу пула на примере:
1. Создаешь пул с начальным размером, например, 5 частиц.
2. "Выстреливаешь" 10 частиц подряд (вызываешь Get() 10 раз).
3. После того как часть частиц "умерла" (их время жизни истекло), возвращаешь их в пул.
4. Снова запрашиваешь новые частицы - они должны браться из пула, а не создаваться заново.
Важно: Без использования будущих тем. Не используй Thread, async/await, сложные таймеры.
Время жизни можно симулировать простым счетчиком кадров/циклов.
Ожидаемая логика в Main:
- Создать пул на 5 частиц
- "Выстрелить" 10 частиц
- Симулировать игровой цикл
- Обновляй время жизни частиц и возвращай "мертвые" в пул
- Добавляй новые частицы (имитация "нового выстрела")
Ожидаемый результат:
- При первых 5 запросах частицы создаются (пул пуст).
- При 6-10 запросах частицы переиспользуются из пула (свободные).
- После "смерти" частиц они возвращаются в пул и могут быть использованы снова.
- В консоли видно, когда создается новая частица, а когда берется из пула.
Подсказки:
1. Как хранить свободные частицы:
Можно использовать Stack<Particle> или Queue<Particle>.
2. Как хранить все частицы:
Нужно хранить ссылки на все созданные частицы, чтобы при Return() знать,
какую именно частицу вернуть в пул свободных.
3. Метод Reset() или Clear():
Создай в классе Particle метод, который сбрасывает состояние,
чтобы при повторном использовании частица была "чистой".
4. Конструктор пула:
При создании пула можно сразу создать N частиц и положить их в пул свободных.
Бонус (если будет легко):
Добавь возможность создавать частицы разных типов (например, FireParticle, BloodParticle),
используя наследование или композицию, но без усложнения логики пула.