Member
Статус: Не в сети Регистрация: 23.12.2004 Откуда: Беларусь, Минск
Попал в геймдев, хотя думал быть веб-прогером. Поэтому есть вопрос по алгоритмам. Часто приходится иметь дело с вещами типа триггеров - каждый апдейт спрашивать, а есть ли кто рядом, или наступил ли определённый момент времени (и если наступил, то не обрабатывал ли я наступление этого момента времени раньше), т.е. конструкции типа:
Код:
if ((target.transform.position - transform.position).magnitude < 0) {... } if (!started) {if (Time.time > time) {started = true; ... } }
очень распространены в проекте. И все эти балалайки крутятся и апдейтятся каждый кадр с самого старта игры в количестве сотен (некоторые я прибиваю, после того как стали не нужны, но с большинством не очевидно, что может произойти, поэтому нет) (да, пишу на C# под Юнити) При том, что игры специфические - под очень мощное железо (7D-стереоаттракционы), то позволить быдло-кодинг я технически могу, а душа болит и хочет красоты и оптимальности и оптимизаций.
_________________ ASUS A4M88T-M, Athlon II X3 425, 2GB NCP, video - internal ATI 4250, 200GB Samsung HDD, Win7 x64
Advanced member
Статус: Не в сети Регистрация: 10.04.2003 Откуда: Москва
Гы! Тут прям ща столько специалистов в 3д, что 'ни продыхнуть'. Место ты выбрал неудачное. Пошто не пошел, хотя-бы, на gamedev.ru ?
По subj - не хочешь использовать условные события, значит делай 'живыми' сами события. Т.е. выполняй их всегда, а не по условиям (что выродится в 'оглядывание и "wait" '). Недостаток - затраты процессорного времени гораздо больше. Достоинство - динамичнее система. (на правах бреда)
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
Хм. Странное решение обрабатывать триггеры каждый кадр. Ну лучше ли для них иметь отдельный таймер? Я не знаю как у вас это реализовано. У меня лично (хотя это препреальфа вариант) есть "список" неактивных триггеров. Они через каждый промежуток времени проверяются. Как только триггер стартовал, он из этого "списка" переходит в список активных триггеров К тому же я не думаю, что у вас именно это большой % ресурсов съедает (хотя вам виднее, тем более вы легко можете это проверить). И вообще C# - странный выбор для таких задач. Действительно на Gamedev больше вероятность что просветят
Последний раз редактировалось Industrialice 06.02.2012 23:52, всего редактировалось 1 раз.
Junior
Статус: Не в сети Регистрация: 10.11.2011 Откуда: SPB, RU
кстати, да, а почему бы не проверять триггеры с прореживанием по кадрам или даже по времени с учетом приоритета (например, одни - каждый кадр, другие - раз в 50-100 мс, третьи - раз в 200 мс)?
Молодец. Эта специальность гораздо интересней, престижней и более высокооплачиваемая.
AzaZeo писал(а):
Поэтому есть вопрос по алгоритмам. Часто приходится иметь дело с вещами типа триггеров - каждый апдейт спрашивать, а есть ли кто рядом, или наступил ли определённый момент времени (и если наступил, то не обрабатывал ли я наступление этого момента времени раньше), т.е. конструкции типа:
Код:
if ((target.transform.position - transform.position).magnitude < 0) {... } if (!started) {if (Time.time > time) {started = true; ... } }
очень распространены в проекте.
Это вопрос действительно по алгоритмам. По конкретным алгоритмам. Каждый случай надо рассматривать отдельно. В некоторых случаях сделать ничего нельзя, в других - можно очень сильно оптимизировать. Здесь, на мой взгляд, нужно начинать рассматривать проект на очень высокой стадии абстракции и искать - нет ли там чего то, что можно сделать по другому, более оптимально. Вполне возможно, что изменения для оптимизации здесь надо будет вносить на уровнях более высоких, чем те, которые находятся в компетенции программистов.
Единственное что хочу заметить - эти кусочки напоминают процедурный код с использованием объектов/методов как переменных/функций (наверно ошибаюсь, но все же). Если таких кусков в одном месте текста слишком много - наверняка процедурный стиль. Лечится просто - твой код должен посмотреть опытный ООП-программер и сказать, что он думает, относительно соответствия ООП-стилю. Нет опытного - сойдет и малоопытный.
Код, кстати, вполне может быть и процедурным, только в таком случае не следовало брать за основу шарп, а писать на обычном си. В чужой монастырь со своим уставом не ходят.
Если у проекта есть программирующий архитектор/ведущий программист - нужно писать в его стиле, насколько плох или хорош бы он ни был, игнорируя все остальные методики, повторяя любые мелочи. В таком случае время на проверку будет минимальным - проект быстрей попадет в продакшн. У меня есть такая вот личная особенность, например. Я не могу читать код, если открывающая фигурная скобка не стоит на отдельной строке. Если я беру чужой код, то мне приходится сначала его форматировать по своему стилю и только потом разбираться с содержимым. Иначе начинаю тупить.
AzaZeo писал(а):
При том, что игры специфические - под очень мощное железо (7D-стереоаттракционы), то позволить быдло-кодинг я технически могу, а душа болит и хочет красоты и оптимальности и оптимизаций.
Хороший код выглядит следующим образом - он корректно выполняет поставленную задачу. Отличный код отличается от хорошего тем, что его способен читать, поддерживать и дорабатывать любой программист-новичок. Если код соответствует этим требованиям - это ни в коем случае не быдлокод. Код не должен быть быстрым - его быстродействие просто должно укладываться в тех. требования. Вообще касательно оптимизации, нужно всегда помнить правило: "Первое правило оптимизации - не оптимизируй. Второе - смотри правило один". Оптимизацией можно заниматься только в случае "ну вообще куча свободного времени нечем занятся скукотищааа..". Или если она поставлена сверху как основная задача.
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
dE fENDER писал(а):
Вообще касательно оптимизации, нужно всегда помнить правило: "Первое правило оптимизации - не оптимизируй. Второе - смотри правило один". Оптимизацией можно заниматься только в случае "ну вообще куча свободного времени нечем занятся скукотищааа..". Или если она поставлена сверху как основная задача.
Двумя руками протестую. Ради такого случая хочется иметь более двух рук. В последнее время выполнял 2 проекта, оба они должны были так или иначе обрабатывать изображения. Вот вам 1 примера из этих проектов: в первом проекте на C# в одной из функций требовалась узнать количество уникальных цветов в картинке. Сначала был использован хороший и простой алгоритм. Но, при обработке даже весьма небольшой картинки (640х480), время выполнение составляло более минуты. Если загрузить большое изображение, можно было смело на ночь оставлять компьютер - и это на i5 2500K с разгоном. Несколькочасовая оптимизация, работа на уровне битов, позволила поднять быстродействие в ~900 раз (это усериднённо, а вообще в некоторых случаях до нескольких десятков тысяч раз), а потребление памяти опустить до 2 МБ. Во втором проекте можно также привести несколько примеров, когда оптимизация позволяла увеличить скорость в сотни раз. И это при том, что изначально были правильные алгоритмы, никак не из разряда быдло-кодинга
З.Ы. Я в своей жизни слышал много странных вещей. Но призыв отказаться от оптимизиции слышу впервые. Тем более речь о 3Д-движке. Вы писали свои движки? Я вот разрабатываю свой потихоньку, и если в нём отказаться от оптимизаций вообще, вы получите потребление видеопамяти в десятки гигабайт и ниочёмную производительность. Чтобы уложиться в тех.требования, понятно, этот код должен быть чертовски быстрым (количество всего, что нужно сделать за 1 кадр, просто огромно). У меня сейчас тех.требование таково: не менее 60 фпс в 1920х1080 на 6600GT. Но если можно будет получить, условно, 70 фпс вместо 60 посидев над оптимизациней - надо будет иметь реально везкие причины чтобы этого не сделать
member+
Статус: Не в сети Регистрация: 16.01.2004 Откуда: Estonia,Tallinn
Industrialice писал(а):
призыв отказаться от оптимизиции слышу впервые
Это главный принцип разработки коммерческого ПО ещё с 80-ых годов.
Если ты потратишь пол года на оптимизацию, то программа будет работать быстрее. Если же ты потратишь пол года на отдых, то программа тоже будет работать быстрее, потому что к тому времени компы уже уйдут вперёд, упадут в цене, куча народу уже сделает апгрейд, и твоё требование "60 фпс в 1920х1080 на 6600GT" к тому времени уже можно будет менять на "60 фпс в 1920х1080 на 6800"
Вспомни как MS винду делала... Сначала сделали тормознутый GUI а потом просто ждали когда появятся более быстрые компьютеры...
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
Vladson, ну коммерческий смысл можно найти, конечно. С другой стороны абсолютное большинство проектов имеют чёткие требования к производительности: допустим, программа должна позволять с комфортом работать с ней будучи запущенной на Pentium IV с 256 МБ оперативы. Что значит комфортно? Понятно, что всё должно работать как можно быстрее - чем быстрее, тем лучше. Тут уже приходится тратить очень много времени на оптимизацию - кстати к слову, оптимизация - это отнюдь не рутинная задача, а творческая; обычно это гораздо интереснее, чем добавлять в программу функционал. И вообще среди программистов не зря существуют стереотипы, что сильный программист пишет куда как более быстрый и экономичный код, чем джуниор
Если вспомнить тот же DOOM 3, то для его оптимизации приглашали именитых специалистов в области оптимизации для х86
Оптимизация нужна всегда, просто по ходу оптимизации встаёт вопрос о разумности дальнейшей оптимизации. Например, я увеличил скорость в 900 раз - изображение 640х480 в среднем обрабатывается 50 миллесекунд, хорошо. Но фотография с 8-мп камеры обрабатывается более 3-х секунд, плохо. Что делать, дальше оптимизировать? Для этого у меня есть 3 варианта: 1) Работать напрямую с памятью. Чёрт, я не знаю как в C# работать с памятью не переключаясь в unsafe 2) Писать библиотеку на С++, которая бы обрабатывала изображение 3) Писать библиотеку на ассемблере, которая бы ←... А с другой стороны, может и ну его? Мне это делать неинтересно, да и кому придёт в голову обрабатывать такие гигантские картинки
С 3д-движком всё же дело иначе обстоит, особенно что касается тех частей программы, что выполняются циклически на протяжении очень долгого времени - а там в 3д-движках очень много такого кода. Вот тут уже не должен стоять вопрос "а может ну его?"
и да, 6600 GT временно - пока не найду на барахолке за смешные деньги затычку с потоковой архитектурой типа 2400Pro/8400GS
member+
Статус: Не в сети Регистрация: 16.01.2004 Откуда: Estonia,Tallinn
Джоель Спольски (программист работавший в MS над Excel) писал(а):
С начала времён и до, скажем, 1989 года, программисты вынуждены были заботиться об эффективности. Тогда просто не было столько памяти и не было столько процессорных тактов.
В конце 90-х некоторые компании, включая Microsoft и Apple, заметили (просто немного раньше, чем все остальные), что закон Мура позволяет не очень сильно переживать из-за производительности и использования памяти, а просто создавать классные вещи и ждать, пока железо подоспеет. Microsoft выпустила первую версию Excel для Windows в то время, когда 80386-е были слишком дороги, но они были терпеливы. Через пару лет вышел 80386SX и любой, кто мог позволить себе 1500-долларовый клон, мог запускать Excel.
У вас, как у программиста, благодаря копеечным ценам на память и удвоению скорости процессоров каждые два года, есть выбор. Можете потратить шесть месяцев, переписывая внутренние циклы на ассемблере, или потратить шесть месяцев играя барабанщиком в рок-н-рольной группе, и в обоих случаях ваша программа будет работать быстрее. У программистов на ассемблере нет фанаток.
В общем, мы больше не беспокоимся о производительности и оптимизации.
Остальное лирика. Если бы вы делали видео кодек с открытым исходным кодом, и вам нужна была скорость чтоб обойти конкурентов, оптимизация нужна. Если вы делаете продукт не имеющий конкурентов но имеющий фанатов (как раз например коммерческую игру, в которой супер сценарий, персонажи, музыка, и все будут фанатеть) то быстродействие это уже будет десятым делом.
Меня как творческого-программиста, это тоже бесит, я бы вообще всё на ASM писал бы, и дрючил бы за каждый лишний такт процессора или за использованный word там где можно обойтись байтом. Но это творчество, а в разработке же в команде и за деньги, важны совсем другие критерии (понятный коллегам код в едином стиле по всему продукту) пиар продукта, и много чего ещё, но не быстродействие. Оно совсем никому не нужно в коммерческой разработке... И только вредит.
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
Vladson писал(а):
дрючил бы за каждый лишний такт процессора или за использованный word там где можно обойтись байтом
Ну это если выбор между именно ворд и байт - такое редко бывает, а в подавляющем-то большинстве случаев стоит использовать дворд, даже если переменная не принимает значение больше, скажем, 10.
Что касается цитаты - мнение одного программиста всё же не может отражать реального положения дел. Тем более что у Excel и Word (не говоря уже о Internet Explorer), репутация тормозного и глючного **вна. Тормозная Виста (хотя 7 недалеко ушёл), вообще получилась феилом, несмотря даже на то, какими отвратительными способами M$ завлекли на неё юзеров
Что касается игр - да, на ПК ситуация в целом печальна - выходят всякие ГТА 4, которые не только ужасно оптимизированы, но ещё и имеют серьёзные утечки памяти. Зато на консолях разработчики ещё как убиваются чтобы заставить игры быстро работать на консольном хламе.
Я не сказал бы что преждевременная оптимизация вредит - хотя всякие случаи бывают. В тех проектах, что я делал вместе с другими программистами, всегда одна из моих обязанностей была оптимизация - получалось что я или сам писал алгоритм, или брал написанный, оптимизировал. И больше сюда никто не совался - мне понятно что там и как, у остальных другие заботы - ведь не обязательно чтобы все понимали как работает любая часть кода в программе
Добавлено спустя 29 минут 52 секунды: P.S. Вот вам обратный словам мелко$офтовского быдло-кодера пример:
Цитата:
Группа программистов в Valve, конечно потела немало крови на правильной реализации HDR в движке Source: находясь в разработке с 2003, они прошли не менее чем четыре различных метода решения проблемы HDR. Каждый из методов имел свои плюсы и свои минусы, так, например, один мог с легкостью реализовывать эффект повышенной яркости для "blooming", но производительность при этом сильно хромала и становилось невозможным использовать Multi-Sample Anti-Aliasing (MSAA). Однако Ньюэлл был непреклонен - пользователи не должны будут жертвовать возможностью использовать сглаживание, включая HDR.
С четвертого подхода ребятам удалось обойти это ограничение: MSAA работало; оно работало на всех видеокартах, совместимых с DX9, с хорошей производительностью даже на Radeon 9600. И действительно - производительность была лучшей по сравнению со всеми четырьмя методами, и только с небольшим падением производительности Half-Life 2 LDR.
Итог: HDR работает с железом, поддерживающим вторые и третьи шейдеры, и вы можете включать сглаживание одновременно c HDR
member+
Статус: Не в сети Регистрация: 16.01.2004 Откуда: Estonia,Tallinn
Industrialice писал(а):
мнение одного программиста
Это не его мнение, это революция рынка в те времена.
Industrialice писал(а):
мелко$офтовского быдло-кодера
Этот "быдлокодер" признанный во всём мире гуру. Причём как в области кодинга, так и позднее (когда ушёл из MS и открыл свою компанию) в области управления проектами. Много споров идёт о нём, кто-то считает его быдлокодером, кто-то гением, но факт остаётся фактом, о нём говорят, а он рассказывает вещи под которыми подписался бы сам капитан очевидность. Он говорит о простых и очевидных вещах, но о которых почему-то другие молчат.
Industrialice писал(а):
Группа программистов в Valve, конечно потела немало крови на правильной реализации HDR
Правильной реализации не значит оптимизации. У них был план они его выполняли. Они встретились с трудностью и её преодолели. Ни какой оптимизации в этом нет.
Добавлено спустя 2 минуты 37 секунд:
Industrialice писал(а):
Зато на консолях
Это отдельный рынок, там до сих пор есть спрос на оптимизации и джедайские техники, но это достаётся немалой ценой. Чаще всего разработка игры для консоли имеет очень строгие ограничения по железу, и выливается издателю в большие бабки. Но и тут прогресс не стоит на месте, каждый раз выходят всё новые и более быстрые консоли, а программисты умудряются писать всё более медленный код.
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
Vladson писал(а):
Правильной реализации не значит оптимизации. У них был план они его выполняли. Они встретились с трудностью и её преодолели. Ни какой оптимизации в этом нет.
Почему нету оптимизации? Если одно из условий - скорость, это уже подразумевает что требуется оптимизация. А условия такого могло и не быть - как у создателей Internet Explorer "Ну, если ничего не трогать, вроде даже работает. Вроде даже быстрее, чем если бы всё зависло"
Добавлено спустя 4 минуты 26 секунд:
Vladson писал(а):
Но и тут прогресс не стоит на месте, каждый раз выходят всё новые и более быстрые консоли, а программисты умудряются писать всё более медленный код.
Ну это и неудивительно, если посмотреть сколько всяких технологий в современных игр. Их же все невозможно глубоко знать - сликшом всего много. Те же шейдеры, это такое ватафак мазафака - по сути отдельный язык программирования на основе С (если речь о HLSL, без него это вообще по сути ассемблер), а компилятора нормального для этого дела не существует. Это объективная причина почему код становится менее эффективным. Необъективная - вот такой быдло-подход, как в цитате выше
member+
Статус: Не в сети Регистрация: 16.01.2004 Откуда: Estonia,Tallinn
Industrialice писал(а):
Если одно из условий - скорость, это уже подразумевает что требуется оптимизация
Нет. Правильная реализация сама по себе будет быстрой, и только когда не хватает даже её, тогда требуется оптимизация.
(На практике чаще всего и особенно в низкобюджетных проектах, хотя в больших и денежных проектах это также сплошь и рядом, получается писать изначально неправильный код, потом в лучшем случае исправлять ошибки и называть это оптимизацией, хотя это просто багфиксы, или вовсе ускорять изначально медленный код.)
Junior
Статус: Не в сети Регистрация: 24.08.2011 Откуда: Volgograd
Может че не так скажу, но в "С" не так рублю, я просто делал, когда писал на Вижеле делал просто основной код и типа скрипта в подставу на все остальное где похожее выполняется чтоль, я там как то измудрялся не помню точно, было лет 5 назад, все супер летало, даж 1,5 рублей получил за эту хрень...
_________________ -=AMD POWER FAN CLUB=- http://forums.tophardware.ru Обычно от огня бегут, а огнеборцы в него лезут... :-)
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
Vladson писал(а):
Нет. Правильная реализация сама по себе будет быстрой, и только когда не хватает даже её, тогда требуется оптимизация.
Наверное обычно так, а вообще это от круга задач программы зависит. Я вам мог бы привести из моего движка примеры, когда я переделывал совершенно правильные части кода, когда видел что в будущем эта часть будет всё сильнее и сильнее рубить производительность. И мне придётся экономить на чём-то другом. Если бы я не требовал от себя скорость - я мог бы сказать что тут всё правильно - даже придраться не к чему. Всё по науке И если речь о графике вообще( 2д, 3д ), в подавляющем большинстве случаев правильный алгоритм, но неоптимизированный, будет работать с неприемлимой скоростью
Junior
Статус: Не в сети Регистрация: 24.08.2011 Откуда: Volgograd
Наука не канает, все на собственных мышцах!!! Скорость зависит от чтения и обработки кодов которые ты задаешь, правильно??? Идем дальше, если у тебя есть несколько блоков которые повторяются пишешь один ставишь переменнную чтоб их использовать, я правильно веду логику??? Если еще дальше, пишешь блок который может изменяться в зависимости от переменной и все, и не зачем его каждый раз прописывать, ну я имею ввиду правтически одну и ту же процедуру,но с разными поддтипами и т.д. её не зачем писать когда переменная быстрее вставиться и блок обрабатываемой информации меньше, я правильно думаю??? Точнее мыслю, или я совсем ЛОХ стал в написании...
_________________ -=AMD POWER FAN CLUB=- http://forums.tophardware.ru Обычно от огня бегут, а огнеборцы в него лезут... :-)
Но призыв отказаться от оптимизиции слышу впервые.
Для продвинутых есть третье правило оптимизации. "Не оптимизируй. Пока...". Но оно не для этой темы. А первые два лучше распечатать и принимать как аксиому.
А вот эти строки - как закон:
А. Александреску, Стандарты программирования на C++. 101 правило и рекомендация писал(а):
Пока необходимость оптимизации не доказана— вашим приоритетом №1 должно быть написание кода для человека. (Если кто-то потребует от вас оптимизации кода — потребуйте доказательств необходимости этого.)
Также не забывать о таком правиле - "Не пессимизируйте преждевременно".
Industrialice писал(а):
P.S. Вот вам обратный словам мелко$офтовского быдло-кодера пример:...
Это не обратный пример. Во-первых:
С. Макконнелл, Совершенный код писал(а):
Оптимизацией кода (code tuning)... называют изменение корректного кода, направленное на повышение его эффективности. "Оптимизация" подразумевает внесение небольших изменений, затрагивающих один класс, один метод, а чаще всего - несколько строк кода. Крупномасштабные изменения проекта или другие высокоуровневые способы повышения производительности оптимизацией не считаются.
И в главных - там нарушались технические требования к реализации.
Топикстартеру - лучше потратьте ваше время на прочтение процитированных мной книг, это будет полезней для проекта. А со временем станет ясно что делать самому в каждом случае.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения