• Является ли CancellationTokenSource неуправляемым ресурсом?

    twobomb
    @twobomb
    Pragma Games, Ну сейчас нет, потом будут. Потому-что у вас не типичное использование, которые не затрагивает ресурсы которые могут вызвать учетку.
    Просто открываете код CancellationTokenSource

    Ваш пример подпадает под безобиндный конструктор
    public CancellationTokenSource()
            {
                m_state = NOT_CANCELED;
            }


    Но если вы бы использовали Timespan то всё было бы по другому, так как был бы вызван конструктор
    public CancellationTokenSource(TimeSpan delay)
            {
                long totalMilliseconds = (long)delay.TotalMilliseconds;
                if (totalMilliseconds < -1 || totalMilliseconds > Int32.MaxValue)
                {
                    throw new ArgumentOutOfRangeException("delay");
                }
    
                InitializeWithTimer((int)totalMilliseconds);
            }

    В котором есть метод InitializeWithTimer, который создаёт таймер, а это уже страшная вещь за которой нужно следить.

    Чтобы понять какие ресурсы могут вызывать учетку просто посмотри какие ресуры освобождаются в методе dispose

    protected virtual void Dispose(bool disposing)
            {
    
                if (disposing)
                {
                    if (m_disposed)
                        return;
    
                    if (m_timer != null) m_timer.Dispose();
    
                    var linkingRegistrations = m_linkingRegistrations;
                    if (linkingRegistrations != null)
                    {
                        m_linkingRegistrations = null; // free for GC once we're done enumerating
                        for (int i = 0; i < linkingRegistrations.Length; i++)
                        {
                            linkingRegistrations[i].Dispose();
                        }
                    }
    
                    // registered callbacks are now either complete or will never run, due to guarantees made by ctr.Dispose()
                    // so we can now perform main disposal work without risk of linking callbacks trying to use this CTS.
    
                    m_registeredCallbacksLists = null; // free for GC.
    
                    if (m_kernelEvent != null)
                    {
                        m_kernelEvent.Close(); // the critical cleanup to release an OS handle
                        m_kernelEvent = null; // free for GC.
                    }
    
                    m_disposed = true;
                }
            }


    Как видите это тот самый таймер, а также некоторые массивы и событие.

    Соответственно если по каким причинам не было использования этих ресурсов в данном классе, то и освобождать ничего не нужно, ну откуда вы знаете в какие сценариях будут они использованы, а в каких нет? Нормальные люди в такие дебри не лезут, раз нужно вызывать Dispose , вызывайте его. Да в некоторых случаях этот вызов будет бесполезен, а в некоторых очень даже нужен.
    Вы сделайте какую нибудь подписку на событие этого классе, и всё, будет например использован какой нибудь из тех массивов которые должны освобождаться, а вызова Dispose вы не делали, ну и пойдет утечка.
    Всё зависит от сценария использования и внутренних реализаций таких классов, внутрь которых лезть не нужно. Просто вызывайте Dispose если ресурс больше не нужен, и не думайте.
  • Является ли CancellationTokenSource неуправляемым ресурсом?

    twobomb
    @twobomb
    Pragma Games, Ну так вы не путайте структуру CancellationToken и CancellationTokenSource .
    Да для CancellationTokenSource необходимо вызвать метод dispose, после того как он уже не нужен.
    Например в конце задачи или через continuewith, если не вызовите, то это будет утечка памяти. Если он используется раз в 100 лет может и незаметная, но если часто, то рост будет активным.
  • Какой тип данных использовать в кликере?

    twobomb
    @twobomb
    FlyFuGame, ну типа того.
    У вас будет массив приписок, типа: пустая K M B ......
    Массив значений можно даже short
    Ну и логика, 1000 это 1К, 1000К это 1М, 1000М это 1В и т.д.
    Допустим последняя приписка будет условно E, но что если будет 1000E? Все правильно нужно делать доп логику генерарования приписок, типа 1000E это 1 E1, 1000 E1 это 1 E2 ....
    Ну и можно реализовать всякие удобные методы, перегрузки операторов для работы с классом... Там уже по своему усмотрению
  • Является ли CancellationTokenSource неуправляемым ресурсом?

    twobomb
    @twobomb
    Ну обычно CancellationToken берется из CancellationTokenSource.
    Ну по идее в вашем случае, token может быть удален сразу после завершения метода Update, потому-что на него есть единственная ссылка которая существовала внутри видимости метода update
  • Какой тип данных использовать в кликере?

    twobomb
    @twobomb
    Что за бред хранить число в кликере в одной переменной.
    Пишите свой класс хранения. Как вариант число и приписка
  • Как смягчить повороты объекта?

    twobomb
    @twobomb
    Александр Андропов, Ну или если вам не нужен такой уровень заморочек, просто делайте плавную интерполяцию между текущим углом машинки и углом машинки который должен быть в текущей точке.
    Тоесть смысл в том чтобы не менять угол машинки резко, тогда всё будет сильно плавнее, хотя направление машинке может быть не верным тому которое должно быть в текущей точке, особенно заметно будет на разворотах на 180...
  • Как смягчить повороты объекта?

    twobomb
    @twobomb
    Александр Андропов, Я попросил chat gpt написать для вас функцию вычисления длинны 4х точечной кривой, это сильно упростит вам задачу вот код
    function bezierCurveLength(x1, y1, x2, y2, x3, y3, x4, y4) {
      const n = 100; // Количество сегментов для интегрирования
      let length = 0;
      let px = x1;
      let py = y1;
      for (let i = 1; i <= n; i++) {
        const t = i / n;
        const cx = (3 * x2 - 3 * x1) * t * t * t + (3 * x1 - 6 * x2 + 3 * x3) * t * t + (3 * x2 - 3 * x3) * t + x4 - x1;
        const cy = (3 * y2 - 3 * y1) * t * t * t + (3 * y1 - 6 * y2 + 3 * y3) * t * t + (3 * y2 - 3 * y3) * t + y4 - y1;
        length += Math.sqrt((cx - px) * (cx - px) + (cy - py) * (cy - py));
        px = cx;
        py = cy;
      }
      return length;
    }

    P.S. Шаг движения для 4х точечной кривой по идее будет (1/bezierCurveLength) * speed
  • Как смягчить повороты объекта?

    twobomb
    @twobomb
    Александр Андропов, Нет, примера для C# нет.
    В моем примере нужно решить будет одну проблему, это проблема скорости движения.
    Шаг движения одинаковый, но из-за того что длинна линий разная получается разная скорость.
    Получить любую точку можно по параметру t, он в диапазоне от 0 до 1.
    И получается допустим если шаг 0.1, то любую линию мы проходим за 10 шагов, если линия длинной условно 10 пикселей, то реальная скорость движения будет 1 пиксель\рендер, а если линия длинной 100, то скорость уже будет 10 пикселей\рендер.
    Поэтому для решения этой проблемы как вариант нужно узнать длинну каждой линии , и шаг с которым мы будем двигаться смещать в зависимости от длинны линии. Тогда мы будем двигаться по всем линиям с одниковой скоростью.

    А код переписать это 2 секунды, вам нужны только эти 2 функции
    //Вычисляем точки на кривой безье по формуле 4х точеченой кривой
    //P = (1−t)3P1 + 3(1−t)2tP2 +3(1−t)t2P3 + t3P4
    //Подробнее https://learn.javascript.ru/bezier-curve
    function getCordOnCurve(t,x0,y0,x1,y1,x2,y2,x3,y3){//t[0-1]
      var x  = Math.pow(1-t,3)*x0 + 3* Math.pow(1-t,2)*t*x1 + 3 * (1-t) * Math.pow(t,2)* x2 + Math.pow(t,3)*x3;
      var y  = Math.pow(1-t,3)*y0 + 3* Math.pow(1-t,2)*t*y1 + 3 * (1-t) * Math.pow(t,2)* y2 + Math.pow(t,3)*y3;
      return {x:x,y:y};
    }
    
    function calcControlPoints(x0,y0,x1,y1,x2,y2,x3,y3){
    //Вычисляем промежуточные точки между двумя точками, по методу Maxim Shemanarev Interpolation with Bezier Curves
            //Подробнее http://agg.sourceforge.net/antigrain.com/research/bezier_interpolation/index.html
        var xc1 = (x0 + x1) / 2.0;
        var yc1 = (y0 + y1) / 2.0;
        var xc2 = (x1 + x2) / 2.0;
        var yc2 = (y1 + y2) / 2.0;
        var xc3 = (x2 + x3) / 2.0;
        var yc3 = (y2 + y3) / 2.0;
    
        var len1 = Math.sqrt((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0));
        var len2 = Math.sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));
        var len3 = Math.sqrt((x3-x2) * (x3-x2) + (y3-y2) * (y3-y2));
    
        var k1 = len1 / (len1 + len2);
        var k2 = len2 / (len2 + len3);
    
        var xm1 = xc1 + (xc2 - xc1) * k1;
        var ym1 = yc1 + (yc2 - yc1) * k1;
    
        var xm2 = xc2 + (xc3 - xc2) * k2;
        var ym2 = yc2 + (yc3 - yc2) * k2;
    
        
        var smooth_value  = 1;//КОЭФИЦИЕНТ СГЛАЖИВАНИЯ ОТ 0 ДО 1
        ctrl1_x = xm1 + (xc2 - xm1) * smooth_value + x1 - xm1;
        ctrl1_y = ym1 + (yc2 - ym1) * smooth_value + y1 - ym1;
    
        ctrl2_x = xm2 + (xc2 - xm2) * smooth_value + x2 - xm2;
        ctrl2_y = ym2 + (yc2 - ym2) * smooth_value + y2 - ym2;
        
        return {cx1:ctrl1_x, cy1: ctrl1_y, cx2:ctrl2_x, cy2:ctrl2_y};
    }
  • Как сделать изображение продукта из чертежа?

    twobomb
    @twobomb
    Помоему детали очень примитвные, делайте в любом 3д редакторе которым лучше всего владеете
  • Как сделать автообновляемую таблицу?

    twobomb
    @twobomb
    Если это одна табличка на одной странице то на любой, уже на ванильном js можно было давно всё реализовать пока ждёшь ответа
  • Как сделать многослойные воксели?

    twobomb
    @twobomb
    yraiv, Посмотрел игру подробнее. В ней только наружный слой вокселей имеет разные текстуры, ну точнее наружняя часть - текстура внешки, а все остальные части красные. Ну и все внутренние воксели имеют тупо один цвет на всех сторонах. И воксели довольно больших размеров и модельки одинаковые, а значит можно сделать одного человека и все остальные будут такими же , меняется только внешняя текстура.
  • Как сделать многослойные воксели?

    twobomb
    @twobomb
    yraiv, Ну объект просто весь состоит из кубов определенного размера, и внутри он тоже заполнен такими кубами. Я не знаю, ну наверно есть какие-нибудь воксельные редакторы, потому-что текстурировать такое это мне кажется полный швах. Потому-что нужно сначала текстурирование наружных кубов СО ВСЕХ сторон, конечно условно сделать наружная строна одно, остальные просто красные допустим. Но если делать подробно, внутри органы и текстуры каждая своя на орган,на внутренние части органа это жесть, это самая муторная часть создания игры будет. Ну можно сильно не парится, сделать нормальное текстурование только внешки, все остальные текстуры условно мясо, ну и немного там подредактировать текстуры мозга и других органов по которым часто будет прилетать.
    Ну вопрос создания модели конечно будет самым муторным делом, всего скорее создается сначала полигонная модель, потом генерируется из неё воксельная, выделяются все воксели и задается одна текстура, а потом уже выделяется группа вокселей со своими текстурами (наружка, органы и т.д.).
    Ну я с этим не сталкивался и не знаю как это делать. Поэтому говорю как бы делал я, если бы даже не существовало гугла. А я думаю если загуглить какие-нибудь редакторы вокселей, плагины для 3D редакторов, плагины для текстурирования я думаю обязательно что-то да найдется.

    Ну а момент программирования разрушения такой модели я думаю и так понятен, ничего сложного. Самое геморное мне кажется текстурование...
  • Как сделать многослойные воксели?

    twobomb
    @twobomb
    Ну вот делать всю игру чисто из вокскелей я бы не стал. Мне кажется слишком жрущая будет, либо делать слой только наружных вокселей без внутренностей, либо вокселей относительно большого размера и делать не очень много объектов (тех же врагов), либо делать какую нибудь оптимизацию, типа изначально модели игроков из полигонов, но как только мы бьем подгружается его воксельная модель и он становится из вокселей и тогда уже разрушается.
    На самом деле и с полигонам можно достичь похожего эффекта через деформацию меша, но это сильно сложнее.
    Я думаю есть воксельные движки, поищите, может ничего и выдумывать не нужно.
  • Как сделать многослойные воксели?

    twobomb
    @twobomb
    Ну это воксели. Как пиксели только в 3д. Загугли, вот статья сразу на хабре попалась
    Что значит многослойные
  • Можно ли сделать чтобы например ComboBox генерировалась как static?

    twobomb
    @twobomb
    private void yourDataGridView_CellClick(object sender, DataGridViewCellEventArgs e){
                if (e.RowIndex == -1 && e.ColumnIndex == -1){
                    //todo
                }
            }
  • JS canvas недо-анимации как пофиксить?

    twobomb
    @twobomb
    Anonymous_toaster, Мне эти цифры на белом фоне и три строчки вашего кода вообще не о чём не говорят
  • Как проверить только один столбик на повторение данных, в PHPExcel?

    twobomb
    @twobomb
    Вопрос звучит так, что вы умеете проверять сразу по нескольким столбцам, а вот по одному не умеете.
    Вы не знаете как достать данные из excel?
    Или у вас проблемы в сравнении текущего значения и следующего и понимания что они разные?
  • JS canvas недо-анимации как пофиксить?

    twobomb
    @twobomb
    Anonymous_toaster, Так она не работает или так явно лучше
  • JS canvas недо-анимации как пофиксить?

    twobomb
    @twobomb
    Anonymous_toaster, Как она может срабатаывать после установления true если true устанавливается после проверки?
    Я же надеюсь вы создали переменную isPlay где-то за пределами функции и иниализировали её значением false?