Ответы пользователя по тегу C#
  • Как (с помощью чего) определить четкость фото и "черные" фото?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Однотонные изображения элементарно отсеивается средне-квадратичным.

    Четкость зависит от множества факторов. Однако есть вариант с градиентами: они "должны" иметь распределение с пологими границами. Можете погуглить что-нибудь такое, вроде даже на хабре было. ЕМНИП, этот метод крайне эффективен, однако есть способ и попроще - банальное преобразование Фурье. В случае размытого изображения оно должно быть более плавным и иметь низкий сигнал на высоких частотах.
    Ответ написан
    Комментировать
  • Как запускать код на python из c#?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Если IronPython не интересует, то потенциально есть три способа.

    1. Можно вызывать python.dll и управлять состоянием интерпретатора дёргая определённые функции. Это не самый простой способ и почти наверняка потребует собственной сборки пайтона, однако имеет некоторые преимущества. Одно из них - наивысшая скорость, так как всё происходит в одном пространстве имён. И полноценный контроль интерпретатора, только разобраться в реализации. Однако есть множество проблем, которые придётся решить: GIL, контроль состояния, входные данные и сбор результатов вычислений.

    2. Можно вызывать python.exe и передавать состояние косвенно (stdout/stdin, socket, shared memory), перебрасывая объекты через примитивы, например, этим. Однако, из сложностей, придётся написать горстку кода на python и быть готовым к ограничениям. Здесь также и упомянутые longclaps микросервисы.

    Но если IronPython вызывает интерес, то можно на .NET реализовать всё необходимое, или же использовать готовое. На самом деле, здесь даже немного приветливее смотрится тот же F#, да и вообще платформа у мелкомягких во многом поразительна.
    Ответ написан
    2 комментария
  • Какие плюсы и минусы у ЯП C#?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Да откуда вы только лезете? Да, у всего есть плюсы и минусы. Если пишут что-то положительное, значит наверняка так оно и есть. Если пишут что-то негативное, вполне вероятно это имеет место быть.

    Да откуда всё ползёте и ползёте? Да, это только инструмент, но если инструмент называется языком программирования общего назначения, то соответственно сравнение с узкоспециализированными штангенциркулями и газовыми ключами как минимум некорректно. Это не verilog или brainfuck. Это C#.

    C# имеет статическую типизацию. Очень приятную и удобную, одну из лучших, ИМХО. Лучше только haskell, но вопрос не об этом. Типизация с метаинформацией и отменной рефлексией, можно писать программу пока пишешь программу, xzibit одобряет. У него потрясающая экосистема, лучшего я пока не встречал, говорят у руби с гемами лучше, но как-то не уверен. Шикарнейшая реализация пространства имён, а также возможность размазать класс по файлам - бесценно, для остального есть Core i7. Что ещё нужно? Производительность? Мимо. Свободность? Промазали. Портативность? Как бы не так. Логичность, читай отсутствие костылей? Эх... Если бы. Лаконичность? Чёрт, не помешало бы!

    Короче. Это потрясающий инструмент со своими недостатками. Да, он лаконичнее, чем C++, но python и ruby поставят выскочку на место, да даже F# поинтереснее будет. Да, он побыстрее python, но даже Java иногда начинает опережать, что уж говорить про С++. В общем и целом, часто выбор обусловлен не собственным желанием, а окружающими условиями, но чисто с эстетической точки зрения C# очень приятный и удобный, есть классные generics, и удобные lambdas, и потрясные extensions, так тут ещё и dynamic для всяких наркоманов привезли, а если очень хочется, то можно и в игры или даже движки.
    Ответ написан
    Комментировать
  • Как сделать настоящую планетную гравитацию в Unity?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Здраствуйте. Я, Кирилл. Хотел бы чтобы вы сделали игру, 3Д-экшон суть такова… Пользователь может играть лесными эльфами, охраной дворца и злодеем. И если пользователь играет эльфами то эльфы в лесу, домики деревяные набигают солдаты дворца и злодеи. Можно грабить корованы…


    Делаем много мешей (планета в форме шара, игрока и прочее), добавляем им примерно такой скрипт:
    class Gravity : MonoBehaviou {
        static const double G = 9.8; // correct constant here
    
        static LinkedList<Gravity> meshes = new LinkedList<Gravity>();
    
        float Mass {
            get {
                return GetComponent<Rigidbody>().mass;
            }
        }
    
        void Start() {
            meshes.add(this);
        }
    
        void Update() {
            foreach(var mesh in meshes) {
                float power = (float)(G*Mass*mesh.mass);
                var force = power*(mesh.transform.position - transform.position).normalized;
                force /= (mesh.transform.position - transform.position).sqrMagnitude;
                GetComponent<Rigidbody>().AddForce(force);
            }
        }
    }


    Горизонтальность оставим в качестве домашнего задания. Подсказка - нужно повернуть меш игрока так, чтобы он был сонаправлен с вектором земля-игрок.
    Ответ написан
    2 комментария
  • Как заменить картинку в unity?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    3 комментария
  • На каком языке будет быстрее парсить?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Когда речь идёт об обработке удалённых ресурсов критически важным становится стабильность и качество соединения, его производительность, а также производительность удалённых ресурсов. Если реализовать на Си максимально эффективный парсер сайта, который будет жевать его, допустим, за 1мс и точно такой же на каком-нибудь жирнющем пайтоне, у которого на обработку уйдёт, допустим, 15мс, очевидно эти числа ничто по сравнению со временем, которое будет затрачено на подключению и загрузку требуемого документа: 100мс на подключение, 1мб/10мбпс, итого 200мс только на то, чтобы получить документ, который может ещё с ошибками приехать или не не приехать вовсе, а удалённому серверу ещё и время потребуется, чтобы его обработать.

    Итого важным становиться максимально асинхронная работа с загрузкой документа, а его обработка может занимать столько же, сколько идёт загрузка, ибо оная является узким горлом быстрее которого обработать не получится. Некоторым выходом может быть запуск параллельных процессов (потоков) на различные ресурсы, но злоупотреблять этим не стоит, так как ваш канал не резиновый и качество соединения может во много раз упасть, да и у системы есть серьёзные ограничения на количество одновременных соединений.
    Ответ написан
    2 комментария
  • Смысл дефолтного namespace?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Это ограничение C# и её объектной модели. Каждый класс должен быть определён в пространстве имён (чёрт, ну русский же есть!), как его называть - ваше право. Необходим он, чтобы избежать коллизии имён. Причина по которой создаётся пространство имён по умолчанию очень проста - изменять стороннее пространство имён вне своих приложение/библиотек вы никак не можете, но и без оного код никак не соберётся в исполняемую кучу.

    UPD. Вообще говоря, если не указывать namespace, то его принято называть assembly. И это не самая правильная практика.
    Ответ написан
    Комментировать
  • Что необходимо знать программисту геймплея в видеоиграх?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    tl;dr В порядке убывания релевантности: Любой, Unity (JS/C#), Web (PHP/JS), Other (Python/Lua/C++/...)

    Программист геймплея... Программист геймплея! Геймплея, Карл!

    Что за? Что это за зверь вообще? Не могу знать, не могу понять.

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

    Конечно, можно делать на от@$%, однако это не путь, это так... Хлеб. Возможно. Но мы вообще не об этом сейчас. Тут надо сказать, что разработка игр очень хорошо распределена по ролям. Именно что благодаря своей монструозности становится возможным элементарное делегирование задач. Но и тут возникают большие сложности.

    Есть два типа людей. Одни просто берут и е#$%. Они не думают о потраченном времени, не думают о структурах данных, просто берут. И делают. Классно быть ими, я, к сожалению, не такой. Однако с обратной стороны игры выходят багованными, ужасно медленными (2D платформер официально требующий 2Гб RAM и два ядра, WUT?), но зато проработанный геймплей увлекает и затягивает. А есть люди, которые сначала десять лет думают, а потом пишут одну строчку кода, которая максимально быстрая и эффективная и на ней держится половина всей игры... Однако таких строк надо пара тысяч, а со временем возникает такая лапша зависимостей, которая убивает любое масштабирование. Конечно, надо делать как-то средне.

    Но в тоже время, в таких заголовках как World of Warcraft уже чувствуется не только эпичность и масштабность, но и почти неограниченные ресурсы: всё равно существует пачка багов, которые не закрываются годами. Про них все всё знают, в Интернетах по дцать вариантов обойти оные, но... Они есть!

    К чему я это? К тому, что независимо от инструмента можно сделать игру. Независимо, хоть на голом C# с managed directx (terraria), хоть на жирнющем python (eve), хоть на хардкорных плюсах (doom), в любом случае результат зависит от профессионализма.

    А вам же... Скорее всего хочется в идеи. Но идеи... Они ни#$% не стоят. И уж работая на дядю последнее, что вам придётся - это придумывать геймплей. Причём в небольших компаниях придумывать-то в общем-то нечего, а экономические f2p игры и вовсе прорабатываются отдельными гейм-дизайнерами во всевозможных екселях.

    И единственный выход, вроде бы, делать всё самому (или небольшой кучкой людей), однако раз уж этот вопрос был задан, значит вряд ли у вас что-то получится. Хотя, как знать. Удачи.
    Ответ написан
    Комментировать
  • Можно ли на знаниях С++ ориентироваться и кодить в Unity пока не изучу С#?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Так-с. Дайте-ка подумать. Гравитация, сильное взаимодействие, слабое взаимодействие, третий закон Ньютона, преобразования Лоренца, квантовая неопределённость, стандартная модель... Эм, не знаю в общем никаких физических законов, которые не позволили бы изучать какую-либо технологию в процессе работы с ней. Даже более того, это единственный эффективный способ начать её изучать.

    Си++, C#, Java, Python, JavaScript... Да как вы надоели с этой хренью, честно. Никто не удивится, если ты понятия не имеешь, что такое рефлексия, зачем нужны лямбда-функции, почему так много споров о сборщике мусора. И тем более такие мелочи, как порядок инициализации или особенности области видимости в VC++98. Вопрос не то, чтобы плохой. Он глупый и неправильный. Unity это про иерархию объектов на сцене, их менеджемент, операции с матрицами, работа с графикой в реальном времени, однако, в основном - это про то, как перетащить объект из ассетов на сцену и поколдовать над его свойствами. Unity это про стейт-машины и формальную логику (например, предикаты), UI/UX и оптимальное программирование, но в большей степени это артисты рисующие модельки, текстуры и спрайты, озвучивающие и анимирующие их. Наконец, надо разбираться в предметной области в сфере, по которой создаётся игра, но для хэлоу ворлдов хватит и восьмого класса.

    Так что хватит загрязнять тостер с этой фигнёй. Тут очень слабое ранжирование хороших вопросов в отличии от stackoverflow, таких вопросов уже тьма задавали. Хватит!
    Ответ написан
    5 комментариев
  • Как создать песок в unity3d?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ну чувак, ты в конструкторы переиграл видимо, раз уже не интересно подобным заниматься. Чего ты хочешь? Создать игру и заработать мильён? Создать игру и заработать почёт? Или создать игру и выразить свои мысли? Не бойся, неправильных ответов нет, но стоит определится с ответом, так как он действительно важен.

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

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

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

    В общем, удачи в начинаниях.
    Ответ написан
    Комментировать
  • Для чего нужно virtual/override?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ахтунг, товарищ. Перед тем как сомневаться в профессионализме своих коллег очень советую хотя бы немного сомневаться в собственном. Это как минимум изредка полезно. А теперь ноги в руки и вперёд читать про таблицы, виртуальность и методы. Это не просто полезно, но архиважно. Учитывая, собственно, вопрос.

    А вопрос состоял в следующем. Вот у нас есть объекты, друг от друга наследуются, имплементируются и всё круто-прекрасно, но блджад. Зачем они нужны-то? Нет, не агрегация данных, хотя и она тоже. Нет, не агрегация реализации, хотя и она тоже. И нет, нет, не просто потому что. Хотя и это тоже... А вот подумай о такой ситуации. Есть библиотека. Да не важно какая, ну пусть это будет UI/UX. Вот есть абстрактный (!) класс кнопка. Почему абстрактный? Да потому что любая кнопка - это кнопка. Это как бы класс над классом. Кнопка может быть красной, может быть кликабельной, может становится не кликабельной после нажатия, может открывать диалог выбора файлов, а может закрывать приложение к чертям. В общем, много чего может уметь делать кнопка. И вот эту кнопку хочется поставить на формочку. И сделал создатель библиотеки такой прекрасный метод у формы PutAnyButtonHere(Button btn, Point xy). Но... Чёрт, чувак, мы должны передать объект класса Button, а у нас какой-нибудь наследник MyBestButton : BestAbstractLibraryButton, который наследник той самой Button. И у Button декларирован такой прекрасный метод TimeWhenUserClickOnMe(Point xy, AnotherInfo somethinElse), собственно... Получается, что где-то в недрах той самой библиотеки, когда автор прекрасной UI/UX библиотеки вызывает этот самый метод он должен вызвать НАШУ реализацию, а не реализацию BestAbstractLibraryButton. И уж точно не несуществующую реализацию Button (ибо метод там чисто-виртуальный). Идея виртуальных методов изначально именно в том, что есть особая таблица, которая хранит реализации отдельно, объекты отдельно, но когда мы пытаемся вызывать у объекта виртуальный метод происходит такая магия, которую принято называть поздним связыванием.

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

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

    Отсебятина. Не понимая данных вещей невозможно говорить, что принципы объектно-ориентированного программирования были усвоены. Советую прочитать "Философия Java" (вообще там Java скорее как язык для примеров, в общем-то ООП оно и в Африке ООП). Ну и пытаться разобраться в точке зрения любого человека, особенно если его компетенция хоть чем-то подтверждена (например, успешным трудоустройством).
    Ответ написан
    Комментировать
  • Как сделать одинаковую силу прыжка в unity?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    GetComponent<Rigidbody>().velocity += new Vector(0, jumpPower); // зависит от оси, по которой прыгаем


    Впрочем, при применении AddForce по сути происходит всё тоже самое, только делится на массу (второй закон Ньютона). Поэтому проблема скорее в бесконечных прыжках. Можно сделать небольшой тайм-аут на прыжок, чтобы ограничить скорость роста.
    Ответ написан
    2 комментария
  • AddForse без Gravity возможен?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    А почему, собственно, и нет?
    Ответ написан
    Комментировать
  • Как написать в виде кода вопрос "Когда данный объект пересекает Waypoint(он у меня назван first_cp)"?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Не понял, что надо... Кто с чем взаимодействует (коллайдит)? Какова логика процесса?

    Если надо в случае выхода за трассу сбрасывать на последний чекпоинт, то сначала надо эти чекпоинты где-то сохранять (можно в статик поле ссылку на объект просто хранить), а когда вылез за меш - приравнивать transform.position и transform.localRotation объекта машины соответственным свойствам чекпоинта.
    Ответ написан
    6 комментариев
  • Кто знает C# opensource проекты с хорошей архитектурой?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    1 комментарий
  • Серверные языки - как не запутаться и что изучить?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Не пишите чушь! Серверные языки? WTF?!? Ду ю спик инглиш, блджад!?

    Во-первых, любой, совершенно любой язык программирования может быть использован в качестве генератора html-вёрстки. Да тут и на brainfuck можно делать, да на чём угодно можно, что умеет делать вывод в stdout: пихаем на cgi и всё работает. Вопрос в юзабельности пролога на cgi остаётся открытым, но техническая возможность такая есть.

    Во-вторых, сравнивать фреймворк с языком программирования общего назначения... Ну убейте меня лучше. C# vs RoR? Ну ясень зуй - C#. На нём можно хоть игры писать, хоть на GPU считать, хоть странички рендерить (не совсем корректно, но можно посчитать и небольшой погрешностью на фоне безобразия в вопросе) и всё это на кроссплатформе (visual/mono). Тогда как на RoR можно... Только странички рендерить. Нет, конечно некоторым и на потолке спать удобно, но Rails - это фреймворк для Ruby, то есть набор библиотек, предназначенных для быстрого и удобного поднятия интернет-магазинов ;) А шарп - язык общего назначения.

    И наконец, смысла браться за все направления - конкретно вам - нет никакого. Более того, смысла вообще браться за программирования - конкретно вам - невелик. Покуда задаются такие вопросы... Не, бросьте эту идею. Лучше идите в колледж фрезеровщиков, а потом за станок. ЗП 50к (2015 год) стабильно, но самое главное - жуткий дефицит кадров, ибо старые токари уже давно без пальцев, а протезов из Китая ещё не завезли. Там сразу после колледжа через выходную дверь открывается магический портал на завод, едва ли не в прямом смысле слова.
    Ответ написан
    7 комментариев
  • Как объединить и разъединить byte[]?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Строки можно писать нуль-терминированные. Сначала
    System.Text.Encoding.Unicode.GetBytes(str + "\0");
    после Array.CopyTo, а обратное преобразование -
    do {/*сейчас текст*/} while (str[i] != 0);
    /*теперь остальное*/

    Не забываем про кодировку. А чтобы было красиво, стоит послушаться Александр Зайцев и реализовать ISerializable.
    Ответ написан
    2 комментария
  • Область применения C, C++, C#?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ну ничего себе. C++ только на ПК? Серьёзно?

    Android, iOS (тот же Си, только сбоку), web. Вообще, на Си почти всё вокруг, всё что незаметно (и чуть больше) - это Си. Или Си++. Или Objective C. Ну а C# - это мелкомягкие, они его продвигают. Очень. Вся экосистема на C# завязана. Включая Windows Phone.

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

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ха. Ха ха. Ха ха ха. А как, простите, они сравниваться будут? На логической схеме диска? Ну можно читать по четыре байта (если речь идёт об int), обращаться как к int'у, сравнивать и записывать если одинаковые, передвигаясь дальше, иначе наибольшее оставляем.
    Ответ написан
  • Как перехватить сигнал с видеокарты?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ну и какой мы хотим сигнал перехватить? Экран? Для этого есть фрейм граберы. А можно подключить композит и отдельной платой собирать аналог. Да и цифровой HDMI пусть и передаёт цифру, таки физика всё равно остаётся - снимаем напряжение и дело в шляпе, разве только делать это придётся очень быстро, да ещё и ошибки корректировать. Из софта можно хукнуть directx или opengl, но там скорее всего не будет шейдеров - издержки конвейера, или же создать виртуальный монитор, но здесь сложности с аппаратным ускорением. Есть более специализированные методы, вроде отслеживания участка памяти или общение с видеокартой посредством одного из множества API. Но эти способы очень платформозависимые.
    Ответ написан
    9 комментариев