Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я сделал кандидатскую диссертацию, но никогда не руководил своим учеником, поэтому возьмите все, что я собираюсь сказать, с солью!

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Если вы посмотрите на страницу CUDA wikipedia, вы увидите:

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Здесь живая демонстрация игры Bricks, работающей на Gpu.

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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