Задать вопрос
  • Почему не возникает событие MouseMove на пользовательском элементе, при маленьком движении мышки WPF?

    @Nimus2000 Автор вопроса
    Да я вообще не про код вопрос, а про специфику
    Я же сам ответил, так же. Я не понимаю, каким образом элемент знает что он не изменится.
    Почему событие MouseMove с 10 фпс происходит, для примера, просто отрисовка кружка по курсору, почему если сдвинуть мышку на 2 пикселя, не происходит даже вызова MouseMove, а если на 20 пикселей сдвинуть то произойдет (в версии где всего этого нету с drawingContext.DrawRectangle(Brushes.Transparent итд).
    В чем механизм.
    Написано
  • Как обновлять AABB бокс при повороте?

    @Nimus2000 Автор вопроса
    Не выходит, с OOB более оптимальная форма, но всю равно немного больше реальной.
    Так как ее угловые точки почти всегда в внешней области. а их трансформация так же даст большую область.
    Может так и надо.
    Написано
  • Как правильно смоделировать систему N колизий тел, прям абсолютно точно?

    @Nimus2000 Автор вопроса
    а еще вопрос, например ест ь3 объеккта 1,2,3 Например сталкиваются 1-2 1-3,
    Вопрос, какие входные данные в функцию колизии.
    Например у меня было последовательно, например после v1,v2=>(v1',v2') получалось, а после это изменненое v1' c v3 обрабатывось, это же ошибка, и надо передавать при обработки второй коллизии изначальные значения и суммиваровать конечный результат?
    Написано
  • Почему курсор мышки перестал совпадать с позицией на экране?

    @Nimus2000 Автор вопроса
    да я это понял, искал час ошибку вообще глубоко в коде, когда она была в самом начале
    Написано
  • Как настроить 2 экрана с разным разрешения экрана?

    @Nimus2000 Автор вопроса
    VoidVolker, а почему у меня на старом экране, hd, шрифт системных програм, проводник, диспетчер задач, не четкий, расплывчатый, только заметил, если все до 2 экрана было нормально, а браузеры, и программы нормальный шрифт.
    Написано
  • Как настроить 2 экрана с разным разрешения экрана?

    @Nimus2000 Автор вопроса
    а что лучше, масштабировать или менять разрешения? Например понизить разрешение до HD, или наоборот маштабировать на 33% вот не пойму все?
    Написано
  • Как реализовать потоковое заполнение массива другим потоком?

    @Nimus2000 Автор вопроса
    Вот есть такой код, вроде работает хорошо, хочу понять есть ли тут утечки,
    Пара вопросов.
    Например CancellationTokenSource? tokenSource должен быть в цикле или вне, должен ли вызываться Dispose() для него.
    Есть ли тут утечка потоков, есть ли вообще такое, например
    await Task.WhenAny(taskRender, Task.Delay(50,token)) допустим что функция taskRender выполняется за 1мс, тогда след вызов этой функции будет через 1 мс(допустим). А поток Task.Delay(50,token) он что будет все еще продолжать работать? Тогда на след итерации у меня он будет ли продолжаться, или нет, на 49 итерации сколько будет Task.Delay(50,token) ? 1 или 49?
    Вообще правильна ли модель реализована, вроде выглядит нормис

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

    internal class Renderer:IDisposable
        {
         
            private CancellationTokenSource? tokenSource;
            public object locker;
            private int lastIndexDrawObj;
            private SKBitmap? latestFrame;
            private IEnumerator<Wrapper<Ball>>? enumeratorStreamDraw;
            private IParticleTreeModel<Ball> particleTreeModel;
            private SKPaint ballPaint;
            private Camera2D coordMapper;
            private bool disposedValue;
            public Action DrawHandler { get; set; }
            public SKBitmap LatestFrame => latestFrame;
    
            public Renderer(IParticleTreeModel<Ball> particleTreeModel, Camera2D coordMapper)
            {
                ballPaint = new SKPaint() { IsStroke = false, IsAntialias = true };
                locker = new object();
                this.particleTreeModel = particleTreeModel;
                this.coordMapper = coordMapper;
            }
    
            internal async Task<long> RenderLoop()
            {
                tokenSource?.Cancel();
                tokenSource?.Dispose();
                Stopwatch sw = Stopwatch.StartNew();
                while (sw.ElapsedMilliseconds < 10_000)
                {
                    tokenSource = new CancellationTokenSource();
                    var token = tokenSource.Token; 
                    var taskRender = Task.Run(() => RenderFrame(token, coordMapper.ViewportSize.X, coordMapper.ViewportSize.Y));
                    bool isComplected = await Task.WhenAny(taskRender, Task.Delay(50,token)) == taskRender;
    
                    lock (locker)
                    {
                        if (isComplected)
                        {
                            latestFrame = taskRender.Result;
                            break;
                        }
                        else
                        {
                            tokenSource.Cancel(); 
                            latestFrame = taskRender.Result;
                        }
    
                    }
                }
                DrawHandler?.Invoke(); // вызывает кучу редиректов до
                                                     //  canvas.Dispatcher.Invoke(() => canvas.InvalidateVisual())
                sw.Stop();
                return sw.ElapsedMilliseconds;
    
            }
            private SKBitmap RenderFrame(CancellationToken token, float w, float h)
            {
                SKBitmap image;
                lock (locker)
                {
                    if (latestFrame != null && latestFrame.Width == (int)w && latestFrame.Height == (int)h)
                    {
    
                        image = latestFrame;
                    }
                    else
                    {
                        if (latestFrame == null)
                            image = new SKBitmap((int)w, (int)h);
                        else
                        {
                            latestFrame.Dispose();
                            image = new SKBitmap((int)w, (int)h);
    
                        }
                        enumeratorStreamDraw = null;
                    }
    
                }
                using var canvas = new SKCanvas(image);
                drawParticleQuadTreePart(token, canvas, w, h);
           
                return image;
            }
            private void drawParticleQuadTreePart(CancellationToken token, SKCanvas g, float w, float h)
            {
    
                if (enumeratorStreamDraw == null)
                {
                    enumeratorStreamDraw =  particleTreeModel.GetBallsIterator(); // Создаем новый итератор
                } 
                while (enumeratorStreamDraw.MoveNext())
                {
    
                    ref var o = ref enumeratorStreamDraw.Current.Data;
                    ballPaint.Color = o.color;
                    var pos = coordMapper.WorldToCanvas(o.Pos);
                    g.DrawCircle(pos, coordMapper.ToCanvas(o.radius), ballPaint);
                    
                    if (token.IsCancellationRequested)
                    {
                        return;
                    }
                }
                enumeratorStreamDraw = null;
            }
    
            protected virtual void Dispose(bool disposing){}
           
        }
    }
    /////////////// отрисовка
    lock(renderer.locker)
    if(renderer.LatestFrame!=null)
        canvas.DrawBitmap(renderer.LatestFrame,0,0 );

    Вот такой есть рабочий код
    Написано