Ага, вот эти ребята!

Imagination Technologies - одни из тех немногих, доказавших, что в этом мире точно можно существовать сразу в двух сущностях: в тени и в прибыли. Если уж кто и знает, как оптимизировать рендеринг 3D-сцены, так Kristof Beets всегда знает больше. В "былые годы" мужчина был лицом PowerVR (подразделение Imagination Technologies, занимающееся разработкой 3D-графических чипов) и вещал нам о том, как он совместно с ещё парой человеков придумали новый способ рендеринга. В рекламных брошюрах, которыми пестрил каждый обзор видеоплат на базе их чипов, всегда можно было найти очень грубое объяснение традиционного метода рендеринга и его блестящую эволюцию - тайловый рендеринг, который так прогремел в 2001 году, что... вы не слышали? А было громко!

3D-Пайплайн как он был

Сегодня на операционном столе у нас... кто бы вы думали?



О да, PowerVR Series 3! Его-то мы и вскроем как следует, но сначала немного истории. На момент выхода на рынок ему пришлось соревноваться с такими гигантами, как ATI R100 и NVIDIA Жираф 2. То были серьёзные решения, но PowerVR и не собирались участвовать в гонке за мегагерцами. По заявлению PowerVR, те двое рисуют 3D-графику устоявшимся бесперспективным традиционным методом или же это можно было называть immediate-mode rendering. Чтобы понять, как это, нам придётся потревожить такое понятие как Графический конвеер (далее - 3D-пайплайн).
3D-пайплайн?

Классический 3D-пайплайн глазами PowerVR
Ну так вот, вернёмся к нашей скотине immediate-mode rendering (далее - IMR). На протяжении всех своих лет существования на рынке pc-видеоплат PowerVR давали нам такую вырезку из классического 3D-пайплайна, который применяется в IMR-видеокартах:



Если верить схеме, то классический 3D-пайплайн представляет из себя ровно следующее:
Приложение генерирует кадр с полигонами в оперативной памяти и отдаёт его на съедение видеоплате. Каждый полигон в gpu сначала растеризуется и текстурируется, а только потом идёт проверка на перекрытие его другим полигоном в сцене. Т.е., по сути получается, что мы можем сначала подготовить в памяти сложное дерево, следом подготовить такого же сложного человека, и только потом сообразить, что человек практически полностью закроет собой всё это дерево. Да, у IMR получается как-то неэффективно. Получается overdraw.

Что предлагает PowerVR
А PowerVR уже который год предлагают нам: "Think before you start to render!".
Казалось бы, ведь это так просто! Нам всего лишь необходимо поменять местами первые две стадии на рисуночке.



Но за всем этим кроется одна большая проблема: в то время весь 3D-пайплайн был аппаратно зашит в чипы (от геометрии до вывода во фреймбуфер). Посему PowerVR в своих чипах круто изменили 3D-пайплайн, заодно придумав собственный метод рендеринга: Tile Based Deferred Rendering!! Ключевое слово Deferred, потому что были, например, видеокарты Intel GMA, которые использовали Zone Rendering, который по сути тоже Tile-Based.

https://en.wikipedia.org/wiki/PowerVR
...
Intel uses a similar concept in their integrated graphics solutions. However, their method, coined zone rendering, does not perform full hidden surface removal (HSR) and deferred texturing, therefore wasting fillrate and texture bandwidth on pixels that are not visible in the final image.
...
А на самом деле...

...конечно, всё было не совсем так. А именно:
  1. Поначалу (1995 - 2000 гг.) у карт с IMR всё складывалось неплохо и карты с TBDR не имели особого преимущества, оставаясь в тени. Но и в 2001 году карты PowerVR, на самом деле, особо не выехали. Потому что вендорами IMR-чипов были своевременно проведены независимые расследования и, в результате, без интриг и скандалов, до вендоров быстро дошло, что типичный 3D-мир становится всё комплекснее и многослойнее. Всем стало ясно, что теперь боттлнеком является видеопамять с её пропускной способностью, и, что нужно оптимизировать работу с этой вот памятью и обязательно с z-buffer'ом.
    Так практически одновременно в 2001 году увидели свет такие разные технологии, как HyperZ у ATI и Lightspeed Memory Architecture у NVIDIA. И, если первая на заре своего появления отсеивала overdraw уже только непосредственно перед растеризацией, то вот вторая делала это ещё на уровне геометрии!

  2. Помимо того, конечно, PowerVR немного лукавили. На приводимой ими схеме классического 3D-пайплайна IMR (см. Классический 3D-пайплайн глазами PowerVR) явно не хватало шейдеров, которые уже были в зачаточной стадии даже на жирафе 2 (это называлось NSR). Ну а у каждого уважающего себя чипа 2001 года (ATI R100, NVIDIA Жираф 3) уже были полноценные пиксельные или даже вершинные шейдеры, открывающие "полигоны возможностей" управления 3D-пайплайном.
    Однако же заметьте, что TBDR всё же был придуман задолго до шейдеров!
По указанным выше причинам PowerVR снова оказались в тени и дальнейшая судьба их сложилась в другом сегменте (привет владельцам IPhone). Но на что же на самом деле был способен чип PowerVR Series 3, карты на котором так и не доехали до нас?

Краем глаза

Когда речь заходит о таких раритетах, как карты на PowerVR, приходится довольствоваться тем, что урвал. То есть, здесь не будет таких раскрученных ребят, как Videologic Vivid! или Hercules 3D Prophet, но будет, например, вот такая штуковина:



На фото AGP-видеокарта SUMA Platinum K2 на том самом последнем вышедшем чипе от PowerVR в сегменте PC - PowerVR Series 3. Все подобные карты были сделаны по одному референсному дизайну, но вот на этом корейце нет надписи PowerVR, от чего несведующие могли пройти мимо. Кулер тут от Асус, потому что на всех этих платах были очень шумные низкопрофильные кулеры, которые вскоре приказывали долго жить. Вдобавок, теперь и все детали у карты на месте :) Карте я прошил самый последний биос.





Кажется, будто бы карта недалеко ушла (если вообще ушла) от вуду 5500: всё те же 350Мтекселов, 64метра SDR-памяти, 2 пиксельных конвеера, DX6 (и, как следствие, полное отсутствие шейдеров), всё тот же AGP2x с сайдбандом (и без плюшек)... но это только кажется.

Ближе к сердцу



Сам чип PowerVR Series 3 - 2000 года рождения. Это было уже третье (ревизии опустим) явление народу, которое впервые чем-то увенчалось. Видимо, чип был настолько успешен, что сумел ещё раз наследить в истории аж в 2004 году: некая компания Pixel Perfect сделала на нём карту (причём опять-таки по референсному дизайну и опять-таки с кулером, которого уже нет и, да, эту тоже пришлось чинить). Так вот её вскрытие показало, что чип-то вовсе не PowerVR Series 3.



Значит, присядьте, тут необходимо поведать о теперь уже действительно легендарном бермудском треугольнике: Imagination Technologies - PowerVR - STMicroelectronics. Этот треугольник точно был, но из наших его никто не встречал, а теперь его точно нет. Легенда же гласит, что в те годы PowerVR был вовсе не подразделением Imagination Technologies, а просто брендом (им же и принадлежавшим) для кучи технологий. Ну а небезызвестная STMicroelectronics купила у Imagination Technologies лицензию и клепала на своих мощностях чипы с этими вот новшествами. Потому что не было у Imagination Technologies своих мощностей. Трудно даже утверждать, кто из этих двух на самом деле придумал название KYRO (зато можно утверждать, что это производное от Cairo (Каир)). Ну а конкретно этот вот чип STG4500-X (в простонародии KYRO II) и есть PowerVR Series 3.
Ну, то есть, как вы правильно поняли, была ещё как минимум одна инкарнация PowerVR Series 3 - STG4000-X (или KYRO I), который по-сути был абсолютно идентичен KYRO II, только работал на пониженной частоте...

...Но внутренности KYRO II уже на столе и стынут:
  • У чипа всего два пиксельных конвеера, но работают они всегда, поэтому неважно, включен ли мультитекстуринг в игре или нет. Таким образом Мпиксели здесь равны Мтекселям (да, как в вуду ;) ).

  • Но куда интереснее то, как эти конвееры работают. И вот тут мы подошли к тому, с чего начали - к интересному, к тайловой архитектуре.
    Точного объяснения, как же на самом деле работает Tile Based Deferred Rendering (далее - TBDR), я не встречал нигде. Встречаются несколько различных вариантов, из которых можно получить такое общее представление:

    ...Снижение FPS чаще всего становится результатом переполнения шины видеопамяти. Но каким же образом мы можем избежать переполнения? Основная идея TBDR - избавить от ненужной работы и без того заезженный 3D-пайплайн, что серьёзно снизит требования к пропускной способности видеопамяти. Каким образом? Чем тупо рисовать каждый полигон по очереди (как поступают IMR-карты), KYRO, следуя концепции TBDR, сначала составляет список всех полигонов в кадре (display lists). Затем KYRO проверяет, какой полигон какой закрывает и, наконец, затеняет, текстурирует и рисует только действительно видимые части полигонов. Логично и просто.

    Для любителей погрузиться...

  • Вдобавок, PowerVR анонсируют возможность наложить сразу до 8 текстур на пиксель, объясняя это тем, что всё равно ведь всё невидимое отсеивается. Для 2001 года, конечно, нонсенс, так как не было ни единой игры, это дело умеющей, но зато в тестах можно было наконец увидеть честный EMBM. Действительно, какая разница, сколько текстур наложено, если видно будет только последний слой? Лукавят, конечно, но, возможно, что, благодаря TBDR, чип будет успевать всё просчитывать за приемлемое время?

  • В случае с анизотропной фильтрацией и OGSS super-sampling anti-aliasing 4x, которые чип также умеет, PowerVR выдвигает тот же аргумент. Красиво звучит, конечно, но ведь вычисления-то никуда не денешь. Если бы всё было так здорово, можно было бы сразу и 16xAF делать за те же деньги, нет?

  • Как, вам и этого мало? В таком случае, покопайтесь во внутренностях ещё немного и вы с интересом обнаружите, что KYRO II на самом деле поддерживает AGP4x и, при большом желании, вы можете поступить как те фанатичные личности, кому нужны обязательно шашечки, чтобы ехать. Кстати существует легенда, что и с вуду5 делали примерно точно так же.

Но вот вы ищите, ищите и... не находите. Всё так, увы и ах, Hardware Transform and Lighting (далее - HW T&L) здесь тоже нет. И вот почему (вырезка FAQ из интернет-архива powervr.com):

KYRO and T&L

“No hardware T&L? You must be joking!”

Indeed KYRO and KYRO II hardware do not support hardware T&L. While this choice might surprise there are good reasons behind this decision.

The truth is that most games available at the moment are fill-rate limited. As frame rate and resolution increase the graphic hardware reaches a point where it cannot transfer data as fast as the CPU would like to. This is the famous memory bandwidth problem. While the graphic hardware struggles, the CPU is idle waiting for the next frame to finish rendering. Why waste this precious CPU time when it could be used to handle transformations? As an example, consider a game at 1280x1024x32 resolution running at 60 frames per second. We’ll assume a depth complexity of 3 for this game, although this figure could easily be higher as games get more complicated. The fill-rate requirement for this game is 1280x1024x4x60x3 = 943 Mpixels/sec. This figure is at least twice the real fill-rate of other hardware, which means the game is fill-rated limited. Quake 3 Arena is fill-rate limited in this situation.

KYRO II was designed to be a mainstream part and including a T&L unit would not only cost more but also it would not improve performance in most cases (depending on CPUs and games). There will be a time when hardware T&L will significantly improve performance but it is still not now. If a game is already fill-rate limited, adding hardware T&L to it will not make it run faster!
Ну, то есть, если нвидия решила ускорить геометрическую часть 3D-пайплайна, то PowerVR ускорили остальное.

Реализация

Смею вас обрадовать: KYRO обучен Windows XP! (2001 год же, как никак, пора бы уже и Longhorn'у быть). Так что я в страхе бежал из лампового Миллениума! За что получил полноценную возможность OSD-мониторинга в играх через свеженький MSI Afterburner, а также человеческий интерфейс и стабильность ОС. Правда, из синего экрана больше не выйти, это, конечно, минус...

Тем не менее, встроенных в винду дров для KYRO не оказалось. Но зато у самих PowerVR было целых двое: последние и последние-бета (прям как у 3dfx, да...). Вот так выглядят последние:

  • На главной вкладке есть разгон :)



  • OpenGL с кренделями



    Кто не понел, F1

  • Direct3D с плюшками



    F1
По обилию плюшек и кренделей становится очевидно, что у TBDR не всё гладко с играми. Но разработчики дров уже позаботились о самых популярных. Да, именно так, в драйверах вы обязательно найдёте файл, предупреждающий виндоус, что приложению porsche.exe понадобится плюшка (и крендель!), а не то:



В последних-бета дровах таких приложений (и игр) было свыше 100...
...Но, к сожалению, в чудесном Arabian Nights (2001, Windows) правее сабли, кажется, должно быть меню:



Тут уже KYRO плюшками не задобришь; и ведь таких игр, возможно, было очень много? А всё почему: на заре подъёма DirectX как стандарта де-факто многие разрабы реализовывали самые сумасшедшие техники 3D-рендеринга самостоятельно. Ну и что, ведь это работало? Да, на IMR-картах, 3D-пайплайн которых не претерпевал изменения с самого своего рождения до 2000 года. А вот KYRO с его TBDR всё-таки лучше использовать в играх хотя бы эпохи DirectX6.

Помимо этого что ли лыжи не едут... Учитывая, что обе мои карты после ремонта, одна с прошитым биосом, а вторая с кастомным биосом 2004 года, вероятнее всё же второе. И тем не менее на обоих картах одинаковые проблемы: выставляешь одно разрешение, получаешь другое (причём какое именно - зависит от версии дров). Так, 1280x1024 выставить в 3D мне не удалось ни при каких условиях ни на одной из карт.

Прикладной уровень



ВНИМАНИЕ, Конфиг:

MB: Gigabyte 6vtxe (Apollo Pro133T chipset)
CPU: Pentium 3-S 1.4Ghz/512Kb/133FSB
RAM: 3x256Mb PC133
HDD: healthy UDMA-5 WD с приличным кэшем 2Мб и 5400RPM
WinXP SP3
Video: PowerVR KYRO II AGP

ВАЖНО:
  • Смотреть будем на Deus Ex (2000, Windows), справедливости ради (ну чтобы можно было сравнить с предыдущими обозрёнными). Однако знайте, что, ввиду особенностей архитектуры чипа (TBDR), результаты, например, в Quake 3 будут совсем иными в плане производительности. Это в большей степени связано с особенностью игр и их движков: где-то огромный overdraw (2-3) и мультитекстуринг x4, а где-то просто огромная куча полигонов, но почти нет overdraw.

  • Настройки графики в игре: максимум красок, всякие там трилинейки и волюмтрик лайтнинги!

  • Настройки дров… чтож, будем экспериментировать!

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


Итак, поехали уже быстрей по технологиям...

API
  • Direct3D. Как следует из спецификации, карта поддерживает DirectX7. На самом же деле, карта поддерживает только DirectX6, но, чтобы как-то оправдаться, разработчики дров запилили эмуляцию HW T&L (как в 3dfx, да...). И вот эта самая эмуляция появится только в последних-бета драйверах.



    Работает она точно также, как и у вуду5, поэтому подробно останавливаться на этом моменте я, пожалуй, не стану. Иногда помогает:



  • OpenGL. Тут всё предельно просто и надёжно: ICD. По сравнению с версиями для предыдущих чипов это - гигантский прорыв! Правда, вы можете случайно увидеть такое:



    Но в последних-бета дровах это поправили.

  • PowerSGL Direct. Если кто помнит такой,- был актуален для ранних чипов PowerVR, потому что:

    [QUOTE=http://vintage3d.org/pcx1.php]
    .....
    Infinite planes effects were not part of Open APIs and full capabilities of PowerVR can be exploited only through proprietary SGL. The API also supported data instancing to save memory by avoiding duplicates of materials, transformations and objects.
    .....
    [/QUOTE]

    С выходом KYRO явно потерял актуальность, вероятнее всего потому, что пресловутые Infinite planes не прижились, а реализация data instancing к этому времени появилась в OGL и/или в D3D.

    И всё же в дровах присутствует файл SGL2.dll (и с каждой версий допиливается!). Судя по тегам в файле, это уже PowerSGL Direct2 (кто думает, что осилит в чём разница: SDK для первого). Но, поскольку все известные мне игры под PowerSGL исконно ищут файл SGL.dll, логично было бы налить и отойти переименовать и посмотреть, что будет. На примере Unreal (версия с поддержкой SGL):



    Я даже честно пытался подсунуть играм SGL.dll (и сопутствующее файло) из дров для PowerVR Series 2 - приблизительно тот же результат. Выходит, PowerSGL Direct всё-таки выкинули, но зачем тогда допиливать PowerSGL Direct2? Как бы там ни было, хотите поиграть в Tomb Raider (1996, DOS) с сиськами - покупайте PCX2...

Цветастость
Помимо полноценной поддержки 32-битного цвета и даже возможности работать в 24-битном...



...у KYRO есть одна классная архитектурная особенность: весь 3D-пайплайн всё время работает в 32-битном цвете. ВСЕГДА. Это означает две вещи:
  1. При переходе на 16-битный цвет быстрее не станет.
  2. Качество картинки в 16-битном цвете даже выше, чем у хвалёных 3dfx с их 22-битами. А всё потому, что по канонам TBDR преобразование кадра из 32-битного в 16-битный делается только один раз - на выходе. Тогда как у IMR в 16-битном режиме при каждом новом наложении, например, текстуры на текстуру происходит конвертация текстуры из 32 бит в 16 бит.
Тем не менее, я предлагаю вести здоровый образ жизни жить в красочном мире труколора, чем ловить глюки и искажения. Ведь теперь это бесплатно!





Разница в скорости (внизу белым текстом FPS), заметьте отсутствует, что редкость.

Самое интересное. Производительность
После всей этой лекции у простого человека возникает простой вопрос: "неужели всё это могло быть быстрее Жирафов с Радеонами?" На самом деле, если не вдаваться в подробности, всё зависило от случая :) Процитирую себя:
Ввиду особенностей архитектуры чипа (TBDR), результаты, например, в Quake 3 будут совсем иными в плане производительности. Это в большей степени связано с особенностью игр и их движков: где-то огромный overdraw (2-3) и мультитекстурингx4, а где-то просто огромная куча полигонов, но почти нет overdraw.

Full-Scene Anti-aliasing (FSAA)
Убирает лесенки на наклонных линиях. В этом чипе реализовано три типа FSAA методом OGSS:



Но и тут всё непросто. Как я ответственно заявил выше, в моём случае 1280x1024px выставить на KYRO II не представляется возможным (по факту получается сильно больше). Сначала я решил, что, в таком случае, можно и довольствоваться разрешением 1280x960, благо 64 пикселя по высоте - не самая большая потеря.
Однако и тут меня ожидал сюрприз. Оказывается, в больших разрешениях по горизонтали (когда горизонтальное больше 1024px) опция FSAA 2x1 и 2x2 (это когда картинка увеличивается по горизонтали вдвое) не будет работать. Потому что чип не умеет работать с горизонтальными разрешениями больше 2048px.

Так что для начала посмотрим как вообще работает FSAA в разрешении 1024x768. На картинке смотреть на алиасинг (лесенку) у вертикальных ножек стульев на столе и на алиасинг горизонтальных линий у ламп (или у стола):






Что интересно: горизонтальный FSAA увеличивает разрешение изображения по горизонтали, а, значит, уберёт вертикальные лесенки. И наоборот.

Что можно заметить, так это то, что (что?) вопреки многим слухам FSAA нифига не бесплатная и с увеличением степени заметно снижается FPS. То есть, тут всё как всегда: Хотите? Платите! Это во-первых.

А во-вторых, на самом деле, качество этой самой FSAA, скажу я вам... как через грязное стекло. Это на шотах ещё ничего, а вы натяните на весь экран, сразу поймёте (сегодня у каждого броузера есть каретка). Вдобавок, как вы поняли, вы можете сглаживать или одну какую-то сторону по 2 сэмплам или обе по 2 сэмплам; в обе стороны по 4 сэмплам (как у 3dfx) гладить нельзя. Нет, всё-таки правду глаголят, OGSS далеко до RGSS, что применялась в вуду5.

Anisotropic Filtering (AF)
Это развитие трилинейки. Степень не выбирается, она просто есть :) Чтобы понять, что делает, смотрим на повторяющийся узор на левой стене и на то, как он хорошо виден с увеличением расстояния от камеры игрока (да, пример темноватый, придётся смотреть без освещения):




Кто хочет понять, как она (AF) это делает, читает здесь.


FSAA + AF
Ну и, конечно, нам с вами нужно понять, как же карта будет успевать за всем этим. А вот:

1024x768. Тут ещё можно делать полноценную FSAA, так сказать. Попробуем.








1280x960. Здесь уже мы можем делать FSAA только по вертикали.







Итого получается, что KYRO II не переносит AF + FSAA - смотреть слайдшоу никому не интересно. Ну а раз за качество FSAA можно поставить оценку "плохо", то предлагается на радостях повысить разрешение и забыть о ней навсегда. В высоком разрешении можно включить AF, но будет медленно. Так что, дамы и господа, в Deus Ex (и подобных играх) KYRO II как бы так ненавязчиво предлагал вам довольствоваться трилинейкой и ждать выхода следующего чипа с блоком HW T&L. Но его никто не дождался. Так закончился TBDR на PC.

Ну так вот, знаете...

Если отбросить саму архитектуру KYRO - для рядового школьника это была самая обыкновенная видеокарта, у которой не было каких-то там непонятных аппроксимаций, 22-битного цвета, запрещённых api и прочей лабуды, ради которой сегодня повод собрать старый компьютер. В KYRO всё было:
  1. Предельно просто: честный 32-битный цвет, полная поддержка DX6, эмуляция DX7.
  2. Предельно быстро: разгонять было нечего
  3. И предельно дёшево :)

За те деньги, что тогда просили за карты на KYRO II это была конфетка. Да, с кисло-сладкой начинкой, но всё же это было лучше, чем сегодняшний огромный ассортимент, представленный сейчас двумя известными фирмами.
Будет не лишним отметить, что судьба PowerVR в сегменте PC во многом похожа на судьбу 3dfx (можно даже вспомнить предсмертную покупку Gigapixel). Такие же сногсшибательные новаторства, те же проблемы и, как следствие, те же задержки выхода. В итоге уход с рынка и смерть очередного закрытого api (PowerSGL).

В общем и целом в итоге всё сводится к тому, что точно можно сказать две вещи:
  1. Всё новое - плохо закопанное старое.
    Казалось бы, что касается ранних подходов в вопросе оптимизаций видеочипов путём разработки собственного закрытого низкоуровневого api и заточке игр под эти api (если не поняли, перечитайте ещё разок) - сегодня это всё уже пыльная история (которую, кстати, поди раскопай!). А вот нифига! Вы посмотрите, какой там уже внушительный список игр!

  2. Будущее не предопределено!
    Во многом благодаря PowerVR в обозримом будущем мы смогли наблюдать интереснейшие вещи. Так, уже в 2007 году в свет вышел любимый Сталкер: Тень Чернобыля, движок которого использует технику под названием Deferred Shading. Нетрудно догадаться, что в основе лежат те же принципы экономии пропускной способности видеопамяти, что и у PowerVR. Но только программным путём с помощью шейдеров для IMR.

Благодарности
  • Кланяюсь двум инженерам из одной Питерской конторы, которые помогли деталями и даже их припаяли за меня! Без них обзора кайро просто не было бы!

  • Администрации old-games.ru за возможность быстро и бесплатно скачать 20 игр скопом только ради того, чтобы заценить структуру файлов и однажды запустить.

  • Открывателям горизонтов и срывателям покровов — комьюнити VOGONS. За кучу уникальных исследований и наработок!

З.Ы.
Данная статья - результат двухмесячных трудов с трёхчасовыми ежедневными подходами с обязательными перекурами каждые 30 минут. Пережила огромное количество правок и даже одну полную перетасовку. Очень хотелось сделать её как можно доступнее, так что, если:
  • вы нашли неточность - велкам в комменты!
  • вы усвоили хотя бы две трети контента,- эффект достигнут!

Кстати PCI-версию KYRO II я тоже прогнал. Надо сказать, она медленнее примерно на 30%, вот вам и реальное преимущество AGP.

...TBC...



Обсуждение видеочипов PowerVR у нас на форуме.
Сравнение графики в играх на разных видеочипах.

Использованная литература


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

Автор: Goblinit
Дата: 31.08.2015

Обсудить статью на форуме

Перейти к списку статей