Совет нужен для физического движка - PullRequest
1 голос
/ 17 апреля 2011

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

Прежде всего, я видел, что Game-Physics-Engine-Development настоятельно рекомендуется для поставленной задачи, и мне было интересно, если бы вы могли дать мне второе мнение. Должен ли я получить Это? Кроме того, просматривая Amazon, я наткнулся на Game Engine Architecture , и, поскольку я хочу создать физический движок для игр, я подумал, что это может быть хорошо прочитано.

Во-вторых, я знаю, что моделирование физики требует больших вычислительных ресурсов, поэтому я хотел бы использовать CUDA или OpenCL. Прямо сейчас я склоняюсь к OpenCL, потому что он будет работать как на чипсетах NVIDIA, так и на чипсетах ATI. Что вы, ребята, предлагаете?

PS: я буду реализовывать это на C ++ в Linux.

Спасибо.

Ответы [ 2 ]

9 голосов
/ 13 августа 2011

Я бы предложил прежде всего спланировать простую игру в качестве тестового примера для вашего движка.Базовая игра будет стимулировать разработку и разработку API.Написание движка без четкой цели делает проект более рискованным.Хотя я согласен с тем, что nVidia и ATi следует рассматривать как отдельные цели по соображениям производительности, я бы рекомендовал вам не начинать с них.

Я лично написал физический движок для Uncharted: Drake's Fortune - игры для PS3 - и я сделалпередать в C ++, и когда это сработало, сделал проход, чтобы оптимизировать его для VMX, а затем положить его на SPU.Имейте в виду, я сделал только часть того, что я хотел сделать изначально из-за нехватки времени.После этого я сделал итерацию, чтобы разделить этапы данных и сформулировать конвейер преобразований данных.Это важно, потому что современные процессоры с нетривиальным кодом, будь то CPU, GPU или SPU, проводят большую часть времени в ожидании кэшей.Вы должны уделять особое внимание структурам данных и составлять их так, чтобы на любом этапе у вас был небольшой рабочий набор данных.Например, сначала я делаю широкофазные, поэтому мне не нужны фигуры, но мне нужны ограничивающие рамки мирового пространства.Поэтому я разбил ограничивающие блоки на отдельный массив и вычислил их все вместе за один проход, который выписал их оптимальным образом.В качестве входных данных для вычисления bbox мне нужны преобразования фигур и некоторые их границы, но не обязательно целые фигуры.После широкой фазы я вычисляю / обновляю сим-острова, одновременно выполняя узкую фазу, для которой мне действительно нужны фигуры.И так далее - я описал это с помощью картинок в статье для Game Physics Pearls , которую я написал.

Я думаю, что я пытаюсь сказать следующие пункты:

  1. Убедитесь, что у вас есть четкая цель, которая движет вашим развитием - очень простая игра с продуманным дизайном была бы лучшей в случае с игровым физическим движком.
  2. Не пытайтесь оптимизировать, пока у вас нет работающеготовар.Сначала напишите это самым простым и быстрым способом и исправьте все ошибки в математике.Спроектируйте его так, чтобы вы могли портировать его на CUDA позже, но не начинайте писать ядра CUDA до того, как на экране появятся окна.
  3. После того, как вы напишите первый проход в C ++, оптимизируйте его для CPU: упроститеэто так, что он не перебивает кэш и не разбивает код на части, чтобы не было спагетти вызовов, и весь код каждого этапа локализован.Это поможет: а) портировать на CUDA; б) перенести на OpenCL; в) перенести на консоль; г) сделать так, чтобы он работал достаточно быстро; д) сделать возможным отладку.
  4. При разработке не поддавайтесь искушению пойти и сделать что-то, что выпросто подумайте, если эта функция не является необходимой для вашей ясной цели (см. # 1) - вот почему вам нужна цель, чтобы направить вас к ней и дать возможность завершить реальный проект.Отвлечения обычно убивают проекты без четких целей.
  5. Помните, что, так или иначе, разработка программного обеспечения является итеративной.Это нормально, чтобы сделать черновик, а затем уточнить его.Кожа, промыть, повторить - это мантра программиста:)

Легко дать совет.Если ты хочешь что-то сделать, просто иди и сделай это, и мы будем сидеть сложа руки и критиковать :)

1 голос
/ 17 апреля 2011

Вот ответ относительно выбора CUDA или OpenCL. У меня нет рекомендации по книге.

Если вы хотите запустить свою программу на чипсетах NVIDIA и ATI, то OpenCL упростит эту задачу. Тем не менее, вы захотите написать разные версии каждого ядра, чтобы получить хорошую производительность на каждом чипсете. Например, на картах ATI вы хотите вручную векторизовать код, используя типы данных float4 / int4 (или принять почти четырехкратное снижение производительности), тогда как NVIDIA лучше работает со скалярными типами данных.

Если вы ориентируетесь только на NVIDIA, тогда в CUDA удобнее программировать.

...