Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Собирайте грибы, готовьте и общайтесь. Экономический симулятор лесной фермы

Грибники и Кланы

Симуляторы, Стратегии, Фермы

Играть

Топ прошлой недели

  • AirinSolo AirinSolo 10 постов
  • Animalrescueed Animalrescueed 46 постов
  • mmaassyyaa21 mmaassyyaa21 3 поста
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
437
MASTER095
MASTER095

Истории от Master095. Пост #388. Как я бетонный завод спасал. И почему резервирование не всегда спасает и привет DELL((⁠⁠

1 год назад

Иногда бывает недоброе утро) а иногда не добрый вечер, это когда тебе в 22-00 пишет клиент с фразой всё пропало, срочно помоги, мы бетонный завод перевезли на новое место, а управляющий производством компьютер не запускается:

Люблю я такие пейзажи по утру, глушь за мкадье, капает дождик, справа бетонный завод, а слева??

Люблю я такие пейзажи по утру, глушь за мкадье, капает дождик, справа бетонный завод, а слева??

А слева за колючкой Панцирь-С охраняет наше небо)))

А слева за колючкой Панцирь-С охраняет наше небо)))

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

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

А второй комп просто пищит при включении и черный экран:

Компы не стандартные, это DELL ещё на Core2Duo, с замудреным bios, причем до меня ребята местные пытались разобраться меняли батарейки на плате на одном и пытались диски жесткие с одного на второй комп вставлять, но ничего не изменилось...

НАЧИНАЕМ С КОМПА КОТОРЫЙ ХОТЯ БЫ ВКЛЮЧАЕТСЯ

По сообщению на экране я примерно понимаю, что комп пытается запуститься с RAID контролера, и в ответ тишина значит проблемы с RAID массивом или с одним из жестких дисков... Лезем в BIOS и понимаем что диск определяется всего один, вскрываем комп и на самом деле жесткий диск один по факту WD 500GB. Ок возвращаемся в BIOS отключаем RAID и включаем режим Legacy(для одного диска) комп все равно висит на попытке загрузки, при этом загрузочную флешку видит пытается запустить с неё Win PE, но в итоге тоже зависает... Диагноз уже понятен, полудохлый жесткий диск, это когда HDD определяется bios, но windows при загрузке системы и попытки его опросить вешает всё наглухо...

НАДЕЖДА НА ВТОРОЙ РЕЗЕРВНЫЙ КОМП

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

ПО ИТОГАМ ЧТО БЫЛО НЕ ТАК.

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

Но почему же резервирование не помогло:

В основном компе с одной стороны HDD умер от старости, реально 12 лет в режиме 24/7 + переезд, плюс аварийное отключение при тестовом подключении дизель генератора его добило... А вот почему не удалось просто переставить жесткий диск с рабочего компа, тут отгадка проста, заодно с перестановкой жесткого диска сотрудники завода решили заодно заменить батарейку CMOS, что привело к сбросу настроек BIOS на по умолчанию, а по умолчанию жесткие диски и SATA работают в режиме RAID... т.е. если бы они просто переставили жесткий диск из другого компа не меняя батарейку всё бы заработало.

ПОЧЕМУ ПИЩАЛ И НЕ ЗАПУСКАЛСЯ ВТОРОЙ КОМП

Тут тоже история типовая для DELL, в нем за время нахождения в отключенном состоянии, разрядилась та самая батарейка... И если обычный комп включится и будет ругаться на проблемы с батареей CMOS, то DELL будет тупо пищать или мигать светодиодом, благо это у меня не первая такая история и опыт уже был....

В итоге сгонял в DNS купил SSD в основной комп, слил на него образ системы с рабочего HDD, а в резервном заменил батарейку и вернул настройки BIOS в состояние чтобы он тоже загружался, по итоге оба компа были сделаны часа за 3-4 включая разъезды...

И конечно вишенка на торте это клиент который заплатил вдвое больше чем я просил:

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

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

Показать полностью 5
[моё] Клиенты Истории из жизни Ремонт компьютеров Dell Завод Длиннопост
160
40
zer0hexen
zer0hexen
IT-юмор

Фраза - сервак упал, заиграла новыми красками⁠⁠

1 год назад
Фраза - сервак упал, заиграла новыми красками

монтаж стойки не удался.

Показать полностью 1
Юмор IT юмор Сервер Серверная Dell
27
149
inertico.service
inertico.service
Сообщество Ремонтёров

Ремонт ноутбука Dell Precision 7530. Думал, будет хардкор, но оказалось средненько⁠⁠

1 год назад

Привет Пикабу!
Вот такой агрегат (с не легкой судьбой) попал к нам в ремонт еще в декабре. Не сказать, что часто встречается. Штучка для профи. Но в игрушки особо не поиграешь, т.к. тут графика nVidia Quadro.

Видосик, по традиции, в конце поста. Там менее информативно, но более наглядно.

Предыстория ноутбука. Довольно длинная и имеет косвенное отношение к данному ремонту (можно пропустить).

Пришел, значит, данный ноутбук с жалобой: не включается.

Посмотрели. Реагирует на деформацию материнки в самом узком месте.

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

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

В общем, у нее отваливаются каналы оперативной памяти. К слову, тут 4 слота, по 2 на каждый канал. И вот, то один отваливается, то второй.
Пропаяли слоты - без результата.
Думали на отвал проца. Отреболлили - без результата.
Пересадили проц с первой платы - без результата.

Ну что жжж... Никак снова трещина. Фантастика. Ни разу за всю практику не встречалось такого совпадения. Но напомню, плата устанавливается и извлекается не так просто... Так что, возможно это и есть причина всех бед. К тому же, я уже подробно писал про процент не рабочих или не совсем рабочих материнских плат от различных китайцев. По нашей статистике: ~70% с косяками. А это статистика из пары-тройки сотен плат. Поэтому, берем платы только у местных поставщиков, с гарантией и беспроблемным возвратом/обменом.

Сообщили клиенту. Он решил заказать еще одну мать. Ок. Ждем...

Теперь к ремонту.

Получил клиент очередную плату и теперь она у нас.
Установили. Помазали то, что должно быть помазано. Тестируем. Все хорошо.
Вот только видеокарта (она тут полноценная - отдельная плата) отсутствует, в принципе. Ее просто нет. Ни в Винде, ни в Линуксе.

Квадрик отсутствует полностью =(

Квадрик отсутствует полностью =(

А видеокарту мы уже тестировали ранее в разных тестах на аналогичном ноутбуке. Она в полном порядке - без сомнений.

Что, опять мамка косячная? Ага, именно так! Но тут уже была надежда даже межслой починить. К чему я и был настроен.

Но все оказалось банальнее. Об этом и пост. Если бы погадал заранее, то и не снимал бы видос и не писал бы это все. Просто карты гадальные поломались, дали трещину. Но чтоб материалу не пропадать - пусть будет видос (в конце) и пост.

Питание видеокарты идет с мамки. Подключается отдельным шлейфом. На карту должно приходить 19 В. Но у нас по нулям:

К слову, видеокарта тут не привычная. Она подключается к материнке при помощи трех шлейфов, а не вставляется в слот.

Где же питание графики? Давайте разбираться...

19 В подается на видеокарту после открытия одного мосфета. Соответственно, на него должны приходить 19 В, чтобы он открывшись, пропустил питание на видеокарту. Замеряем вход мосфета:

19 В есть. А на выходе - 0. То есть, мосфет не открывается. Почему?
Смотрим, приходит ли управляющий затвором сигнал и откуда он идет.

А он идет с еще одного транзистора, уже трехногого. И между двумя его ногами распаян резистор:

Замеряем сопротивление резистора:

А у нас тут почти по нулям. Может так и надо? Да не, замыкать ноги транзистора в ноль - это не по понятиям.
Вопрос усложняется тем, что нет схемы на эту плату. И какой номинал у этого резистора мы не знаем. С виду же они все одинаковые... Но у нас есть мамка-донор, и даже две, и даже условно рабочие по этой части. Замерим что там...

А тут у нас 100 К. Вот это похоже на то, что должно быть.
Вот и лайтовый ремонт, подумал я и снял транзюк и резюк.
Но на них все в порядке. Транзюк в бесконечности, а резюк показал 100 К.
Но вот контакты на плате все еще продолжают мне показывать КоЗу...

Так откуда же идет дереза? Взял я плату-донор и начал ее щупать полностью.

И знаете... даже через 1.5 часа был совсем не удовлетворен, а даже наоборот...
Я прошелся по всем контактам, которые хоть как-то относятся к питанию. Сначала делал это оплеткой, по классическому методу, а потом, не поверив в результат, протыкал все контакты своим красным щупом. И аналогично оплетке, ничего не выщупал.
Пора снова повышать градус, подумал я, и взял в руку фен. Затем посмотрел на мультик и снял его.
И единственное место на мамке, куда приходит (а вернее, откуда) сигнал - это контакт под мультом. Вот он, в четвертом ряду:

И эта точка не в КЗ.
Так что же это получается? Мульт сдох по одной из посредственных для него линий? Да никогда такого не было...
Можете возразить... Типа, управление такими сигналами осуществляется ШИМами и Мультом, чего бы с них не начать?
А я даже не знаю что вам ответить на это =)
Я понимаю всё такое, но не терял надежду, вот и всё )

А еще, я больше всего ненавижу реболлить...

Скорее всего, предполагаю 2 варианта:
1. Попал какой-то мусор токопроводящий и замкнул контакты. К примеру, шарик припоя. Но не мог же он до четвертого ряда докатиться. Такие непослушные шарики, обычно, первый ряд останавливает;
2. Мульт уже снимали и замкнули соседние шарики при запайке. Но я прозвонил все соседние контакты и нигде нет минуса - всё вокруг сигнальные линии. Хоть Datasheet не смотри...

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

Снимаем мульт:

И прозваниваем наш любимый контакт.

Тут под микроскопом

Тут под микроскопом

И я вижу бесконечность... Сопротивление отсутствует. Совсем.

Видно, что мульт ранее не снимали, стоит с завода. Мусора никакого нет. Я специально снимал его без флюса. Если бы что-то попало, было бы видно.

Да ладно... Просто мульт отъехал? Тогда зачем я все это снимал и пишу теперь? Я же думал, что будет КЗ в плате и даже придумал где просверлить плату и как ее обойти. Не повезло. Ну может кому интересно... =)

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

Картинки из видео. Некоторые не очень. Отдельно фото не делал - ленивый очень.

Картинки из видео. Некоторые не очень. Отдельно фото не делал - ленивый очень.

Зачищаю посадочное место на рабочей плате:

И сажаю мультик:

Возвращаю на место транзюк и резюк:

Смываем флюс.
Замеряем сопротивление - 100 К.
Включаем и замеряем напряжение - 19 В.

Запускаем...
Проверяем...
Тестируем...

Все в норме.
Ремонт окончен.

Видео, как и обещал. Снимаю на телефон, одной рукой (вторая шары катает), времени нет для полноценной съемки на 3 камеры и монтажа. Кратно больше времени занимает.
Извиняйте, пожалуйста )
Если на Пикабу не работает (это бывает в течении пары часов после публикации поста), то вот ссылка: https://youtu.be/9x7EZ7gC6R0?si=LeOzL3TyC17V8icR

На этом закругляюсь.
Если зашло, ставьте плюс класс.
Спасибо всем за внимание! Удачных ремонтов и честных мастеров!

Показать полностью 20 1
[моё] Ремонт компьютеров Ремонт ноутбуков Сервисный центр Москва Ноутбук Dell Ремонт техники Материнская плата Контроллер Поломка Компьютерная помощь Видео YouTube Длиннопост Nvidia
20
9
Jargal

Dell и корпоративный рынок⁠⁠

1 год назад
Dell и корпоративный рынок

https://pikabu.ru/story/dell_11269459?cid=303797550

Показать полностью 1
Dell Комментарии Корпоративный мир Комментарии на Пикабу Скриншот
1
4037
Pivasik
Pivasik
Молодые предприниматели

Dell⁠⁠

1 год назад

В своё время материнские платы для компьютеров Dell производила одна тайваньская компания. Однажды эта маленькая компания предложила Dell собирать компьютеры целиком. Непонятно было, какая польза от этого тайваньской компании — там ведь никто не заканчивал MBA, но для Dell это было выгодно, и они согласились. Соглашение работало, и затем тайваньская компания предложила управлять цепочкой поставок. После этого они захотели ещё и самостоятельно разрабатывать компьютеры. Для Dell это всё было очень хорошо — меньше затрат, больше доходов. Dell теперь могла делать то, что умеет — брендинг, а тайваньцы выполняли всю чёрную работу.Эта система прекрасно работала, и менеджеры тайваньской компании вновь поехали в США, но только в этот раз они наведались в офис сети магазинов BestBuy, чтобы продать им свои компьютеры, которые были так же хороши, как и Dell, но стоили намного дешевле. Да, и эта компания называлась ASUS.

Источник

Компьютер Сборка компьютера Ноутбук Dell Asus Текст Telegram (ссылка) Повтор
309
10
mLuXoR
Лига Сисадминов

Скачать с dell⁠⁠

1 год назад

Коллеги, приветствую!

и так и эдак, с разных устройств не могу скачать не битый архив с любой версией bios для dell optiplex 7020 (service tag 78knj32).

И с разных компов и из разных сетей, и с разными ОС с vpn и без него.

Прошу помочь!

(скачайте и выложите на любой обменник, только проверьте что файл запускается)

https://www.dell.com/support/home/en-sr/product-support/serv...

UPD: всё запускается и работает ТОЛЬКО при запуске на optiplex 7020 , т.е. сразу прошивка, без привычного extract or setup. На другом ПК только ошибка запуска

всем спасибо!

Показать полностью
[моё] Без рейтинга Системное администрирование Обход блокировок Bios Dell Текст
11
76
monobogdan
monobogdan
Посты о ремонте и моддинге ретрогаджетов.
TECHNO BROTHER

Первый легендарный мобильный GPU: каким был PowerVR MBX Lite? Пишем игру-демку про «жигули» с нуля, ч.1⁠⁠

1 год назад

Пожалуй, многие из вас помнят, какими были мобильные игры до и после выхода первого iPhone. В начале 2000-х годов, ещё до появления яблочного смартфона, игры для телефонов в основном были весьма интересными, но тем не менее, достаточно простенькими с точки зрения графики и реализации в целом. После запуска AppStore в 2008 году, на iPhone начали выходить самые разные красочные, невиданные раннее по уровню детализации и проработке 2D и 3D игры. Но появление таких игр — отнюдь не заслуга Apple, а относительной малоизвестной компании PowerVR (подразделение Imagination Tech), которая смогла разработать на базе видеочипа Dreamcast и внедрить один из первых действительно массовых мобильных 3D-ускорителей, имя которому — PowerVR MBX! Сейчас мы с вами привыкли, что почти любой дешевый смартфон может отрисовывать графику уровня PS3 в 1080p, а то и выше, но когда-то даже уровень PS2 был роскошью… Сегодня мы с вами: узнаем предысторию появления аппаратно-ускоренной 3D-графики на телефонах, рассмотрим такую фирменную фишку PowerVR, как тайловый рендеринг, а в практической части статьи нам поможет легендарный КПК Dell Axim X51v с MBX на борту, под который мы напишем 3D-игру «про жигули» с нуля! Интересно? Тогда добро пожаловать под кат!

❯ Мобильная 3D-графика. Начало


Пожалуй, 3D-графика на мобильных устройствах начала развиваться ещё с самого начала 2000-х годов. К тому моменту, как мобильные телефоны научились запускать сторонние Java-приложения, практически сразу же появился прибыльный рынок мобильных игр. Ещё до появления поддержки jar-приложений, люди ставили рекорды в «Змейке» на телефонах Nokia, таскали ящики в «Строителе» на Siemens и играли в другие предустановленные игры на девайсах других брендов, поэтому было очевидно, что игры на мобильных телефонах рано или поздно смогут занять немалую часть сегмента портативных игровых устройств.

Именно появление J2ME дало тот самый толчок для развития мобильного гейминга. Производители телефонов активно развивали и дорабатывали мобильную платформу, добавляя в неё различные API-расширения — например, активацию приложений через СМС и доступ в WAP-интернет. Сама платформа J2ME была достаточно простой для изучения и имела низкий порог вхождения не только для людей, имевших какой-то опыт программирования, но даже для совсем новичков, которые никогда не писали код и тем более игр! Благодаря этому, появились сотни игр, многие из которых до сих пор помнят и любят: это и легендарный «мячик» Bounce, и «зайчик с морковками» Bobby Carrot, и весьма крутой Gish, а также множество различных платформеров по известным фильмам и «большим» играм!

В 2003 году появился Nokia N-Gage — первый массовый телефон, ориентированный именно на мобильный гейминг, который поддерживал не только Java-игры, но и собственные Symbian-игры с достаточно крутой 3D-графикой! Примерно в том же 2003 году, для платформы Java вышло сразу два API-расширения, которые добавляли поддержку симпатичной 3D-графики даже в самые простенькие и бюджетные телефоны: Mobile 3D Graphics (M3G, была почти везде) и Mascot Capsule (эта платформа была только на Sony Ericsson и Motorola). Именно благодаря этим API, мы с вами увидели такие легендарные игры, как V-Rally, Galaxy on Fire, Deep3D и многие другие! Но тем не менее, эти API были относительно медленными из-за программной растеризации на процессоре без отдельного 3D-ускорителя и весьма ограниченными в функционале. Ближайший пример по функционалу — уровень софтрендера первой кваки на первом Pentium! Кстати, про 3D на мобильных телефонах я писал отдельную статью, там в практической части мы пишем 3D-бродилку для Sony Ericsson!

Перейти к видео

Но помимо кнопочных телефонов, существовал сегмент High-end мультимедийных устройств, которые предоставляли гораздо больший функционал и производительность за немалые деньги. И речь, конечно же, о КПК! Девайсы, работавшие на базе шустрых процессоров Intel PXA и Samsung S3C с Windows Mobile на борту были заметно более перспективными для игр… но как-то не задалось из-за отсутствия нормальных каналов для распространения. Но тем не менее, Intel (иронично, но один из самых больших производителей ARM-чипсетов для КПК в те годы), которая уже занималась развитием десктопной графики GMA и PowerVR активно работали в этой сфере и результатом стало появление видеоускорителя 2700G, который представлял из себя не только 3D GPU PowerVR MBX Lite, но и аппаратный декодер видео, позволявший смотреть видео в высоком качестве! MBX Lite позволял запустить даже Quake 3 в 640x480 (!), пусть и в 10-15 FPS… Ещё за 5 лет до этого, далеко не все десктопные видеокарты могли выдать больше 30 FPS в 800x600!

Конечно в 2004 году уже вышел PSP, выставивший новую планку уровня 3D-графики для портативного гейминга, однако для смартфонов и КПК, уровень графики, разрешение и производительность 3D-игр на MBX Lite был просто немыслимым! Одним из самых легендарных и популярных устройств с 2700G, которое вы можете приобрести достаточно дешево и сейчас, был КПК Dell Axim X51v, флагманская модель с VGA-дисплеем тех лет. Но нельзя сказать, что только PowerVR работала в этом направлении. Параллельно NVidia выпустили GoForce, крайне редко попадающийся в «полноценном» виде (NVidia предлагала дешевле лицензировать только видео-декодер с отключением 3D-части, как это было в Toshiba Portege G900) и ATI Imageon, который чаще всего можно встретить в виде Adreno на ранних Android-чипсетах Qualcomm (Adreno — анаграмма Radeon :)).

Тем не менее, решение PowerVR было действительно массовым: компания не предлагала отдельный чип (что обычно было дороже), как конкуренты, а лицензировала другим компаниям уже готовые IP-ядра, которые производители чипов могли синтезировать и использовать в своих собственных чипсетах, или, сопроцессорах, как в случае с 2700G. Благодаря этому, MBX появился в чипсете TI OMAP 2430, использовавшийся в легендарных Nokia N93i и Nokia N95, Samsung INNOV8, Asus Lamborghini, Nokia E90 и некоторых других. Кроме того, PowerVR MBX использовался в процессоре Samsung S5L8900, судя по всему, разработанный для iPhone 2G и 3G! Благодаря этому, его можно считать одним из первых массовых 3D GPU в телефонах!

Одна из игр для iPhone 2G и N95 — Assasins Creed

Одна из игр для iPhone 2G и N95 — Assasins Creed

И Asphalt 5!

И Asphalt 5!

Весьма симпатично, согласитесь?

❯ Под капотом


Но MBX, конечно же, не появился «из ниоткуда» и был основан на более ранних разработках компании Imagination Tech, а именно GPU из полноценной домашней консоли SEGA Dreamcast — PowerVR CLX2, который в свою очередь был основан на ранних десктопных GPU PowerVR из середины-конца 90-х годов. Основная фишка PowerVR была в использовании так называемой техники отложного тайлового рендеринга (TBDR), которая, в отличии от классической растеризации и сортировки с помощью Z-буфера (или ручной сортировки треугольников) всех примитивов «в лоб» (методика, используемая в PSP, PS2 и большинстве видеокарт 2000-х годов), сначала ждёт от программы списка всех рисуемых треугольников в кадре, разбивает весь экран на тайлы (небольшие прямоугольные области), которые содержат в себе информацию о пересекающихся треугольниках, а затем процессом, несколько схожим с рейтрейсингом, определяет, какой из пикселей треугольника ближе всего находится к камере наблюдателя. Таким образом, мы избавляемся от необходимости сортировки геометрии с помощью Z-буфера (который сам по себе занимает достаточно много, по меркам тех лет, памяти и страдает от проблем точности и Z-fighting'а), а также такой метод позволяет реализовать более дешевый альфа-блендинг без ручной сортировки полупрозрачных примитивов и имеет ещё одну приятную фишку — «бесплатный» Occlusion Query, который можно использовать для реализации продвинутых техник отсечения невидимой глазу геометрии.

Производительность PowerVR MBX была весьма достойной для своих лет: при частоте работы в 200МГц, видеочип обеспечивал филлрейт в 100Мп, обрабатывал до 1млн треугольников в секунду. Нативным графическим API MBX был OpenGL ES 1.1 — специальная урезанная версия OpenGL для встраиваемых устройств, из которой выбросили все ненужное и которая заточена не только под floating-point, но и под fixed-point арифметику. В остальном, особо никаких отличий для программиста по сравнению с обычными GPU не было, можно было без проблем портировать уже существующие приложения для десктопого OpenGL для мобильные девайсы, чем и пользовались энтузиасты при портировании Quake 3 на Nokia E90, КПК и другие девайсы. Также, PowerVR MBX поддерживал D3DM — графический API Windows Mobile, о котором мы поговорим позднее.

Однако PowerVR MBX был GPU с фиксированным конвейером (FFP), а не программируемым, как принято в современных 3D-ускорителях. Что-же такое программируемый и фиксированный конвейер? Давайте разберемся:

  • Фиксированный конвейер: для того, чтобы задать визуальную составляющую рисуемой геометрии, программист оперирует набором заранее определенных при проектировании видеочипа параметров, которые позволяют управлять внешним видом растеризуемых примитивов. Например, для реализации света, программист задает параметры каждого из 8 источников света влияющих на рисуемый объект. Если программисту необходимо наложить несколько текстур за один проход (например, для реализации плавных переходов текстур на ландшафте или нанесения карты отражений на модель), он оперировал комбайнерами, которые позволяли задавать для каждого сэмплера параметры наложения. Такой подход использовался на десктопных GPU эпохи до GeForce 3 (т. е. примерно до 2000 года), до PS3 на Sony PlayStation (Xbox сразу вышел с GeForce 3) и до PSP включительно на портативках. Очевидно, что такой подход сильно ограничивает программиста в том, как будет выглядеть его игра на той или иной видеокарте.

  • Программируемый конвейер: в программируемом подходе, для управления визуальной составляющей программист пишет небольшие программы для видеокарты, называемые шейдерами. Всего есть два базовых (в современных GPU их больше) этапа программируемого конвейера: первый из них — вершинный шейдер, отвечающий за трансформацию геометрии (перевод из мировой системы координат в экранную) и, например, анимацию. Трансформированные вершины отправляются в следующий этап конвейера — растеризацию, где выполняется уже пиксельный шейдер, который определяет цвет пикселя (или более корректно — фрагмента в терминологии 3D графики) — т.е например, окрас объекта в определенной цвет, текстуру (или несколько текстур), рассчитывает попиксельное освещение, накладывает тени и т. д. Кроме того, такой подход позволяет реализовать сложные техники типа Ambient Occlusion, SSR, а также пост-эффекты (например блюр/блум, правда эти два можно «сэмулировать» и на FFP при определенной сноровке).


К 2007 году, Khronos выпустили спецификацию второй версии OpenGL ES, которая добавляла в мобильные устройства поддержку программируемого конвейера и шейдеров. Таким образом, мобильные GPU всё ближе приближались к уровню консолей и могли выдавать вполне годную графику, близкую к консолям. Даже была когда-то такая консоль, как Zeebo, которая работала на базе смартфонного чипсета Qualcomm с графикой ATI Imageon (!). PowerVR уже в 2009 выпустила серию SGX, которая также использовалась в iPhone, iPad, многих Android-смартфонах и планшетах, а также PS Vita!

Modern Combat 3 на iPad

Modern Combat 3 на iPad

Но статья с пересказом фишек PowerVR MBX была бы не особо интересной без практической части с написанием 3D-игры под этот GPU с нуля! Поэтому предлагаю посмотреть на нашего сегодняшнего гостя, легендарный флагманский КПК Dell Axim X51v из далекого 2005 года! Для тех лет, это настоящий «жир»:

Его мне подарил мой читатель Сергей с Хабра, за что ему огромное спасибо! Девайс был в полной комплектации, даже с флэшкой и усиленной АКБ, которая до сих пор неплохо держит заряд, однако у него не работал тачскрин. Если вам интересен только процесс программирования игры, а не аппаратного ремонта, то листайте ниже сразу до следующего абзаца :)

❯ Практическая часть: ремонтируем КПК


По факту, девайс полностью работал, однако в некоторые моменты времени не откликался на кнопки и тачскрин, и по всем симптомам это напоминало дребезг кнопок. При этом тачскрин сам по себе реагировал нормально во всех местах, что, фактически, исключало вероятность его поломки (хотя резистивные тач-панели сами по себе не особо надежные, в отличии от емкостных тачскринов). Дело было вот в чём: во многих КПК тех лет был отдельный аппаратный переключатель блокировки клавиатуры и тачскрина, который можно было использовать при просмотре фильмов. Однако на моем девайсе он был слишком разболтанным…

Разбирается КПК несложно: выкручиваем 4 винта и снимаем переднюю часть корпуса. На всякий случай я прочистил грязь между тачем и верхней частью корпуса — она тоже бывает влияет на ложные нажатия и чувствительность тачскрина:

А вот и виновник наших проблем: рычажок переключателя был отломан, но все еще находится в положении «разблокирован». Даже если в выжать в упор — он все равно не работал. Ну что ж, фен в руки, сдуваем переключатель и ставим вот такую перемычку (на фото флюс ещё не отмыт):

Включаем девайс и смотрим — теперь всё работает! Вот такой простой и быстрый ремонт Axim'а. КПК мне сразу очень понравился, я и ранее знал о его легендарности, но теперь узнал и о том, что он очень круто спроектирован и собран! Кстати, есть смысл сразу сдуть концевой выключатель, который прижимает задняя крышка и заменить на перемычку.
GPU не очень хорошо работает на кастомных прошивок, на которую прошиты многие Axim X51v. Поэтому есть смысл прошить сток: качаем прошивку (Файл отката), закидываем на SD-карту и ребутим девайс нажатием клавиш Wi-Fi + включение + Reset. После этого, девайс пойдет прошиваться.

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

❯ Практическая часть: подготовка


Изначально, в практической части статьи должна была участвовать не менее легендарная Nokia N95. Однако вот незадача: несмотря на то, что под Symbian сохранился SDK (который работает нормально только под Windows XP), на устройствах с системой старше 9.x необходимо взламывать installserver, дабы иметь возможность ставить хоумбрю программы (к которым относится и наша игра) и отладчик TRK.

И хотя свой девайс я пропатчил, дебаггер нормально поднять мне так и не удалось. Я смог проинициализировать контекст GLES, запилить примитивный рендерер с загрузкой ассетов из памяти устройства но потом решил перевести проект на WinMobile… Проблем с разработкой под Symbian много: если приложение крашится — то оно просто закрывается, без сообщений и логов. Добавьте к этому то, что в Symbian вообще нет исключений и не всегда можно записать ошибки в лог и отладка превращается в ужас. Ситуацию исправляет Qt, который работает на N95, но в котором нет поддержки GLES (по крайней мере, в виде обычного QOpenGL, хотя возможность юзать API системы из Qt есть и дебаггер там работает нормально, так что не всё потеряно). Если вы когда-то что-то пилили под Symbian, особенно в Carbide — пишите свой опыт в комментариях, интересно почитать :)

WinMobile не менее интересен тем, что в нём поддерживается сразу два графических API: классический OpenGLES в профиле Common Lite (только fixed-point арифметика) и мобильная версия Direct3D — D3DM.dll, которая предоставляет API очень похожее на DX9, но без поддержки шейдеров. Что не менее приятно — есть официальные биндинги от Microsoft к D3DM в .NET Compact Framework, что позволяет легко писать 3D-игры под WM на C#/VB.NET.
Поскольку WinMobile — достаточно открытая для пользователя система, хватит лишь накатить VS2005/2008 на машину с WinXP/WinVista/Win7/Win8 и сразу начать разрабатывать под неё приложения, никаких проблем с отладкой и запуском приложений тут нет. На Win10/Win11 совместимость с WM5 поломали :(

Создаём приложение для смарт-устройств, выбираем в качестве целевой платформы WM5-устройство (эмулятор будет слишком медленным для наших целей, он даже для 2D-игр не подойдет) и, наконец-то, приступаем к написанию игры!

Что же за игра у нас будет? Я решил сделать эдакое 3D-переосмысление популярного в прошлом бесконечного раннера из «тетриса», где мы едем на машинке F1 и обгоняем другие машины, стараясь в них не врезаться. Основной целью является набрать как можно больше очков. Подобные игры достаточно популярны на мобильных девайсах и сейчас: вспомнить хотя-бы Highway Traffic, однако мой вариант будет весьма колоритным: ведь в моей демке мы будем кататься на ТАЗе 21099 и уворачиваться от гнилых «вторых гольфов». Ну а почему бы и нет, я просто очень люблю старые гнилые жигули и это не первый мой проект про машины этого производителя :)

❯ Практическая часть: «движок»


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

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

  • Звук: воспроизведение wav-звуков и музыки из файлов. Да и всё пожалуй — что ещё нужно от звуковой подсистемы? :) Стерео ведь нет, поэтому и 3D-звук не нужен.

  • Ввод: обработка нажатий на тачскрин и аппаратные кнопки устройства, маппинг кейкодов в виртуальный «геймпад». GUI-подсистему тоже частично можно отнести именно сюда!

  • Физика: AABB и Sphere vs Sphere столкновения. Никакого полноценного солвера тут и не нужно :)


Начинаем, пожалуй, с реализации рендерера. Сначала нам необходимо создать окно и контекст D3DM. Процесс практически идентичен D3D8 и D3D9: передаём информацию о нужном адаптере (видеочипе) и заполняем структуру PresentationParameters, однако есть важные нюансы: аппаратный FSAA лучше всего отключить (MultisampleQuality), а также передавайте точный размер окна, в которое собираетесь рендерить изображение, иначе система начнёт софтварно (!) скейлить рендертаргет до размера окна каждый кадр, что, как сами понимаете, крайне медленно.

Из форматов Depth-Stencil форматов поддерживается D16, D24S8 и D32. Желательно использовать D16 (несмотря на тайловую архитектуру, насколько мне известно, в MBX все равно есть fallback до классического рендеринга при некоторых условиях). Практически на всех КПК и коммуникаторах использовался 16-битный цвет, т.е RGB565, но можно указать Unknown — тогда GAPI подцепит тот формат пикселя, что используется в остальной системе.

PresentParameters pp = new PresentParameters();
pp.AutoDepthStencilFormat = DepthFormat.D16;
pp.BackBufferCount = 1;
pp.BackBufferFormat = Format.Unknown;
pp.BackBufferWidth = parentForm.ClientSize.Width;
pp.BackBufferHeight = parentForm.ClientSize.Height;
pp.EnableAutoDepthStencil = true;
pp.FullScreenPresentationInterval = PresentInterval.One;
pp.MultiSample = MultiSampleType.None;
pp.PresentFlag = PresentFlag.None;
pp.SwapEffect = SwapEffect.CopyVSync;
pp.Windowed = true;

device = new Device(0, DeviceType.Default, parentForm.Handle, CreateFlags.None, pp);
device.RenderState.Lighting = false;

aspectRatio = (float)parentForm.ClientSize.Width / (float)parentForm.ClientSize.Height;

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

public void BeginScene()
{
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.SkyBlue, 1.0f, 0);
device.BeginScene();

device.TextureState[0].MinFilter = TextureFilter.Point;
device.TextureState[0].MagFilter = TextureFilter.Point;
device.RenderState.TexturePerspective = true;

// Prepare projection
Matrix matrix = Matrix.PerspectiveFovLH(60.0f * MathUtils.DegToRad, aspectRatio, 0.1f, 350.0f);
device.SetTransform(TransformType.Projection, matrix);
}

public void EndScene()
{
device.EndScene();
device.Present();

System.Threading.Thread.Sleep(16);
}

Чтобы какую-то модельку нарисовать, нам нужно сначала её загрузить! Для возможности напрямую прочитать треугольники из файла и сразу записать их в вершинный буфер, я написал небольшой конвертер из формата SMD (GoldSrc) в собственный, очень простой и легковесный формат, который состоит из позиции вершины и её текстурных координат:

public struct BoundingBox
{
public float MinX, MinY, MinZ;
public float MaxX, MaxY, MaxZ;
}

public sealed class ModelConverter
{
public const int Header = 0x1234;

static BoundingBox CalculateBBox(SmdMesh mesh)
{
BoundingBox ret = new BoundingBox();
ret.MinX = float.PositiveInfinity;
ret.MinY = float.PositiveInfinity;
ret.MinZ = float.PositiveInfinity;
ret.MaxX = float.NegativeInfinity;
ret.MaxY = float.NegativeInfinity;
ret.MaxZ = float.NegativeInfinity;

foreach (SmdTriangle triangle in mesh.Triangles)
{
for (int i = 0; i < 3; i++)
{
ret.MinX = Math.Min(ret.MinX, triangle.Verts[i].Position.X);
ret.MinY = Math.Min(ret.MinY, triangle.Verts[i].Position.Y);
ret.MinZ = Math.Min(ret.MinZ, triangle.Verts[i].Position.Z);

ret.MaxX = Math.Max(ret.MaxX, triangle.Verts[i].Position.X);
ret.MaxY = Math.Max(ret.MaxY, triangle.Verts[i].Position.Y);
ret.MaxZ = Math.Max(ret.MaxZ, triangle.Verts[i].Position.Z);
}
}

return ret;
}

private static int FloatToFixedPoint(float x)
{
return ((int)((x) * 65536.0f));
}

public static void Convert(string fileName, Stream stream)
{
Console.WriteLine("Converting mesh " + fileName);

Smd2Bmd.SmdMesh mesh = new Smd2Bmd.SmdMesh(stream);
BoundingBox bb = CalculateBBox(mesh);

using(Stream outStrm = File.Create(Path.GetFileNameWithoutExtension(fileName) + ".mdl"))
{
BinaryWriter writer = new BinaryWriter(outStrm);

writer.Write(Header);
writer.Write(mesh.Triangles.Count * 3); // Verts count

// BBox
writer.Write(bb.MinX);
writer.Write(bb.MinY);
writer.Write(bb.MinZ);
writer.Write(bb.MaxX);
writer.Write(bb.MaxY);
writer.Write(bb.MaxZ);

foreach (SmdTriangle triangle in mesh.Triangles)
{
for (int i = 0; i < 3; i++)
{
writer.Write(FloatToFixedPoint(triangle.Verts[i].Position.X));
writer.Write(FloatToFixedPoint(triangle.Verts[i].Position.Y));
writer.Write(FloatToFixedPoint(triangle.Verts[i].Position.Z));

writer.Write(triangle.Verts[i].UV.X);
writer.Write(triangle.Verts[i].UV.Y);
}
}
}
}
}

Обратите внимание, PowerVR MBX оперирует fixed-point арифметикой! D3DM, конечно, может автоматически преобразовывать float-координаты вершин в числа с фиксированной точкой, вот только реализовано это криво и косо: драйвер будет конвертировать все вершины в fixed-point каждый вызов отрисовки, вместо того, чтобы один раз преобразовать их после Unlock'а вершинного буфера. Теперь представьте, насколько это тормозно для хоть сколь-либо комплексной модели :)

При этом загрузчик модели при таком подходе будет очень простым и будет работать шустро даже на таком слабеньком железе:

public Model(string debugName, Stream strm)
{
BinaryReader reader = new BinaryReader(strm);

int hdr = reader.ReadInt32();
int numVerts = reader.ReadInt32();
int vertSize = 20;

Bounds = new BoundingBox(reader.ReadSingle() * 2, reader.ReadSingle() * 2, reader.ReadSingle() * 2,
reader.ReadSingle() * 2, reader.ReadSingle() * 2, reader.ReadSingle() * 2);

PrimitiveCount = numVerts / 3;

byte[] data = new byte[numVerts * vertSize];
strm.Read(data, 0, (int)(strm.Length - strm.Position));

Buffer = new VertexBuffer(Engine.Current.Graphics.device, vertSize * numVerts, Usage.None, VertexFormats.PositionFixed | VertexFormats.Texture1, Pool.SystemMemory);
GraphicsStream gs = Buffer.Lock(0, Buffer.SizeInBytes, LockFlags.None);
gs.Write(data, 0, data.Length);
Buffer.Unlock();

DebugName = debugName;
}

Переходим к текстурам. Грузить напрямую png/jpg на КПК слишком долго, поэтому их я тоже перегоняю в собственный примитивный формат, который состоит из описания ширины/высоты, а также формата текстуры и собственно, самих пикселей. На данный момент поддерживаются только RGB565 текстуры — с ними MBX работает лучше всего:

public sealed class TextureConverter
{
public const int Header = 0x1234;

public static unsafe void Convert(string fileName, Stream stream)
{
Console.WriteLine("Converting texture " + fileName);

Bitmap bitmap = (Bitmap)Image.FromStream(stream);
byte[] pixels = new byte[bitmap.Width * bitmap.Height * 2];

System.Drawing.Imaging.BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format16bppRgb565);
Marshal.Copy(data.Scan0, pixels, 0, pixels.Length);

bitmap.UnlockBits(data);

using (Stream outStrm = File.Create(Path.GetFileNameWithoutExtension(fileName) + ".tex"))
{
BinaryWriter writer = new BinaryWriter(outStrm);

writer.Write(Header);
writer.Write(0); // 0 - 565, 1 - RGBA
writer.Write(bitmap.Width);
writer.Write(bitmap.Height);

writer.Write(pixels);
}
}
}

Загрузчик тоже получился примитивным и шустрым донельзя, пусть и без какой либо компрессии. PowerVR MBX поддерживает собственный формат компрессии — PVRTC:

BinaryReader reader = new BinaryReader(strm);

int hdr = reader.ReadInt32();
int fmt = reader.ReadInt32();

Width = reader.ReadInt32();
Height = reader.ReadInt32();

byte[] data = new byte[Width * Height * 2];
strm.Read(data, 0, data.Length);

Handle = new Texture(Engine.Current.Graphics.device, Width, Height, 1, Usage.Lockable, Format.R5G6B5, Pool.VideoMemory);

int pitch;
GraphicsStream gs = Handle.LockRectangle(0, LockFlags.None, out pitch);
gs.Write(data, 0, data.Length);
Handle.UnlockRectangle(0);

strm.Close();

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

public void DrawModel(Model model, Transform transform, Material material)
{
Matrix matrix = Matrix.RotationY(transform.Rotation.Y * MathUtils.DegToRad)
* Matrix.Translation(transform.Position);
device.SetTransform(TransformType.World, matrix);

// Setup renderstate
device.RenderState.ZBufferWriteEnable = !material.DepthWrite;
device.SetTexture(0, material.Diffuse.Handle);

device.SetStreamSource(0, model.Buffer, 0);
device.DrawPrimitives(PrimitiveType.TriangleList, 0, model.PrimitiveCount);
}

И рисуем модельку:

Model model;
Material mat;
Transform t;

void Start()
{
model = Model.FromFile("model.mdl");

mat = new Material();
mat.Diffuse = Texture2D.FromFile("test.tex");
}

void Update()
{
t = new Transform();
t.Position.Z = 150;
t.Rotation.Y += 0.1f;

graphics.DrawModel(model, t, mat);
}

Результат: у нас есть крутящийся кубик или любая другая произвольная 3D-модель!

Перейти к видео

Переходим к обработке ввода. Тут ничего сложного нет, ловим события KeyUp/KeyDown формы и назначаем виртуальным кнопкам их состояние.

public Input(Form parentForm)
{
keyState = new bool[(int)GamepadKey.Count];

parentForm.KeyPreview = true;

parentForm.KeyDown += new KeyEventHandler(OnKeyDown);
parentForm.KeyUp += new KeyEventHandler(OnKeyUp);
}

private GamepadKey ResolveKeyCode(Keys key)
{
GamepadKey k = GamepadKey.Count;

switch (key)
{
case Keys.Left:
k = GamepadKey.Left;
break;
case Keys.Right:
k = GamepadKey.Right;
break;
case Keys.Up:
k = GamepadKey.Up;
break;
case Keys.Down:
k = GamepadKey.Down;
break;
case Keys.Return:
k = GamepadKey.OK;
break;
}

return k;
}

void OnKeyUp(object sender, KeyEventArgs e)
{
GamepadKey key = ResolveKeyCode(e.KeyCode);

if (key != GamepadKey.Count)
SetKeyState(key, false);
}

void OnKeyDown(object sender, KeyEventArgs e)
{
GamepadKey key = ResolveKeyCode(e.KeyCode);

if (key != GamepadKey.Count)
SetKeyState(key, true);
}

public bool GetKeyState(GamepadKey key)
{
return keyState[(int)key];
}

private void SetKeyState(GamepadKey key, bool state)
{
keyState[(int)key] = state;
}

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

Показать полностью 17 3
[моё] Гаджеты Программирование Смартфон Кпк Dell Opengl Gles Directx Видеокарта Мобильные телефоны Девайс 3D графика Gamedev Графика Видео Без звука Вертикальное видео YouTube Длиннопост
12
Valservis.31
Valservis.31

Dell не заряжает аккумулятор⁠⁠

1 год назад

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

[моё] Dell Dell Inspiron 15 Ремонт ноутбуков Ремонт компьютеров Не заряжается Видео YouTube
0
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии