• Как правильно назвать пакет на github?

    @majstar_Zubr
    C++, C#, gamedev
    Буквы и слова не имеют особого значения, главное - раскрывать суть названием и называть однообразно по тому же правилу, что и другие пакеты.
    Ответ написан
  • Как организовать поддержку двух версий одного приложения?

    @majstar_Zubr
    C++, C#, gamedev
    Например, через Gitlab pipelines. Каждому проекту указывается своя директория с ассетами и конфигурационными файлами через приватные пересенные и запускается межпроектная сборка.

    В любом случае, идея сводится к тому, что нужно нажать одну кнопку для сборки, на чем CI/CD не важно.
    Ответ написан
    Комментировать
  • Какой яп выбрать и какой метод обучения выбрать?

    @majstar_Zubr
    C++, C#, gamedev
    Python вполне подходит. Упритесь в потолок и оптимизируйте узкие места на С++.

    Учить можно что угодно бесконечно, если следовать "бытующим мнениям". Пока нет уверенного понимания работы ОС и модели памяти того или иного ЯП, вопросы о выборе языка для задачи всегда будут принадлежать бытующим мнениям, а не собственному.
    Ответ написан
    Комментировать
  • Сколько предметов может хранить сервер в игре?

    @majstar_Zubr
    C++, C#, gamedev
    Во-первых, ознакомьтесь с моделью памяти C#, как работает сборщик мусора, какие есть кучи, как они заполняются и опустошаются, как работать с IDisposable, using, и оборачивать unmanaged ресурсы.

    Потому что на самом деле есть выбор: делать сервер на .Net либо на LLVM. В принципе, на LLVM garbage collector свой, и напридумать модно много чего интересного.

    Во-вторых вам нужно разобраться в архитектуре ОС. Дело в том, сервер не может "рухнуть" из-за каких-то абстракций, он может начать захватывать слишком много памяти, и в зависимости от настроек ядра и окружения вашего Linux, в котором запущен процесс сервера, могут происходить разные вещи, которые ограничены лишь с вашими желаниями.

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

    ( а относительно игровых движков, это просто сводится к названию используемых библиотек)

    1 инстанс сервера может держать 100к соединений, но ваш игровой room может обслуживаться и многими нодами, не обязательно одной. Более того, у вас может быть не одна nosql база данных, а целый кластер.

    Другими словами, вам стоит ознакомится с концепциями ACID, кластеризацией и микросервисной архитектурой. В завершение можете почитать про Kubernetes.

    Когда вы проработаете эти темы, вы сможете уточнить свой вопрос до конкретных технических требований и сами сможете на него ответить.

    PS: Касательно максимума соединений к абстрактным коням в вакууме, считается, что один демон, держащий 10к соединений - это граница highload. В конкретных цифрах обычно все сводится к доле процессорного времени за интервал допустимой задержки ответа сервера на конкретной платформе включая конкретное железо и конкретную сетевую карту + тесты доступа из точек по всей планете.
    Ответ написан
    Комментировать
  • Надо ли чтобы сделать такую игру иметь сервер?

    @majstar_Zubr
    C++, C#, gamedev
    Да, потому что такие игры стимулируются мета-геймом, который в самом примитивном случае имеет leaderboards и сезоны. Если нельзя померить у кого ствол длиннее, то играть и смысла нет. А эти данные надо хранить где-то, плюс нужна админка для гейм-мастера / маркетолога / аналитика / админа и какой-то сбор статистики, чтобы систематически своевременно реанимировать умираещее сообщество. В принципе такой сервер можно собрать на любом веб-хостинге, для софт-ланча хватит.

    Если из игры не делать бизнес, а так, для портфолио / с друзьями поугарать, то хватит и просто одной таблички в БД, в которой все клиенты подключаться напрямую будут.

    Можно и локальный сервер/БД, но тогда игра по локальной сети. Можно поставить какой-нибудь Termux, или через Userland / Linux deploy, Anlinux развернуть linux под ARM, поднять сервер с бд прямо на своем смартфоне.

    А если без сервера, то там подход другой должен быть, игра должна на мини-играх вытягивать, которые могут быть сами по себе самодостаточными.
    Ответ написан
    3 комментария
  • Какие есть ресурсы для изучения C++ UE4?

    @majstar_Zubr
    C++, C#, gamedev
    Все начинается отсюда: https://docs.unrealengine.com/en-US/Programming/Tu...

    https://docs.unrealengine.com/en-US/Programming/in...

    И заканчивается доками:
    https://docs.unrealengine.com/en-US/API/index.html

    Это не все ссылки на документацию и примеры, которые можно глянуть на github.

    Что насчёт udemy, то конечно, полезно. Про blueprint тоже знать полезно, но в конце концов, все дороги ведут на форумы и доки на офф ресурсе.
    Ответ написан
    Комментировать
  • Как себя направлять в обучении, почему через 4 года опыта работы я все еще плохо программирую?

    @majstar_Zubr
    C++, C#, gamedev
    Если у вас проблемы с пониманием кода, значит у вас разработка происходит без методологии. Дело в том, что любое отклонение от конкретной методики, которое не согласовано с остальными методиками в рамках одной методологии, превращает любую методологию разработки ПО в тыкву. Либо всё работает как система, либо всё не работает. Если у вас отсутствует код ревью, в корне отсутствует парное программирование, работа над предметной областью происходит без обсуждений, и нет совместных обсуждений api и предметных областей межмодульных прослоек, то естественным образом это означает, что коммуникации между разработчиками не налажены. Следствием этого является то, что полет мысли у каждого разработчика происходит на своей волне и неудивительно, что вы не понимаете код друг друга. Как бонус, вы ещё и не в курсе сильных и слабых компетенций друг друга.

    1) Берёте коллегу - 1 шт
    2) Берёте код иного коллеги - 1 модуль. Ограничение: вы и коллега независимо оцениваете код иного коллеги непонятным.
    3) Вы и коллега независимо рефакторите его до состояния: "теперь мне все понятно".
    4) Собираетесь с коллегой за одним экраном и проводите код ревью над результатами обоих рефакторингов.

    Ответ на свой вопрос вы только так получите. Но профита не много, потому что вам нужно обеспечить исполнение методологии и четко её придерживаться всем коллективом.
    Ответ написан
    Комментировать
  • Чем синхронизировать папку в windows 10 с web-хостингом?

    @majstar_Zubr
    C++, C#, gamedev
    Можно через cygwin+bash как здесь

    Есть ещё winscphttps://winscp.net/eng/docs/scripting
    Ответ написан
    Комментировать
  • Какой паттерн использовать?

    @majstar_Zubr
    C++, C#, gamedev
    1) если применение паттерна порождает дублирование кода, то это значит, что паттерн выбран или применен неправильно

    2) вам следует ориентироваться не на какой-то там абстрактный паттерн, а на конкретное представление модели для конкретной задачи из конкретной предметной области; это решение может оказаться паттерном, а может оказаться группой паттернов, а может там вообще GoF паттернов не будет.

    3) в контексте данной задачи, проще всего декомпозировать её на две:
    - определить формат схемы
    - тривиально скрасить по заранее известной схеме

    Т. е. речь о фабрике схем.

    Речь о стратегии будет идти в том случае, если формат для каждого файла будет меняться в рантайме

    И

    при этом, в рантайме нет возможности ни отметить формат внутри файла, ни контролировать соблюдение инварианта формата.
    Ответ написан
    Комментировать
  • Gitlab CI старт только по тегу, но разный пайп на каждую ветку, как?

    @majstar_Zubr
    C++, C#, gamedev
    Для такой задачи нужно транслировать условия, задаваемые с помощью only и except, используя двойные отрицания.

    https://gitlab.com/gitlab-org/gitlab-foss/issues/2...
    Ответ написан
    Комментировать
  • Как делать сложные запросы используя репозитории и объединение разных таблиц?

    @majstar_Zubr
    C++, C#, gamedev
    Можно использовать представления со стороны БД, либо фабрики хранилищ со стороны кода.
    Модно сначала просто статически запечь в отдельный класс, если это действительно узкое место. Если паттерн себя проявит, то можно оформить в виде фабрики.

    Вон в C# в Entity Framework почти как вы сказали, только там запрос конструируется из коллекций классов, которые умеют в маппинг конкретной предметной области. Но там на выходе уже полноценная ORM с оптимизациями типа отложенного запроса к БД: технология Linq-To-Entity реализует реляционную логику, так что громоздкий SQL запрос модно отложить до самого последнего момента.
    Ответ написан
    Комментировать
  • Что в сленге означает "замапить"?

    @majstar_Zubr
    C++, C#, gamedev
    Это англицизм-синоним слову "отобразить". Но обычно относится к смыслу "сопоставление значений".

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

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

    Трансляция - процесс передачи из одного контекста со своей терминологией в другой контекст со своей терминологией. Если информация в одном контексте кодируется определённым набором символов, то в процессе трансляции построится абстрактное синтаксическое дерево для контекста А, потом оно будет по каким-то правилам отображаться в АСД для контекста Б, по которому будет сконструирована
    новая форма отображения информации, но уже в терминах контекста Б.

    Если вместо трансляции произвести "маппинг", то у нас информация в контексте А будет разбита на куски, информация в контексте Б будет разбита на куски, и маппинг выдаст нам набор стрелочек вида кусок А-> кусок Б.

    Маппинг - это всегда про значения. Значения кодов клавиатуры символам или функциям, enum и все задачи, в которых вы используете key-value storage и т.д. и т.п.
    Ответ написан
    Комментировать
  • Мультиплеер для уже созданой игры?

    @majstar_Zubr
    C++, C#, gamedev
    Если все самому делать, то нужно быть знакомым с методами отладки и архитектурными шаблонами многопоточных приложений; четко понимать архитектуру игровых движков - потому что её нужно будет ломать и пересобирать для мультиплеера, даже если это splitscreen / hotseat; сечь в сетевом взаимодействии: и интерфейсы, и устройство библиотек (на C); C/C++ и Java interop.
    Ну, и конечно же, методики борьбы с сетевыми задержками, реконнектами.

    Если организация мультиплеера централизованная, то дополнительно надо бы мета-гейм оформить, методики организации античитов, определиться с алгоритмом подбора, выработать стратегию горизонтального масштабирования, разбираться в Kubernetes и кластерищации БД.

    А все те решения "на базе" рассчитаны на клиентов на той же "базе", потому что поставлять серийно решения вышеперечисленных вопросов для совсем кастомного кода невозможно.
    Ответ написан
    Комментировать
  • Как разделить нажатие стрелок и нажатие русских букв?

    @majstar_Zubr
    C++, C#, gamedev
    Вам не нужна getch, не пользуйтесь ей.

    https://docs.microsoft.com/en-us/cpp/c-runtime-lib...

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

    Но всё уже придумано, попробуйте _getwchar
    https://docs.microsoft.com/en-us/cpp/c-runtime-lib...
    Ответ написан
    Комментировать
  • Как сделать иерархию классов?

    @majstar_Zubr
    C++, C#, gamedev
    Поднимите свойство в класс-родитель.
    Сделайте виртуальные методы в родителе bool Damage( int damagPoints ), bool Heal (int healthPoints).

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

    Если хотите сделать некоторых конкретных Enemy с особыми свойствами, то сделайте реализации инвариантов также виртуальными. Допустим Slug получает 50% урона и только чётный урон.

    Тогда например Slug:

    new public bool Damage( int damagePoints )
    {
        if (isDamageAcceptable(damagePoints))
        {
            int appliedDamage = Math.Ceiling(damagePoints/2);
            TakeDamage(appliedDamage);
        }
        return isDamageAcceptable(damagePoints);
    }
    
     new protected bool isDamageAcceptable( int damagePoints) => (damagePoints > 0) && (0==damagePoints%2) );


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

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

    Если речь о том, что у не у всех задуманных Enemy может быть здоровье, то вам нужно либо менять модель отношения классов и пересмотреть абстракции, либо использовать композицию вместо наследования.
    Ответ написан
    Комментировать
  • Game-dev путь. Что мне делать?

    @majstar_Zubr
    C++, C#, gamedev
    У вас должна быть цель стать профессионалом в области. Потому что только профессионал может выбирать, с кем работать, где работать, над чем работать - над крупными проектами для правительств, над банковским софтом, над веб-проектами или над играми.

    Вот это будет правильная установка. А что учить и в каком порядке вам никто не скажет, потому что требования меняются, возможности устроится на работу у всех разные, неизменно только одно - желательно знать все и вчера. Именно с этой установкой рисуются абстрактные Programming paths, но толку от них не будет никакого, если вы не сможете обобщать знания и не будете постоянно работать над строительством своего дерева знаний. Главное - пополнять свои знания концепциями, из которых потому выводятся базовые шаблоны, шаблоны проектирования, а из них, в свою очередь, архитектурные шаблоны, методология разработки, и непосредственно связь с рынком, экономикой, психологией и прочим, и так далее. И эти концепции не только в книгах по разработке ПО, их много в теор вере, дискретной математике, физике, которые дождаться в голову только в процессе получения высшего образования, системно.

    Любовь к учению - единственное, что может поддерживать на пути, потому что путь очень долгий. Многое будет непонятно и с первого раза, и со второго. Иногда и с третьего, потому что вы на самом деле не поняли базовые вещи. Или выбрали неправильную книгу. Или начали читать правильную книгу слишком рано. А узнаете вы расхождение между объективным знанием и собственным все равно не раньше, чем столкнетесь с проблемой на практике. А по-другому никак.

    Что вы можете сейчас сделать - взять прицел. Конкретно сформулируйте профессию и специализацию. Оптимизируйте процесс полученния знаний: как бы не ругали образование в ВУЗах СНГ, все же это нехилая экономия времени, если вы сразу будете получать профильное образование.

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

    А на самом деле надо. Вы должны получать удовольствие от получения знаний, потому что иначе вы не сможете сделать игры, которые могли бы приносить новый опыт игрокам. Чтобы транслировать новый опыт через генераторы опыта - игры - нужно уметь и любить этот опыт (субъективный и эмоциональный) получать, и представлять, как его давать людям. Разработка игр - всего лишь автоматизация этого процесса.

    Так что, запасайтесь попкорном и начните с языка Си. Освойте структурное программирование. Алгоритмы, структуры данных. Архитектуру компьютера, ОС. Не торопитесь как можно быстрее неправильно понять как можно больше вещей за кратчайший промежуток времени. Перечитывание и практикуете, пока не станет понятно так, что сможете научить кого-нибудь другого. Макконнелл, Роберт Мартин, Кент Бек, Эрик Эванс, Мартин Фаулер + 1 год дополнительного быдлокодинга на java и c# и c++ и у вас появится понимание ООП, ФП, типовые устройства моделей памяти и сборщиков мусора. Ещё за год научитесь писать настоящий ООП код, читать чужой код, даже если он написан в процедурно-макаронном стиле как книгу. Но надо ли вам эти три скучных года, потерянных полностью для личной жизни? Не проще ли получить solid knowledge и постепенно получать практику в среде опытных специалистов?

    Подытожу: становитесь профессионалом, на это у вас уйдёт ~10 лет после введения привычки учится в свободное время. Периодически смотрите на требования вакансий и составляйте себе древо знаний, которое хотите получить.
    Ответ написан
    Комментировать
  • Какую книгу выбрать?

    @majstar_Zubr
    C++, C#, gamedev
    Архитектуру компьютера будете читать месяц минимум, поскольку там немножко обо всем, к примеру, то, что преподаётся в ВУЗах в курсе по цифровым и микропроцессорным устройствам на протяжении семестра в книге преподносится в объёме одной главы.

    Для полноценного вникания в предмет потребуется дополнительные источники, т.к. в книге все очень сжато объясняется.

    Если у вас нет цели получить полное представление И если у вас нет технического бэкграунда И если вы не хотите тратить на понимание написанного в книге от месяца и более, то я не рекомендую читать архитектуру компьютера.

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

    Конечно, при чтении можно главы пропускать, и абзацы пропускать, но если цель просто получить представление - берите любую другую кроме "Архитектуры компьютера".
    Ответ написан
    1 комментарий
  • Почему переопределение в C# работает так?

    @majstar_Zubr
    C++, C#, gamedev
    public class Class2
        {
            public string GetVal(int a, int b)
            {
                return "base";
            }
    
            public override string ToString()
            {
                return "_Class2_";
            }
        }


    public class Class3 : Class2
        {
    
            
            public string GetVal(int a, int b, bool defaultpar = true)
            {
                return "child with bool";
            }
    
            public new string GetVal(int a, int b)
            {
                return "child";
            }
    
            public override string ToString()
            {
                return "_Class3_";
            }
        }


    class Program
        {
            static void Main(string[] args)
            {
                Class2 obj_reference_c2 = new Class2();
                Class3 obj_reference_c3 = new Class3();
                Class2 obj_reference_assigned = obj_reference_c3;
                Class2 obj_reference_casted = (Class2)obj_reference_c3;
    
                Console.WriteLine($"Вызов - {obj_reference_c2} c параметрами 1, 2 : {obj_reference_c2.GetVal(1, 2)}");
                Console.WriteLine($"Вызов - {obj_reference_c3} c параметрами 1, 2 : {obj_reference_c3.GetVal(1, 2)}");
                Console.WriteLine($"Вызов {obj_reference_c3} c параметрами 1, 2 true: {obj_reference_c3.GetVal(1, 2, true)}");
    
                Console.WriteLine($"Вызов Class3 присвоенного по ссылке типа Class2 - {obj_reference_assigned} c параметрами 1, 2: {obj_reference_assigned.GetVal(1, 2)}");
                Console.WriteLine($"Вызов Class3 приведенного к типу Class2 - {obj_reference_casted} c параметрами 1, 2: {obj_reference_casted.GetVal(1, 2)}");
    
                /*      
                Вариант 1: в Class3 метод public string GetVal(int a, int b) {return "child";} закомментирован
    
                    Вызов - _Class2_ c параметрами 1, 2 : base
                    Вызов - _Class3_ c параметрами 1, 2 : child with bool
                    Вызов _Class3_ c параметрами 1, 2 true: child with bool
                    Вызов Class3 присвоенного по ссылке типа Class2 - _Class3_ c параметрами 1, 2: base
                    Вызов Class3 приведенного к типу Class2 - _Class3_ c параметрами 1, 2: base
    
                 */
    
                /*
                  Вариант 2: в Class3 метод public string GetVal(int a, int b) {return "child";} существует и прячет унаследованный член Class2.GetVal(int,int)
                
                    Вызов - _Class2_ c параметрами 1, 2 : base
                    Вызов - _Class3_ c параметрами 1, 2 : child
                    Вызов _Class3_ c параметрами 1, 2 true: child with bool
                    Вызов Class3 присвоенного по ссылке типа Class2 - _Class3_ c параметрами 1, 2: base
                    Вызов Class3 приведенного к типу Class2 - _Class3_ c параметрами 1, 2: base
    
                    в подобном случае требуется явно указывать в объявлении модификатор new:
                       public new string GetVal(int a, int b) {return "child";}
                 */
                Console.ReadLine();
            }
        }


    В вашем примере 1 не происходит перегрузка метода базового класса.
    Метод базового класса можно перекрыть ( public new string Foo() ) или переопределить, если базовый метод виртуальный.

    Перегруженные методы существуют только в одной области видимости, которая в C# ограничена классами.

    С точки зрения .Net, методы с сигнатурами string _ (int,int) и string _ (int,int,bool) разные, но синтаксически, в случае, если в методе string _ (int,int,bool) третий параметр снабжается параметром по умолчанию, не существует явного способа вызова, кроме Named Arguments.

    public class Class2
        {
            public string GetVal(int a, int b)
            {
                return "base";
            }
    
            public override string ToString()
            {
                return "_Class2_";
            }
        }
    
        public class Class3 : Class2
        {
            public new string GetVal(int a, int b)
            {
                return "child";
            }
    
            public string GetVal(int A, int B, bool defaultpar = true)
            {
                return "child with bool";
            }
    
            public override string ToString()
            {
                return "_Class3_";
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Class2 obj_reference_c2 = new Class2();
                Class3 obj_reference_c3 = new Class3();
                Class2 obj_reference_assigned = obj_reference_c3;
                Class2 obj_reference_casted = (Class2)obj_reference_c3;
    
                Console.WriteLine($"Вызов - {obj_reference_c2} c параметрами 1, 2 : {obj_reference_c2.GetVal(1, 2)}");
                Console.WriteLine($"Вызов - {obj_reference_c3} c параметрами 1, 2 : {obj_reference_c3.GetVal(1, 2)}");
                Console.WriteLine($"Вызов - {obj_reference_c3} c параметрами 1, 2 : {obj_reference_c3.GetVal(A:1, B:2)}");
                Console.WriteLine($"Вызов {obj_reference_c3} c параметрами 1, 2 true: {obj_reference_c3.GetVal(1, 2, true)}");
    
                Console.WriteLine($"Вызов Class3 присвоенного по ссылке типа Class2 - {obj_reference_assigned} c параметрами 1, 2: {obj_reference_assigned.GetVal(1, 2)}");
                Console.WriteLine($"Вызов Class3 приведенного к типу Class2 - {obj_reference_casted} c параметрами 1, 2: {obj_reference_casted.GetVal(1, 2)}");
    
                /*
                   
                Вариант 1Б: в Class3 метод public string GetVal(int a, int b) {return "child";} закомментирован
    
                    Вызов - _Class2_ c параметрами 1, 2 : base
                    Вызов - _Class3_ c параметрами 1, 2 : child with bool
                    Вызов - _Class3_ c параметрами 1, 2 : child with bool
                    Вызов _Class3_ c параметрами 1, 2 true: child with bool
                    Вызов Class3 присвоенного по ссылке типа Class2 - _Class3_ c параметрами 1, 2: base
                    Вызов Class3 приведенного к типу Class2 - _Class3_ c параметрами 1, 2: base
    
                 */
    
                /*
    
               Вариант 2Б: в Class3 метод public string GetVal(int a, int b) {return "child";} существует и прячет базовый
    
                    Вызов - _Class2_ c параметрами 1, 2 : base
                    Вызов - _Class3_ c параметрами 1, 2 : child
                    Вызов - _Class3_ c параметрами 1, 2 : child with bool
                    Вызов _Class3_ c параметрами 1, 2 true: child with bool
                    Вызов Class3 присвоенного по ссылке типа Class2 - _Class3_ c параметрами 1, 2: base
                    Вызов Class3 приведенного к типу Class2 - _Class3_ c параметрами 1, 2: base
    
                */
    
                Console.ReadLine();
            }
        }


    Данный пример не очень показателен с точки зрения использования named arguments.
    Для этого потребуется несколько аргументов со значениями по умолчанию.

    Хотя я рекомендую никогда не использовать значения по умолчанию, вместо этого стоит делать SOLID классы со специализированными методами и понятным API, а named arguments позволяют фривольно писать код в отрыве от порядка аргументов в сигнатуре, хоть задом наперед: c.GetVal( defaultpar: false, B: 42, A: 777);
    Ответ написан
    1 комментарий
  • Нормально ли для программиста быть трудоголиком, любить рутину, иногда быть уставшим и тупить от этого?

    @majstar_Zubr
    C++, C#, gamedev
    Предлагаю обобщить проблемы в одну и решить её.

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

    Вам нужно привить себе привычку жёсткого ограничения времени на любую задачу.

    Мытьё посуды, ремонт чего-то, чтение книги, кода, контрибуция в пет/опенсорс проект, семья - для всего нужно ввести правило, уделять не менее N времени в день/неделю/месяц.

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

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

    Производительность и занятость часто путают с продуктивостью и результативностью, и если вам очевидны симптомы того, что вы часто путаете первое со вторым, то значит пришло время остановится и:

    1) вернуться к азам - перечитать основополагающие для вас книги, например, для меня это Совершенный код, Экстремальное программирование и Тайм-менеджмент для системных администраторов; если есть подозрения, что вместо паттерна вы используете антипаттерн, то пришло время для тотальной работы над ошибками;

    2) начать записывать каждое решение задачи за день, самое важное - указывать время начала и время конца, если вы не ведёте ежедневник (в любом виде, достаточно весьма обобщенного лога деятельности за день);

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

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

    Проблема зарывания в работу/задачу решается введением строгого ограничения на продолжительность работы. Поставьте на своем смартфоне беззвучные и без вибраций будильники с перерывами в час+8 минут со смещением 5 минут к последующему будильнику. Позже оптимизируете под себя, просто важно ввести привычку поставить все на паузу, выкинуть из головы все на бумагу или в текстовый файл и 5 минут подышать свежим воздухом, выпить чаю, etc.

    Проблема с жадностью выделения времени на оптимизацию работы решается обычным счётчиком 1-2-3. Если вы столкнулись с проблемой третий раз, то вы отдаете себе отчёт, что налицо закономерность, и поскольку математически доказано, что оптимизация сейчас сэкономит время, то вы спокойно в ежедневнике выделяет время на сегодня на оптимизацию.

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

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

    Для того, чтобы не перерабатывать, нужно делать лишь самое необходимое именно сейчас, чтобы брать как можно меньше рисков в текущий момент, откладывать принятие решений на как можно поздний срок - но тут надо уметь называть вещи своими именами - одно дело, когда вы избегаете риска, другое дело, когда вы избегаете ответственности. Если у вас нет ограничения по времени, что ещё может заставить вас попросить помощи или начать работу над ошибками, валидировать свои знания, привычки самого себя?

    Ограничение по вермени - самый мощный инструмент, с помощью которого можно обрести дисциплинированность и решать любые организационные проблемы в личной ежедневной деятельности.
    Ответ написан
    Комментировать
  • Что представляет собой движок в игровой разработке?

    @majstar_Zubr
    C++, C#, gamedev
    В широком смысле движком в игровой разработке называют набор ПО и утилит, которые как могут быть представлены в виде одного комбайна в случае Unity, Unreal Engine, CryEngine, так и набора разных ПО и утилит, результаты работы которых компонуются вместе с помощью игровых библиотек и фреймворков таким образом, что получается игра.

    В узком смысле, игровым движком называют ту часть ПО, которая
    1) комбинирует мультимедиа ресурсы
    2) скрипты игровой логики
    3) скрипты всякой бизнес логики (аналитика например)
    И самое главное - 4) контроллер ввода и 5) вывод результирующего кадра игры.

    Если платформа некий комп с некой операционной системой, то фактически движок это ПО, которое запускается на нем и полностью все вышеперечисленное делает. Сюда входят ПК, консоли, смартфоны, игровые портативные устройства, и даже Brick Game и "Ну, погоди", в которой волк яйца ловит.

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

    Если платформа мессенджер или терминал, то от движка там практически ничего, кроме игровой логики нет.

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

    Игровые движки-комбайны могут все, или, если исходный код закрыт - то почти всё. Специализированные игровые движки могут все, что нужно в пределах специализации на жанре. Разница обычно в GUI, API, языке реализации, направленности на платформу и лицензии использования (которую, между прочим, можно обсудить в частном порядке)
    Ответ написан
    Комментировать