amarao: (Default)
[personal profile] amarao
Одна из проблем, которая меня очень смущает, это проблема синхронизации времени и алгоритма.

В целом, скорость процессора - это такая внешняя сущность, не относящаяся к алгоритму (и коду). Один и тот же код на разных процессорах будет выполняться за совершенно разное время (банальность, да, но важная).

Вывод на экран, который мы можем считать подобием silky smooth, требует выполнять операции за фиксированное время. Промахнулись? Остались без кадра. Визуально это выглядит как рывок или тормоза.

Т.е. у вас в алгоритме есть некая внешная сущность, которая для алгоритма почти подобна рандому - "сколько времени прошло?". И эта сущность нам говорит, сколько мы можем сделать (в рамках внутренних метрик алгоритма, допустим, "операций").

Нам надо сделать 2 миллиона операций. Это константа runtime'а. А вот сколько кадров это займёт - это некая случайная величина, которую мы не контролируем.

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

Во время моих экспериментов с пистоном я пробовал все их три. Увы, работали плохо.

Была даже четвёртая альтернатива - считать в соседнем треде, и быть готовым "ответить" в любой момент времени накопившимися изменениями. Это, по сути, мало отличается от "отложить рендеринг на следующий фрейм", потому что запросы нужно проверять в event loop'е, и нет никакой разницы, в одном это треде, или в двух. Всё равно работу нужно резать на куски, а какого размера куски не понятно.

Пятая альтернатива пока что звучит интересно: иметь shared buffer, в который один тред пишет, а второй читает. Один тред всё время пишет, второй читает когда нужно. В силу специфики проблемы (попкисельный рендеринг) нет разницы между "чтением в середине записи" и "откладыванием половины работы на следующий тик".

Я уже себя ругаю (ещё раз) за то, что я это делаю, но, допустим, я попробую это. С алгоритмической точки зрения это наиболее разумная идея (мы считаем, не думая про читателя, т.е. просто считаем).

Заодно, познакомлюсь с тем, как шарить mut-память в rust'е между тредами. (Да, я знаю, что это instant-UB, но уж очень соблазнительная идея).
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

amarao: (Default)
amarao

April 2026

S M T W T F S
   1234
567 891011
12131415161718
19202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 12th, 2026 07:15 pm
Powered by Dreamwidth Studios