Страница 1 из 3

Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 15:18
Nubila
Привет! Заметил в своём теста 2D платформера, что персонаж передвигается с фризами. В сцене присутствуют:
Камера ,куб на фоне(имитирующий поверхность, без колайдера), дирекшн лайт, Холст , на котором 3 кнопки и виртуальный джостик. На самом персонаже скрипт передвижения, Capsule Collider и RigidBody с выключенным UseGravity. Скрипт передвижения HeroMove:
Синтаксис:
Используется csharp
void Update()
    {
        if (ManagerOfManagers._single._JoyStick.OutCoord != Vector2.zero &&//OutCoord является Vector2 направление джостика
            lastMovement == movement)
        {
            isMoving = true;

            var coord = ManagerOfManagers._single._JoyStick.OutCoord;
            movement = coord * _speed * Time.deltaTime;

            transform.position = new Vector3(transform.position.x + movement.x, transform.position.y + movement.y);//трансформ закеширован

            lastMovement = movement;
        }
        else
            isMoving = false;
    }

Весь этот скрипт максимально потребляет 0.06ms(чекал при помощи стандартного дип профайлера).

Вся проблема начинается когда FPS залочиваю до 60(для смартфонов). Тогда заметно что персонаж двигается мелкими-мелкими рывками, и иногда получаю какие то мини-фризы. В настройки Time я не лез, там всё по стандарту. Движение, как видите, не реализовано при помощи физики.

Вот пару скринов профайлера (кликабельны, там качество):
Изображение
Изображение
Изображение
Изображение

В чём же может быть проблема, подскажите пожалуйста.

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 15:52
1max1
Вся проблема начинается когда FPS залочиваю до 60(для смартфонов)

Как залочиваешь? После лока ты тестил и лаги были и в редакторе и на смарте?

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 17:10
Nubila
1max1 писал(а):
Вся проблема начинается когда FPS залочиваю до 60(для смартфонов)

Как залочиваешь? После лока ты тестил и лаги были и в редакторе и на смарте?

Application.targetFrameRate = 60;

Для смарта ничего по сути не меняется, так как там что лочить что нет, всё равно будет 60 кадров. В редакторе конечно они заметнее, на смарте больше похоже как раз на телепортацию на короткую дистанцию. Сразу не заметно, если всмотреться то становится видно, но глаз режет. Могу видик записать)

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 18:05
immeasurability
физический объект НЕ!!! двигают через transform.position

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 18:09
1max1
Вряд ли лаги из-за этого, глядя на профайлер я не вижу чтобы скрипты просаживали фпс, возможно твой скрипт просто криво работает, возможно твой джойстик выдает скачковые значения.

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 20:01
Nubila
immeasurability писал(а):физический объект НЕ!!! двигают через transform.position

оО. Вот этого не знал вообще. Спасибо! А есть инфа какая то об этом?

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 20:03
1max1

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 20:06
Nubila

Ты не понял) Я имел ввиду , почему ЗАПРЕЩЕНО двигать физ обьекты через трансформ.

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 20:11
Anonymyx
Потому что движение динамического RigidBody рассчитывается физическим движком, каждые FixedUpdate() (Fixed timestep в настройках). Получается, и движок обрабатывает движение объекта, и ты в Update() меняешь позицию объекта, отсюда и конфликты.

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 20:15
Nubila
Anonymyx писал(а):Потому что движение динамического RigidBody рассчитывается физическим движком, каждые FixedUpdate() (Fixed timestep в настройках). Получается, и движок обрабатывает движение объекта, и ты в Update() меняешь позицию объекта, отсюда и конфликты.

А каким образом движок обрабатывает движение объекта?

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 20:18
Anonymyx
Физический движок? Там вроде PhysX используется. Как именно, хз, очевидно с помощью математических формул :)

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 20:21
Nubila
Anonymyx писал(а):Физический движок? Там вроде PhysX используется, как именно рассчитывает, хз, очевидно с помощью математических формул :)

Я к тому, что я не запускал же на нём никаких функций для передвижения. Использую Rigidbody и Collider только для лучей и событий столкновения. Похоже что придётся теперь это всё на физику перебрасывать.

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 20:22
Anonymyx
Можно просто пометить RigidBody как isKinematic, если меняете позицию через .transform.

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 20:22
seaman
IsKinematic можно. Можно, конечно любые, но могут быть неприятности.
По теме - на скринах этого нет, но вообще фризы при залочивании fps часто появляются из-за gfx.waitforpresent. Это когда CPU или GPU ждут друг-друга. Или CPU не успевает отдать новые данные на отрисовку, или GPU не успевает отрисовать полученные данные. Как с этим бороться я не понял, но хотя бы понятно что это такое.
Вот кто бы мне сказал что это:
Скрытый текст:
Изображение

Здесь еще терпимо - проседания до 40. Было аж до 10!

Да, пример gfx.waitforpresent
Скрытый текст:
Изображение

Re: Телепортация, а не перемещение...

СообщениеДобавлено: 16 июл 2018, 20:38
Nubila
seaman писал(а):IsKinematic можно. Можно, конечно любые, но могут быть неприятности.
По теме - на скринах этого нет, но вообще фризы при залочивании fps часто появляются из-за gfx.waitforpresent. Это когда CPU или GPU ждут друг-друга. Или CPU не успевает отдать новые данные на отрисовку, или GPU не успевает отрисовать полученные данные. Как с этим бороться я не понял, но хотя бы понятно что это такое.
Вот кто бы мне сказал что это:
Скрытый текст:
Изображение

Здесь еще терпимо - проседания до 40. Было аж до 10!

Да, пример gfx.waitforpresent
Скрытый текст:
Изображение

Да, есть такая тема. В 2018.1.5 версии(возможно и в 2к17'ой) это называется немного по другому:
Изображение

По поводу isKinematic я уже думал, но в таком случае я получаю иную проблему:
В игрушке стены всё же есть, и препятствий достаточно. Казалось бы, можно бросать лучи под 0, 90, 180, -90 и запрещать передвижение в соответствующие стороны, НО если объект находится под углом в 45 градусов, то лучи его не поймают, и частично в этот объект можно будет войти.