Можете ли вы запрограммировать игру на чистом графическом процессоре?

StackOverflow https://stackoverflow.com/questions/1789178

  •  21-09-2019
  •  | 
  •  

Вопрос

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

К сожалению, я в некотором роде новичок в области компьютерной графики 3D, я прослушал курс бакалавриата по этому предмету и надеюсь пройти углубленный курс в следующем семестре, и я уже читаю множество книг и статей, чтобы узнать больше.Тем не менее, мой руководитель считает, что будет лучше, если я сейчас выдвину общую идею диссертации, а затем потрачу время на ее изучение при подготовке к выполнению моего дипломного предложения.Мой руководитель снабдил меня несколькими хорошими идеями, но я предпочел бы заняться чем-то более интересным самостоятельно, что, надеюсь, связано с играми и дает мне больше возможностей узнать больше об этой области.Меня не волнует, было ли это уже сделано, для меня диссертация - это скорее возможность узнать о вещах глубже и проделать существенную работу самостоятельно.

Я не очень разбираюсь в программировании на графических процессорах и все еще изучаю шейдеры и языки, такие как CUDA.Одна из моих идей - запрограммировать всю игру (или как можно больше) на графическом процессоре, включая всю игровую логику, искусственный интеллект и тесты.Это навеяно чтением статей по GPGPU и такими вопросами, как этот Я не знаю, насколько это возможно с моими знаниями, а мой руководитель мало что знает о последних графических процессорах.Я уверен, что со временем я смогу ответить на этот вопрос самостоятельно, но было бы удобно, если бы я мог знать ответ заранее, чтобы я мог также рассмотреть другие идеи.

Итак, если вы зашли так далеко, мой вопрос:Используя только шейдеры или что-то вроде CUDA, можете ли вы создать полноценную, простую 3D-игру, использующую мощь и параллелизм графических процессоров?Или мне не хватает какого-то ограничения или разницы между графическими процессорами и ЦП, из-за которых большая часть моего кода всегда будет привязана к ЦП?Я читал о физических движках, работающих на графическом процессоре, так почему бы не обо всем остальном?

Это было полезно?

Решение

Отказ от ответственности:Я защитил докторскую диссертацию, но никогда не руководил собственным студентом, так что отнеситесь ко всему, что я собираюсь сказать, с недоверием!

Я думаю, что попытка перенести как можно больше игр на графический процессор - отличный способ начать свой проект, но в конечном итоге смысл вашей работы должен заключаться в:"Есть такая штука, которая является важной частью многих игр, но в ее нынешнем состоянии плохо подходит для графического процессора:вот как я изменил его, чтобы он хорошо подходил".

Например, Фортран упомянул, что алгоритмы искусственного интеллекта представляют собой проблему, потому что они, как правило, полагаются на рекурсию.Верно, но это не обязательно нарушает условия сделки:академическое сообщество благосклонно относится к искусству преобразования рекурсивных алгоритмов в итеративную форму, и оно станет хорошим центральным элементом вашей диссертации.

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

Но будьте осторожны с выбором руководителя.Если у вашего руководителя нет какого-либо соответствующего опыта, вам следует выбрать кого-то другого, у кого он есть.

Другие советы

Я все еще жду эмулятор Gameboy, который работает полностью на графическом процессоре, в который просто загружается само игровое ПЗУ и текущий пользовательский ввод, и в результате получается текстура, отображающая игру - возможно, вторая текстура для вывода звука :)

Основная проблема заключается в том, что вы не можете получить доступ к постоянному хранилищу, пользовательскому вводу или аудиовыходу с графического процессора.Эти компоненты по определению должны находиться на процессоре (хотя карты с HDMI имеют аудиовыход, но я думаю, что вы не можете управлять им с графического процессора).Кроме того, вы уже можете загружать большие части игрового кода в графический процессор, но я думаю, что этого недостаточно для 3D-игры, поскольку кто-то должен передавать 3D-данные в графический процессор и указывать ему, какие шейдеры следует применять к какой части.На самом деле вы не можете случайным образом получить доступ к данным на графическом процессоре или запустить произвольный код, кто-то должен выполнить настройку.

Некоторое время назад вы бы просто настроили текстуру с исходными данными, целевой объект рендеринга для результирующих данных и пиксельный шейдер, который выполнял бы преобразование.Затем вы отрисовали квадратик с шейдером в целевой объект рендеринга, который выполнил бы вычисления, а затем прочитал текстуру обратно (или использовал ее для дальнейшего рендеринга).Сегодня шейдеры четвертого и пятого поколений (Shader Model 4.0 и все, что есть в DirectX 11) упростили работу, так что вы можете использовать шейдеры большего размера и легче обращаться к памяти.Но все равно их приходится настраивать извне, и я не знаю, как обстоят дела сегодня с хранением данных между фреймами.В худшем случае процессору приходится считывать данные с графического процессора и нажимать еще раз, чтобы сохранить игровые данные, что всегда происходит медленно.Но если вы действительно сможете дойти до того, что единый общий цикл настройки / рендеринга было бы достаточно для запуска вашей игры, вы могли бы сказать, что игра работает на графическом процессоре.Однако код будет сильно отличаться от обычного игрового кода.Большая часть производительности графических процессоров обусловлена тем фактом, что они выполняют одну и ту же программу в сотнях или даже тысячах параллельных блоков затенения, и вы не можете просто написать шейдер, который может отрисовывать изображение в определенном положении.Пиксельный шейдер по определению всегда выполняется на одном пикселе, а другие шейдеры могут выполнять действия в произвольных координатах, но они не имеют дела с пикселями.Думаю, это будет нелегко.

Я бы предложил просто опробовать те моменты, о которых я сказал.На мой взгляд, наиболее важным является сохранение состояния между кадрами, потому что, если вы не можете сохранить все данные, все невозможно.

Во-первых, я не компьютерный инженер, поэтому мои предположения не могут быть даже крупицей соли, возможно, в наноразмерном масштабе.

  • Искусственный интеллект?Нет проблем.В Google существует бесчисленное множество примеров нейронных сетей, работающих параллельно.Пример: http://www.heatonresearch.com/encog
  • Нахождение пути?Вы просто пробуете некоторые параллельные алгоритмы поиска путей, которые уже есть в Интернете.Только один из них: https://graphics.tudelft.nl/Publications-new/2012/BB12a/BB12a.pdf
  • Рисование?Используйте совместимость dx или gl с cuda или cl, чтобы рисование не пересекало полосу pci-e.Может даже выполнять трассировку лучей по углам, так что больше никаких z-битв, даже чистый экран с трассировкой лучей выполним с основным графическим процессором, использующим низкий предел глубины.
  • Физика?Самая простая часть - просто повторите простую интеграцию по Эйлеру или Верле и часто проверяйте стабильность, если порядок ошибок велик.
  • Генерация карты / рельефа?Вам просто нужен твистер Мерсенна и триангулятор.
  • Сохранить игру?Конечно, вы можете сжать данные параллельно перед записью в буфер.Затем планировщик записывает эти данные по частям на жесткий диск через DMA, чтобы не было задержек.
  • Рекурсия?Напишите свой собственный алгоритм стека, используя основную видеопамять, а не локальную память, чтобы другие ядра могли работать на волновых фронтах и лучше использовать графический процессор.
  • Требуется слишком много целых чисел?Вы можете привести к значению с плавающей точкой, затем выполнить 50-100 вычислений, используя все ядра, а затем привести результат обратно к целому числу.
  • Слишком много ветвлений?Вычислите оба случая, если они просты, чтобы каждое ядро было выстроено в линию и заканчивалось синхронно.Если нет, то вы можете просто поставить собственный предсказатель ветвления, чтобы в следующий раз он предсказывал лучше, чем аппаратное обеспечение (может ли это быть?) с помощью вашего собственного подлинного алгоритма.
  • Требуется слишком много памяти?Вы можете добавить в систему другой графический процессор и открыть канал DMA или CF / SLI для более быстрой связи.
  • Самая сложная часть, на мой взгляд, - это объектно-ориентированный дизайн, поскольку создавать псевдо-объекты в gpu очень странно и зависит от оборудования.Объекты должны быть представлены в памяти хоста (cpu), но для эффективности они должны быть разделены по множеству массивов в gpu.Пример объектов в памяти хоста:orc1xy_orc2xy_orc3xy.Пример объектов в памяти графического процессора:orc1_x__orc2_x__ ...orc1_y__orc2_y__ ...

Ответ уже был выбран 6 лет назад, но для тех, кто интересуется актуальным вопросом, Shadertoy, платформа WebGL для живого кодирования, недавно добавила функцию "multipass", позволяющую сохранять состояние.

Вот такой живая демо-версия игры Bricks работает на графическом процессоре.

Меня не волнует, если это уже было сделано, для меня диссертация - это скорее возможность узнать о вещах глубоко и проделать существенную работу над собой самостоятельно.

Тогда ваше представление о том, что такое тезис, совершенно неверно. Диссертация должна быть оригинальным исследованием. --> редактировать:Я думал о докторской диссертации, а не о магистерской ^_^

Что касается вашего вопроса, то наборы команд и возможности графического процессора очень специфичны для векторных операций с плавающей запятой.Игровая логика обычно использует мало логики с плавающей запятой и много логики (ветви и деревья решений).

Если вы взглянете на Страница CUDA в Википедии вы увидите:

Он использует рекурсию-бесплатно, указатель функции-бесплатно подмножество с язык

Так что забудьте о реализации там каких-либо алгоритмов искусственного интеллекта, которые по сути являются рекурсивными (например, A * для поиска пути).Возможно, вы могли бы имитировать рекурсию с помощью стеков, но если это явно не разрешено, то на это должна быть причина.Отсутствие указателей на функции также несколько ограничивает возможность использования таблиц отправки для обработки различных действий в зависимости от состояния игры (вы могли бы использовать снова связанные конструкции if-else, но там что-то плохо пахнет).

Эти ограничения в языке отражают то, что базовый HW в основном предназначен для выполнения задач потоковой обработки.Конечно, существуют обходные пути (стеки, цепочка if-else), и теоретически вы могли бы реализовать там практически любой алгоритм, но они, вероятно, сильно снизят производительность.

Другой момент касается обработки ввода-вывода, как уже упоминалось выше, это задача для основного процессора (потому что именно он выполняет операционную систему).

Вполне реально написать магистерскую диссертацию по предмету и с использованием инструментов, которые вам, когда вы начинаете, незнакомы.Тем не менее, это большой шанс, которым нужно воспользоваться!

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

Не менее важен и ваш руководитель.Крайне важно, чтобы вы взялись за какую - то проблему, к которой они проявляют интерес - с которой они сами знакомы , - чтобы они могли заинтересоваться оказанием помощи ты получите отличную оценку.

У вас было много времени на хобби, чтобы почесать зуд, без сомнения, у вас будет еще больше времени на хобби в будущем.Но, к сожалению, время для магистерской диссертации - это не время для хобби.

Несмотря на то, что графические процессоры сегодня обладают огромной вычислительной мощностью, они, независимо от таких вещей, как CUDA и OpenCL, ограничены ограниченным набором применений, в то время как центральный процессор больше подходит для вычисления общих вещей, с такими расширениями, как SSE, для ускорения выполнения конкретных общих задач.Если я не ошибаюсь, некоторые графические процессоры аппаратно не могут выполнить деление двух целых чисел с плавающей запятой.Конечно, ситуация значительно улучшилась по сравнению с тем, что было 5 лет назад.

Было бы невозможно разработать игру для запуска полностью на графическом процессоре - для ее выполнения на каком-то этапе потребовался бы центральный процессор что - то, однако заставить графический процессор выполнять больше, чем просто графику (и даже физику) в игре, безусловно, было бы интересно, с той лишь разницей, что разработчики игр для ПК сталкиваются с самой большой проблемой, связанной с необходимостью бороться с различными спецификациями компьютера, и поэтому вынуждены ограничиваться включением обратной совместимости, усложняя ситуацию.Архитектура системы будет иметь решающее значение - например, Playstation 3 способна передавать несколько гигабайт в секунду между центральным процессором и оперативной памятью, графическим процессором и видеопамятью, однако пиковая скорость доступа центрального процессора к памяти графического процессора превышает 12 Мбит / с.

Подход, который вы, возможно, ищете, называется "GPGPU" для обозначения "графического процессора общего назначения".Хорошими отправными точками могут быть:

Слухи о впечатляющих успехах этого подхода ходят уже несколько лет, но я подозреваю, что через несколько лет это станет повседневной практикой (если только архитектуры процессоров сильно не изменятся и не сделают его устаревшим).

Ключевым моментом здесь является параллелизм:если у вас возникла проблема, когда вам требуется большое количество параллельных процессоров.Таким образом, возможно, нейронные сети или генетические алгоритмы могут быть хорошим набором проблем для атаки с помощью графического процессора.Возможно, также ищу уязвимости в криптографических хэшах (я полагаю, взлом DES на графическом процессоре был бы неплохим тезисом :)).Но проблемы, требующие высокоскоростной последовательной обработки, похоже, не слишком подходят для графического процессора.Так что эмуляция GameBoy может выходить за рамки.(Но можно было бы рассмотреть возможность эмуляции кластера маломощных машин.)

Я бы подумал, что проект, касающийся игровой архитектуры, ориентированной на многоядерные процессоры и графические процессоры, был бы интересен.Я думаю, что это все еще та область, где проводится большая работа.Для того чтобы воспользоваться преимуществами текущего и будущего компьютерного оборудования, потребуются новые игровые архитектуры.Я был на GDC 2008, и там были переговоры ome, связанные с этим.У Gamebryo был интересный подход, при котором они создавали потоки для обработки вычислений.Вы можете указать количество ядер, которые вы хотите использовать, чтобы, если у вас не будет недостатка в других библиотеках, которые могут быть многоядерными.Я предполагаю, что вычисления также могли бы быть ориентированы на графические процессоры.Другие подходы включали таргетинг на разные системы для разных ядер, чтобы вычисления могли выполняться параллельно.Например, первое разделение, предложенное в выступлении, состояло в том, чтобы поместить рендерер в его собственное ядро, а остальную часть игры - в другое.Существуют и другие, более сложные методы, но все это в основном сводится к тому, как вы распределяете данные по разным ядрам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top