• Тормоза браузера из-за стилей, решение?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Для начала для нас важно осознать, что у разных фильтров разная вычислительная сложность. Они не все "плохие". Алгоритмы для brightness, grayscale, hue-rotate и других манипуляций с цветом выполняются за O(1) для каждого пикселя. Т.е. нагрузка на железо растет линейно в зависимости от площади элемента на экране. Это не так страшно. А вот фильтры размытия, blur или drop-shadow, имеют сложность где-то в районе O(R^2). Там есть разные варианты оптимизаций, но в среднем мы говорим именно о квадратичной зависимости от радиуса размытия. И это для каждого пикселя. Именно отсюда мы имеем сильные тормоза при попытке что-то большое размыть на пол экрана. Дохлые видеокарты телефонов и ноутбуков не вывозят. Браузеры не умеют такие вещи переиспользовать, так что это переразмытие происходит снова и снова, и мы имеем что имеем.

    При этом фильтры в CSS, в SVG - это все грубо говоря высокоуровневые обертки над одними и теми же универсальными алгоритмами рендеринга. Мы можем в рамках WebGL написать свои шейдеры, которые будут делать то же самое. Обертки разные, но алгоритмы одинаковые. Поэтому замена одной технологии на другую ничего особо не даст в плане производительности. В вопросах оптимизаций нам нужно не по-тупому менять инструменты-обертки, а смотреть в конечные алгоритмы, которые будут задействованы на странице в реальном времени, и по возможности рассчитывать все заранее и переиспользовать.

    В контексте верстки тут есть полтора варианта, что можно сделать. Можно рассчитывать такие вычислительно-сложные штуки еще при разработке и загружать в страницу сразу в виде картинок или видео. Это не идеальный вариант, пропорции получаются фиксированные, но иногда подходит. Есть вариант рассчитывать такие штуки в фоне на WebGL. Т.е. мы грузим интерфейс, смотрим какого там все размера получается, и один раз в фоновом режиме генерируем картинки нужного размера и потом плавно показываем. Такой вариант частенько встречается в рекламно-конкурсных проектах, когда за прелоадером в начале скрывается в том числе и такая генеративная история. Тут мы получаем гибкость в плане размеров и хорошую производительность сайта в целом, потому что все операции проходят только один раз, а дальше у нас все переиспользуется в виде обычных картинок. Каких-то принципиально других вариантов у нас пока нет. Только дизайн менять.
    Ответ написан
    3 комментария
  • Почему игнорируется блок кода при подключении к бд?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос очень важный. Он показывает, насколько изменились подходы к программированию за четверть века.
    Вот этот детский лепет -
    spoiler
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } else {
    echo "Connected successfully";
    }
    - происходит прямиком из прошлого века. Именно так писали на РНР3, в 1998 году.

    С тех пор прошло уже 25 лет, а пехопа всё так и пишет РНР немного подрос, и проверять ошибки при работе с БД вручную стало не нужно. А чтобы увидеть ошибку, надо всего лишь включить вывод ошибок РНР. На домашнем сервере достаточно просто написать в начале скрипта

    ini_set('display_errors', 1);

    (и не забыть поставить 0, когда код поедет на боевой).

    Соответственно, блок кода "игнорируется" просто потому, что ошибка является фатальной, и выполнение скрипта останавливается, ещё до всех этих if ($conn.
    Ответ написан
    Комментировать
  • Трансляция видеострима из единого игрового мира?

    saboteur_kiev
    @saboteur_kiev Куратор тега Разработка игр
    software engineer
    И возможно ли оттуда транслировать видеострим? смысл в том чтобы просчитать все на сервере и отдать клиенту видеострим.

    Предлагаешь, чтобы на сервере стояла графическая карточка для каждого юзера?
    Ну возьмем сервер,где играет 100-200 человек. Нужно 100-200 видеокарточек на сервере.
    Хочешь 1000? 1000 карточек? Тут тупо на электричестве сервер разорится.

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

    Главное чтобы интернет был норм

    Давай посчитаем как отдавать видеострим.
    Берем например ну хотя бы hd 1920x1080x4 (2 млн цветов). Получаем 8294400 байт один кадр ( 8 мегабайт). Ты же хочешь нормальный фпс, ну хотя бы 50 в секунду, 400 мегабайт в секунду. на одного юзера.

    Хочешь поговорить о крутом сжатии? Так вот, оно не работает на кадрах. Оно работает на стримах, когда можно проанализировать некоторое количество кадров и уже работать от них. Тогда надо решить вопрос сколько кадров мы будем удерживать для анализа и сжатия, перед тем как куда-то передавать. Игры типа контерстрайка, где 5-10 мс имеют значение сразу улетают в трубу. Сжатие может быть разным, в зависимости от того как резко меняется картинка, а неравномерность лагов хуже чем постоянный лаг. То есть надо решить еще и этот вопрос

    То есть сжимать стрим на уровне кадров, если мы не можем их полноценно анализировать.
    Нормальные современные кодеки умеют и в А-фреймы и Б-фреймы, то есть жмут в обе стороны. Плюс не ограничены во времени. А у нас и время поджимает, и генерация ограничена количеством кадров которые мы можем вместе использовать. В итоге сжатие будет не 90% как в современных видеокодеках, а хорошо если сожмет треть, и качество будет теряться. И трафик уменьшитсья ну до 50-100 мб/сек.
    Теперь подумаем что у клиента отличный инет. А у сервера будет 50-100 мб/сек на КАЖДОГО игрока? Это какой канал должен быть у сервера для поддержания 100-200 игроков? А 1000?

    В итоге твоя идея технически совершенно не рабочая.

    Облачный хостинг сталкивается с теми же проблемами - лаги, хромает качество видео, в результате играть в мультиплеер становится проблематично. Более-менее можно играть в синглплеер, где милисекунды не так критичны. Но тут нужно понимать что облачный гейминг это не 1000 игроков на одну серверную, а пару десятков тут, пару десятков там, спрос на него не слишком большой, поэтому и бизнесом этим мало кто занимается.
    Отдельный плюс облачного гейминга бывает в том, что игры могут быть уже оплачены, и можно поиграть во что-то что лень себе покупать.
    Ответ написан
    2 комментария
  • Ошибка с jquery?

    ThunderCat
    @ThunderCat Куратор тега JavaScript
    {PHP, MySql, HTML, JS, CSS} developer
    тут нужно либо крестик снять, либо трусы надеть. Вы делаете отложенную загрузку скрипта жквери (через дефер), и при этом вызываете код, который без него работать не будет.
    Вариантов 2:
    1) Убрать дефер на жквери скрипт
    2) Закатать весь код жквери в православный ванила жс евент загрузки, типа документ.аддевентлистенер (ДОМCонтентЛоадед)
    Ответ написан
    Комментировать
  • Как использовать Command в привязке WPF?

    Nipheris
    @Nipheris Куратор тега C#
    Ну, если прям на чистом WPF, без всякого упрощающего жизнь обвеса типа ReactiveUI, то как-то так.

    Код вьюмодельки.
    internal class MainViewModel
    {
    	private sealed class PlayCmd(MainViewModel mainViewModel) : ICommand
    	{
    		/// <summary>
    		/// Можно ли вызвать команду? Влияет на доступность привязанных к команде контролов, например кнопки
    		/// </summary>
    		public bool CanExecute(object? parameter) =>
    			// команду Play можно вызвать только если мы ещё не начали проигрывание
    			!mainViewModel.isPlaying;
    
    		/// <summary>
    		/// Ивент, нужный чтобы уведомить об изменении значения свойства CanExecute
    		/// </summary>
    		public event EventHandler? CanExecuteChanged;
    
    		public void Execute(object? parameter)
    		{
    			// вызываем метод у вьюмодели
    			mainViewModel.Play();
    			// дёргаем событие, чтобы сообщить всем, кто привязался к команде,
    			// что её статус "можно исполнить" изменился
    			// если этого не сделать, то кнопка НЕ задизаблится (хотя CanExecute уже возвращает false)
    			this.OnCanExecuteChanged();
    		}
    
    		private void OnCanExecuteChanged() =>
    			this.CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    	}
    
    	private readonly PlayCmd playCommand;
    	private bool isPlaying = false;
    
    	public MainViewModel()
    	{
    		this.playCommand = new(this);
    	}
    
    	public ICommand PlayCommand => this.playCommand;
    
    	public void Play()
    	{
    		//Player.Play();
    		this.isPlaying = true;
    	}
    }

    Код вьюхи.
    <Window x:Class="Miramax.MainWindow"
    		xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    		xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    		xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    		xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    		xmlns:local="clr-namespace:Miramax"
    		mc:Ignorable="d"
    		Title="MainWindow" Height="450" Width="800">
    	<Window.DataContext>
    		<local:MainViewModel />
    	</Window.DataContext>
    	<Grid>
    		<Button Command="{Binding PlayCommand}">Click</Button>
    	</Grid>
    </Window>
    Ответ написан
    1 комментарий
  • "Не удается неявно преобразовать тип "string" в "bool"" что делать?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы перепутали присваивание (=) и сравнение (==)
    Ответ написан
    Комментировать
  • Отправка форм через ajax не работают после переноса сайта с Beget на VDS?

    pLavrenov
    @pLavrenov
    Разработка сайтов
    General error: 1364 Field 'login' doesn't have a default value in ***/authorization/controler/authorization.php:80
    Ответ написан
    Комментировать
  • Swiper не работает hover и a href?

    Get-Web
    @Get-Web Куратор тега CSS
    Front-End Developer
    Он у тебя на всех работает, просто последний слайд идет поверх остальных и скрывается только при помощи opacity: 0;
    Добавь ко всем неактивным слайдам pointer-events: none; или visibility: hidden;
    Ответ написан
    1 комментарий
  • Клики по динамически созданным кнопкам в форме ajax?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    делегирование.
    +$(".form-submit").on("click", ".product__add", function () {
    -$(".product__add").on("click", function () {
    Ответ написан
    Комментировать
  • Как добавить класс js?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Используйте всплытие событий. Вешайте обработчик на постоянно присутствующий родительский элемент.
    Ответ написан
    2 комментария
  • Почему выводится текст вместо QR кода?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    Ничего не понял из того на чем вы это делаете, но
    qr('{$product.name')}
    скобка - апостроф - фигурная
    а справа идут не в обратном порядке
    Ответ написан
    Комментировать
  • Open Server работает очень медленно, как ускорить его работу?

    skapunker
    @skapunker
    Умный
    Столкнулся с такой же проблемой. Решил так: в настройках движка сайта в конфиге для подключения к БД вместо localhost написал 127.0.0.1 и все стало норм.
    Ответ написан
    9 комментариев
  • Как практиковаться в программировании?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Забей на программирование, это не твое.

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

    Найди ту деятельность, где у тебя глаза горят.
    Ответ написан
    4 комментария
  • Как называют "сервисный сбор" в корзине?

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Упаковка/сборка заказа, можно даже сделать ее бесплатной от какой-то суммы.
    Ответ написан
    1 комментарий
  • Как правильно переписать css в scss с нестингом?

    @its2easyy
    .project-details__container.project-details__container__loaded {}
    .project-details__cover.project-details__cover_loaded {}

    =>
    .project-details{
      $this: &;
      &__container{
         &#{$this}__container__loaded{
    
        }
      &__cover{
           &#{$this}__cover_loaded{
    
           }
        }
      }

    Но вообще тут что то не то со специфичностью, по нормальному это должно было бы быть как-то так
    .project-details {
      &__container{
         &__loaded{
        }
      }
    }
    Ответ написан
    Комментировать
  • К какому шаблону относится оформление свойств через нижнее подчеркивание?

    meusov11
    @meusov11
    По сути никакому.

    Использование нижнего подчеркивания перед именем переменной, такого как наприме р this._data, является соглашением в некоторых языках программирования, включая JavaScript. Это не является частью синтаксиса языка или специальной функциональностью, а скорее соглашением об именовании, указывающим на то, что переменная является "приватной" или "внутренней" для твоего класса

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

    Таким образом, this._data в вашем примере указывает на то, что _data предполагается использовать только внутри класса User. Если бы использовалось this.data без символа _, это могло бы дать впечатление, что свойство data предназначено для публичного доступа извне класса.

    Еще разрабы документируют такие соглашения и указывают на то, что свойства или методы с символом _ перед именем предназначены для внутреннего использования. Это может быть указано в комментариях или в документации класса.
    Ответ написан
    8 комментариев
  • Зачем нужны объявления типов php?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Постараюсь объяснить на анти-примере.
    Ну вот допустим пришли вы на новое место работы, в котором какое-то время делают какой-то проект.
    Вам дают задачу вывести на фронт ранг пользователя.
    Вася Пупкин говорит, что уже написал метод для получения ранга пользователя - getUserRank и вам нужно просто использовать его. Вроде все хорошо, но вы открываете исходники и видите вот такую картину:
    (примеры абстрактные, написанные на коленке)
    class UserUtils {
       public function getUserRank($user) {
          // 20-30 строк кода
       }
    }

    Смотрите вы на этот метод и думаете:
    Что такое $user? Это строка с логином? Это id-шник? Это объект ORM?

    А что возвращает метод? Число? Объект ORM?

    И вместо-того, чтобы приступить непосредственно к реализации задачи, вы сидите и читаете Васин код, чтобы понять, что надо передавать.
    А если бы метод выглядел примерно так:
    class UserUtilsWithTypes {
       public function getUserRank(UserModel $user) : int {
          // code
    
       }
    }

    То вы бы сразу поняли, что $user это объект ORM, а метод возвращает метод число.
    Да, стоит добавить, что помимо объявления типа следует и имя аргумента указывать соответствующее его типу (например для bool часто вижу имена вроде $is_[что-то]), но речь сейчас не об этом.
    Ответ написан
    5 комментариев
  • Возможно ли создать скрип, который после бронирования клиентом будет отписывать ему в telegram(WP)?

    vitaly_74
    @vitaly_74
    Возможно? -да. А что с остальным делать не знаю. Наверное стоит обратиться на биржу фриланса.
    Ответ написан
    2 комментария
  • Почему синхронный код в JS потребляет больше памяти?

    Fragster
    @Fragster
    помогло? отметь решением!
    await - это не "синхронно". Это синтаксический сахар. Соответственно, "внутри" всё то же самое, те же промисы и коллбэки. Скорее всего кушать память стало из-за кривого переписывания.
    Ответ написан
    Комментировать