Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 36 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

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



Партнер
 

Member
Статус: Не в сети
Регистрация: 23.12.2004
Откуда: Беларусь, Минск
Забавно, столько просмотров и даже ни намёка на более оптимальный вариант проверки произвольного условия, чем ежекадровый if. Оверы, ау :scare: !

_________________
ASUS A4M88T-M, Athlon II X3 425, 2GB NCP, video - internal ATI 4250, 200GB Samsung HDD, Win7 x64


 

Member
Статус: Не в сети
Регистрация: 21.01.2010
Откуда: ... и куда ...
Забавно то, что в теме нет ни одного вопроса. Автор, чего вы хотите то?

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


 

Advanced member
Статус: Не в сети
Регистрация: 10.04.2003
Откуда: Москва
Гы! Тут прям ща столько специалистов в 3д, что 'ни продыхнуть'.
Место ты выбрал неудачное. Пошто не пошел, хотя-бы, на gamedev.ru ?

По subj - не хочешь использовать условные события, значит делай 'живыми' сами события. Т.е. выполняй их всегда, а не по условиям (что выродится в 'оглядывание и "wait" ').
Недостаток - затраты процессорного времени гораздо больше. Достоинство - динамичнее система.
(на правах бреда)


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Хм. Странное решение обрабатывать триггеры каждый кадр. Ну лучше ли для них иметь отдельный таймер?
Я не знаю как у вас это реализовано. У меня лично (хотя это препреальфа вариант) есть "список" неактивных триггеров. Они через каждый промежуток времени проверяются. Как только триггер стартовал, он из этого "списка" переходит в список активных триггеров
К тому же я не думаю, что у вас именно это большой % ресурсов съедает (хотя вам виднее, тем более вы легко можете это проверить).
И вообще C# - странный выбор для таких задач.
Действительно на Gamedev больше вероятность что просветят


Последний раз редактировалось Industrialice 06.02.2012 23:52, всего редактировалось 1 раз.

 

Member
Статус: Не в сети
Регистрация: 05.06.2005
Фото: 2
AzaZeo, вам там кадры случаем не нужны? :old_wink:

_________________
https://steamcommunity.com/id/yuxxl


 

Junior
Статус: Не в сети
Регистрация: 10.11.2011
Откуда: SPB, RU
кстати, да, а почему бы не проверять триггеры с прореживанием по кадрам или даже по времени с учетом приоритета (например, одни - каждый кадр, другие - раз в 50-100 мс, третьи - раз в 200 мс)?


 

Member
Статус: Не в сети
Регистрация: 12.05.2008
AzaZeo писал(а):
Попал в геймдев, хотя думал быть веб-прогером.

Молодец. Эта специальность гораздо интересней, престижней и более высокооплачиваемая.

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 а потом просто ждали когда появятся более быстрые компьютеры...

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

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 там где можно обойтись байтом. Но это творчество, а в разработке же в команде и за деньги, важны совсем другие критерии (понятный коллегам код в едином стиле по всему продукту) пиар продукта, и много чего ещё, но не быстродействие. Оно совсем никому не нужно в коммерческой разработке... И только вредит.

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

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 писал(а):
Зато на консолях

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

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Vladson писал(а):
Правильной реализации не значит оптимизации. У них был план они его выполняли. Они встретились с трудностью и её преодолели. Ни какой оптимизации в этом нет.

Почему нету оптимизации? Если одно из условий - скорость, это уже подразумевает что требуется оптимизация. А условия такого могло и не быть - как у создателей Internet Explorer "Ну, если ничего не трогать, вроде даже работает. Вроде даже быстрее, чем если бы всё зависло"

Добавлено спустя 4 минуты 26 секунд:
Vladson писал(а):
Но и тут прогресс не стоит на месте, каждый раз выходят всё новые и более быстрые консоли, а программисты умудряются писать всё более медленный код.

Ну это и неудивительно, если посмотреть сколько всяких технологий в современных игр. Их же все невозможно глубоко знать - сликшом всего много. Те же шейдеры, это такое ватафак мазафака - по сути отдельный язык программирования на основе С (если речь о HLSL, без него это вообще по сути ассемблер), а компилятора нормального для этого дела не существует. Это объективная причина почему код становится менее эффективным. Необъективная - вот такой быдло-подход, как в цитате выше


 

member+
Статус: Не в сети
Регистрация: 16.01.2004
Откуда: Estonia,Tallinn
Industrialice писал(а):
Если одно из условий - скорость, это уже подразумевает что требуется оптимизация

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

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

_________________
X99-TF/E5-2678v3+Evo212/2x16Gb-DDR4-Gloway-TYPE-a@2133-12-13-13-26/GTX1070TI/KINGSTON-SNV2S1000G


 

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
Обычно от огня бегут, а огнеборцы в него лезут... :-)


 

Member
Статус: Не в сети
Регистрация: 12.05.2008
Industrialice писал(а):
Но призыв отказаться от оптимизиции слышу впервые.

Для продвинутых есть третье правило оптимизации. "Не оптимизируй. Пока...". Но оно не для этой темы. А первые два лучше распечатать и принимать как аксиому.

А вот эти строки - как закон:
А. Александреску, Стандарты программирования на C++. 101 правило и рекомендация писал(а):
Пока необходимость оптимизации не доказана— вашим приоритетом №1 должно быть написание кода для человека. (Если кто-то потребует от вас оптимизации кода — потребуйте доказательств необходимости этого.)


Также не забывать о таком правиле - "Не пессимизируйте преждевременно".

Industrialice писал(а):
P.S. Вот вам обратный словам мелко$офтовского быдло-кодера пример:...


Это не обратный пример.
Во-первых:
С. Макконнелл, Совершенный код писал(а):
Оптимизацией кода (code tuning)... называют изменение корректного кода, направленное на повышение его эффективности. "Оптимизация" подразумевает внесение небольших изменений, затрагивающих один класс, один метод, а чаще всего - несколько строк кода. Крупномасштабные изменения проекта или другие высокоуровневые способы повышения производительности оптимизацией не считаются.

И в главных - там нарушались технические требования к реализации.

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


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 36 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan