• Как в ировом движке на C++ распаралерить функции Update и Render?

    @dima20155
    you don't choose c++. It chooses you
    Это классическая задача читателей-писателей, способы решения этой задачи легко гугляся. Если вы хотите сделать функцию update потокобезопастной, то можете использовать любые доступные методы синхронизации. В данном случае нет серебряной пули и необходимо выбирать способ синхронизации самому. Вот пара простейших идей:

    - Сделайте переменные, изменяемые в методе Update типа atomic.
    - Сделайте доступ к данным через мьютекс (что в вашем конкретном примере не совсем эффективно, но очень просто в реализации).
    - Если у вас предполагается лишь 1 поток (полагаю, что в данной задаче использование большего числа потоков не актуально), который будет обрабатывать функцию Update, то в начале функции вы можете сохранить все модифицируемые переменные (поля объекта) в локальные переменные и в конце функции взять мьютекс и сохранить значение локальных переменных в поля объекта.

    Также интересно имеет ли смысл просчитывать физику объектов без ее отрисовки? Если данные физики качающего маятника используются лишь для отрисовки его на экране, то смысла в распараллеливании, насколько я понимаю, не очень уж много.
    Ответ написан
    1 комментарий
  • Как в ировом движке на C++ распаралерить функции Update и Render?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если есть несколько потоков, то можно данные защищать через какой-нибудь mutex. Каждый поток перед тем как менять или читать данные, блокирует мьютекс, что-то быстрое делает, освобождает мьютекс. Лучше не держать его все время длинных вычислений, а, допустим, считать новые данные в локальных переменных, а потом в критической секции записать их в место, которое другой поток сможет читать.
    Ответ написан
    1 комментарий