Я строю игру на основе вокселей и использую компонент движения на основе AABB. Основная функция aabbsweep вызывает мою функцию RaycastBlocks несколько раз в тройном вложенном цикле, чтобы собрать блоки для проверки столкновений. По словам моего Profiler, он занимает ~ 70% игры. Развертка AABB используется для применения скорости к коллайдеру моей сущности, а затем изменить его в качестве ответа на столкновение, чтобы произойти скольжение. Моя цель - снизить использование процессора при сохранении точности столкновения. MAX_TRIES в raycastblocks - это просто защита от бесконечных циклов, если что -то пойдет не так. Существуют ли известные методы для более эффективных проверок на столкновениях вокселей (например, алгоритмы обхода вокселей, такие как аманатиды и WOO, пространственное разделение или иерархии ограничивающего объема)? Где я могу кэшировать результаты или уменьшить количество вызовов? Любые советы по минимизации вставки тяжелых наборов или тройных вложенных петлей особенно полезны. Я предоставил заполнителю включить для краткости. Любая обратная связь по реорганизации кода, улучшению алгоритма, или лучшие передовые практики для столкновения на основе вокселей.
Я попытался максимизировать производительность, оставив некоторое пространство для неупорядоченного набора и сварки некоторых кубиков в более крупное, но мне еще предстоит найти какой -либо алгоритм, который еще не замедляет игру.
Я строю игру на основе вокселей и использую компонент движения на основе AABB. Основная функция aabbsweep вызывает мою функцию RaycastBlocks несколько раз в тройном вложенном цикле, чтобы собрать блоки для проверки столкновений. По словам моего Profiler, он занимает ~ 70% игры. Развертка AABB используется для применения скорости к коллайдеру моей сущности, а затем изменить его в качестве ответа на столкновение, чтобы произойти скольжение. Моя цель - снизить использование процессора при сохранении точности столкновения. MAX_TRIES в raycastblocks - это просто защита от бесконечных циклов, если что -то пойдет не так. Существуют ли известные методы для более эффективных проверок на столкновениях вокселей (например, алгоритмы обхода вокселей, такие как аманатиды и WOO, пространственное разделение или иерархии ограничивающего объема)? Где я могу кэшировать результаты или уменьшить количество вызовов? Любые советы по минимизации вставки тяжелых наборов или тройных вложенных петлей особенно полезны. Я предоставил заполнителю включить для краткости. Любая обратная связь по реорганизации кода, улучшению алгоритма, или лучшие передовые практики для столкновения на основе вокселей.[code]bool CJABGWorld::AABBSweep(SHitResult& result, const SAABB_CollisionShape& shape, const EngineMath::SVector3f& position, const EngineMath::SVector3f& offset, const SCollisionChannelTracker& channels) { // Profile the entire function CProfiler::ScopedSection entireSweepSection(g_profiler, "CJABGWorld::AABBSweep", false); //62% of the entire tick
EngineMath::SVector3f min = position + shape.Pivot - shape.Size; EngineMath::SVector3f max = position + shape.Pivot + shape.Size;
// 1) Gather possible blocks std::unordered_set possible_blocks; possible_blocks.reserve(100); { CProfiler::ScopedSection gatherBlocksSection(g_profiler, "CJABGWorld::AABBSweep::GatherBlocks", false); //21% of the entire tick
// Precompute integer bounds just once const int xMin = static_cast(std::floor(min.x)) - 1; const int xMax = static_cast(std::ceil(max.x)) + 1; const int yMin = static_cast(std::floor(min.y)) - 1; const int yMax = static_cast(std::ceil(max.y)) + 1; const int zMin = static_cast(std::floor(min.z)) - 1; const int zMax = static_cast(std::ceil(max.z)) + 1;
// (Optional) Pre-reserve if you can guess an upper bound // You won't know exactly how many will be inserted, // but picking something big reduces rehashes: // possible_blocks.reserve((xMax - xMin + 1) * // (yMax - yMin + 1) * // (zMax - zMin + 1) * someFactor);
if (intersection.x GetCollider()->SweepColliderAgainstTheWorld(result, offset, params)) { offset += result.Normal * glm::abs(offset) * (1.f - result.Delta + 10e-3f); for(int i = 0; i < 3; ++i) offset[i] = glm::isnan(offset[i]) ? 0 : offset[i]; return true; } return false; } [/code] Я попытался максимизировать производительность, оставив некоторое пространство для неупорядоченного набора и сварки некоторых кубиков в более крупное, но мне еще предстоит найти какой -либо алгоритм, который еще не замедляет игру.
Я строю игру на основе вокселей и использую компонент движения на основе AABB. Основная функция aabbsweep вызывает мою функцию RaycastBlocks несколько раз в тройном вложенном цикле, чтобы собрать блоки для проверки столкновений. По словам моего...
Я смоделировал очень простую 2D-игру в Swift. Я использовал структуры для представления всех элементов игрового процесса, включая спрайты, контакты, поведение/движения, анимацию и т. д. Все это достаточно эффективно, а игра очень проста (например,...
Я строю шахматный двигатель в C ++ и в настоящее время работаю над генерацией движения. Чтобы измерить производительность, я использую Perft, но моя главная цель состоит в том, чтобы сделать сам генератор движения быстрее. x & -x , std ::...
Я работаю над детективным игровым заданием, используя P5.JS (как часть тематического исследования «Sleath»). Детективный персонаж перемещается через городскую карту, основанную на if ... else, если условия, которые регулируют Speedx и Speedy....
Я довольно новичок в JavaScript, и я пытался создать небольшую игру, чтобы выучить новые концепции. Проблема, с которой я сталкиваюсь, заключается в том, что снаряды в игре часто имеют более высокую скорость, чем ширина объектов, с которыми они...