Ответы пользователя по тегу C#
  • Как по массиву точкек нарисовать круг WPF? Из миллиона точек?

    @AlexHell
    Зачем вызывается перерисовка элемента каждый раз с нуля. Если 99.9999999% его содержало не изменилось.

    если вы думаете об оптимизациях, которые вам точно нужны (вы замерили, решили что долго) то следует юзать кеширование, скажем в RenderTexture (обычно таки фреймворки графические ее поддерживают), т.е рендерите ваш очень тяжелый объект (что там SVG из миллиона полигонов у вас, не иначе?), а потом каждый фрейм только выводите содержимое из всех своих закешенных RenderTexture в экранный буфер (я рассказываю на низком уровне как)

    .. если же у вас вопрос - почему они перерисовывают треугольники \ круги \ полигоны (легкие) - потому что это просто реализовать (и код простой) и быстро происходит (т.к. не тяжелая графика), а хранение RenderTexture на каждый элемент это потребление памяти (мегабайты допустим на каждый, но зависит от размера экрана и\или размера элемента), плюс усложнение кода (когда перерендеривать целиком обеъкт в RenderTexture, сам код вывода из RenderTexture в экран) или воспользоваться чемто готовым - но это тоже усложнения так и так по сравнению с рендером каждый фрейм всего что надо в экранный буфер
    Ответ написан
  • Как оптимизировать рендеринг?

    @AlexHell
    в винде давным давно есть оптимизация для GUI как раз - перерендеринг (инвалидация) только отдельных изменившихся элементов, скажем одно текстовое поле перерендерится (и CPU и GPU), а потом прилепляется к закешированной текстуре (где все остальные неизмененные GUI)
    Ответ написан
    Комментировать
  • Как найти пустое место на воде в 2d?

    @AlexHell
    простое решение - цикл перебора рандомных варинтов X
    // ВНЕ цикла подбора рандомного X для оптимизации
      foreach (GameObject enemy in enemies)
      {
        // заполнить _usedCoordX
      }
    // цикл подбора рандомного X
    while (true)
    {
      int x = Random.Range(1 - _minX, _maxX);
      if (!_usedCoordX.Contains(x)) break;
    }


    (НЕ эффективное по перфомансу, можно оптимизить - структурами Spatial или заполненными областями - не буду приводить реализации)

    ___
    UPDATE:

    там где _usedCoordX заполняется
    хорошо бы бить поле на GRID равномерный, аналог хеша
    ______
    |__|__|
    |__|__|

    например
    если позиция object.X >= 10 && object.X < 20 то newX=1
    если позиция object.X >= 20 && object.X < 30 то newX=2
    и т.п с шагом 10
    тогда при уже существующем объекте с X = 15, не сгенерится объект с X = 16 или 17 и т.п т.к они в одной ячейке сетки

    и Random конечно по той же размерности кидать (_maxX должен быть не полного пиксельного\объектого размера, а размера сетки)

    UPD2: по теме https://gamedev.stackexchange.com/questions/69310/...
    и там же есть картинка

    UPD3: вместо равномерного GRID - можно юзать истинный Collision Detection, т.е после генерации Random X - проверять всех врагов вокруг, и если есть - генерить заного, так наверное лучше будет

    .. но опять же можно проверять по GRID-у всех в этой же ячейке (т.е если X равен 15, то проверим всех врагов - есть ли они в X от 10 до 19, и если нет - выход из цикла
    .. плюс проверять в соседних ячейках (иначе будут прям вплотную генериться
    Ответ написан
    Комментировать
  • Есть готовые OpenSource графический редакторы для чертежей и эл. схем на .NET?

    @AlexHell
    я попользовался гуглом за вас (сам с этими либами не работал)
    https://github.com/dataweb-GmbH/NShape/
    https://stackoverflow.com/questions/2005274/free-o...
    https://github.com/circuitdiagram/circuitdiagram
    dcjtech.info/topic/list-of-open-source-circuit-dia...

    Если происходит перемещение узла/линии/прямоугольника, то соединительные линии должны автоматически удлиняться, оставаясь при этом ломаными линиями.

    такой функционал не нашел circuitdiagram (онлайн редактор есть у него), возможно в какойто отдельной либе и есть, при желании пишется - гуглите алгоритмы
    Ответ написан
    Комментировать
  • Как оптимизировать анимации?

    @AlexHell
    я в WPF не шарю, мимо проходил
    есть опыт в Win Forms, Unity и сопутствующем
    может быть помогу чемто

    при каждом вызове метода с этой анимацией, создается обьект этой анимации, остается в памяти и там сидит до тех пор пока приложеине на закроется?

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

    вполне может быть что траблы с перформансом по таким причинам
    * ShowCard вызывается слишком часто, а этого кода вы не привели, вполне могут быть проблемы, например цикл из ShowCard или вызов его каждый такт (update или что там у вас в WPF)
    без защитного флага
    тогда когда надо сделать чтото в духе
    if (! isAnimPlayed)
    {
      isAnimPlayed = true;
      ShowCard ();
    }

    * слабый другой ПК, CPU \ GPU, уточняйте и тестите на аналогичных
    * много что модифицируется, т.е. window.cardQuestionBorder.RenderTransform это чтото большое и у него есть какието лишние потомки, и можно както разбить по-лучше
    Ответ написан
    6 комментариев
  • What layer should contain Queries in DDD?

    @AlexHell
    example with 2 types (Article and User):

    * InfrastructureLowLevel (know nothing about higher levels)
    - DatabaseImplementation
    - IQuery[TResult]
    .. can combine SQL for DB query, or invoke specific IRepository methods (override-able in IRepository)
    - IRepository[TQuery, TResult]
    methods:
    \ TResult GetSingleByQueiry(TQuery IQuery)
    \ List[TResult] GetMultiByQueiry(TQuery IQuery)
    .. invokes DatabaseImplementation
    .. invokes IQuery for specific actions - conditions by type

    * InfrastructureHighLevel (semi-domain, know about InfrastructureLowLevel):
    - Article
    - User
    - ArticleQuery : IQuery[Article]
    - UserQuery : IQuery[User]
    - ArticleRepository : IRepository[ArticleQuery, Article]
    - UserRepository : IRepository[UserQuery, User]

    * BisinessDomain (higher\highest level, know about InfrastructureHighLevel):
    - MyLogic
    usage:
    User user = UserRepository.GetSingleByQueiry(UserQuery)
    Article article = ArticleRepository.GetSingleByQueiry(ArticleQuery)
    Ответ написан
    Комментировать
  • NoSql vs Реляционные СУБД. Как правильно выбрать СУБД, чтобы потом не было мучительно больно?

    @AlexHell
    Юзайте SQL базу с которой знакомы, т.е можете конфиг настроить, подтюнить, производительность замерьте и все будет быстро. На счет NoSQL - вообще сомнительная наработка как по мне, все можно в SQL, с prepared statement если на парсинг SQL времени много (только по рез-там тестов).
    Ответ написан
    Комментировать
  • Как сделать рекурсивный бинарный поиск?

    @AlexHell
    смысл бинарного поиска это постепенное сдвигание границ, т.е [0, 10] интервал для array превращается в [0, 5] потом в [2, 5] потом в [4,5] потом проверяется элемент [4]

    За точность не гарантируюю, но то что пришло на ум
    public static int BinSearchLeftBorder(long[] array, long value, int left, int right)
    {
    if (left == right)
    {
    if (array[left] == value) return left;
    return -1;
    }

    var m = (left + right) / 2;
    if (array[m] < value)
    return BinSearchLeftBorder(array, value, m, right-1 );
    return BinSearchLeftBorder(array, value, left, m);
    }

    хотя на счет условия "индекс левой границы" помоему мой вариант, да и любой распространенный не гарантирует именно левое вхождение, индекс подберется как попадет, может и на среднюю 2ку из 3х двоек, поэтому надо еще возможно крутануть дополнительный бин поиск в левую сторону, или как-то иначе строить алгоритм

    для вашего примера с 2 прямо по середине, бин-поиск обычный завершится сразу на 1м шаге и найдет в индексе [4] значение == 2.
    Ответ написан
    Комментировать