Vasily
let rec loop (state,hasChanges) = async{ match! inbox.Receive() with | ViewMsg.Render msg when (not isRendering)-> isRendering<-true /// Here we put an inbox into the "waiting" state and wait for render finishes Debug.WriteLine "View invoked" async{ program.syncAction (fun()->updateView msg) () isRendering<-false inbox.Post (Completed) } |> Async.Start return! loop (msg,false) | ViewMsg.Completed -> /// When we finished render and have "dirty" changes ,we should invoke Render again to be sure to receive actual view if(hasChanges) then inbox.Post (Render state) return! loop (state,hasChanges) | ViewMsg.Render msg when isRendering-> /// Here we just accumulate changes, no actual rendering happens return! loop (msg,true) }
Vasily
Ща вот так
Vasily
Т.е. я начинаю рендер, следующие изменения помечаю как грязные, по окончанию рендера, если надо, кидаю еще один
Vasily
Я понимаю, что с дропом очереди это полная ебанина, но надо это Тиму объяснить нормальными словами
Hog
Почему бы не сделать таймер с флажком
Hog
Дёрти
Vasily
Ну таймер тоже не очень
Vasily
Таймер будет фигачить 60 фпс
Vasily
Условно
Ayrat
то есть тут даже очередь не нужна, т.к. всё тут цпу работа
Vladislav
ехал пупа через лупу
Vasily
А мне надо дергать диффы далеко не всегда
Hog
Есть флажок - шлём рендер
Hog
Нет - курим бамбук
Vasily
Непонятно тогда, чем от моего варианта отличается
Vasily
И как быть с долгими рендерами
Hog
Тебе тут очередь сообщений только мешает
Hog
Как правильно заметил предыдущий оратор айратор
Ayrat
Тебе тут очередь сообщений только мешает
я передумал. Я подумал хорошо
Ayrat
нужна очередь чтобы зашедулить ререндер на случай грязных ченжей. это либо очередь и пост обработка, либо таймер
Ayrat
то есть в случае с очередью (мейлбоксом) можно просто по окончанию рендера положить себе месадж (ну вот как Вася делает) и почекать
Vasily
Ну вот Айрат ща понял, чего я хочу
Ayrat
ну да, тогда вот код выше имеет смысл
Hog
Я вот смутно припоминаю, что вм_пэйнты как-то схлопывались
Hog
И про инвалидацию что-то там было
Hog
Надо старинные книги по винапи почитать тебе, Василий :)
Hog
Везёт тебе!
Vasily
У меня ж по заветам Ильича
Vasily
Для каждой страницы свой loop
Vasily
Без этой элмишевской херни со вложенными DU
Vasily
Ненене
Ayrat
вынести присвоение isRendering в код лупа, а не на тредпул
Ayrat
Ненене
не, ты можешь тут получить два процесса рендера опять
Ayrat
потому что ты стартанул работу на тредпуле и пошёл следующее сообщение обрабатывать
Ayrat
там флаг всё еще false
Vasily
Там фишка, что rendering false выставляется ПОСЛЕ
Ayrat
и ты стартанул ещё одну на тредпуле
Hog
А я бы рендер прикрутил сбоку
Ayrat
А, бля
Vasily
того, как мы все отрендерили
Ayrat
isRendering <- true
Ayrat
вот что надо сори
Vasily
true вынесен
Ayrat
а бля, я слепой
Ayrat
Всё ок
Vasily
isRendering<-true /// Here we put an inbox into the "waiting" state and wait for render finishes Debug.WriteLine "View invoked" async{
Vasily
Это я в курсе
Ayrat
да, я в глаза долблюсь
Ayrat
ну, выглядит рабочим вариантом
Ayrat
as far as I understand
Vasily
Ну он работает, да
Vasily
Мне бы только отбиться от этой идеи с дропом очереди
Ayrat
дроп очереди нахуй не нужен, это тот же Receive
Ayrat
мы её и так дропнем без костылей
Vasily
Человеку надо объяснить, что он неправ
Vasily
У меня знаний не хватает
Ayrat
я вообще не очень понял нахуй её дропать честно говоря
Vasily
Ну он идет не туда
Ayrat
то есть может тут есть какая-то идея, но я её не понял
Vasily
Ему кажется, так будет больше перформанса
Vasily
А я чувствую, что он неправ
Vasily
Но не могу это аргументировать
Ayrat
пусть бенчи покажет
Vasily
Ну я отписал вот так: https://github.com/fsprojects/Fabulous/pull/771#issuecomment-652390900
Vasily
Но, чую, надо чем-то дополнить
Roman
Я тут смог заставить дурабли работать
Roman
Там в доке пишут, что это а-ля актор модель. Так вот, не верьте, с акторами почти ничего общего нет
Ilya
Майкрософт никогда не могли в нейминг :)
Roman
вот да. Столько времени потратил, наступая на подводные грабли, чисто из-за того, что они наебали с актор моделью
Roman
ну типа того да. Тока они еще общаться между собой могут, но не все так просто.
Roman
Активити из оркестрации можно дернуть, а из энити нельзя. Энтити могут циклами между собой сообщения гонять, а оркестрации нет
Roman
но из энтити можно дернуть себе анус оркестрацию, а уже оттуда дернуть активити
Roman
весело короч
Ayrat
так эта, напомни, что за юз кейс для такого БЛИДИНГ ЕДЖА?