MouseLook.js+Update+EEEPC=BAD(вопрос решён)

Программирование на Юнити.

MouseLook.js+Update+EEEPC=BAD(вопрос решён)

Сообщение iqubik 14 сен 2009, 02:51

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

c# code
Код: Выделить всё
using UnityEngine;
using System.Collections;
using System.Threading;

public class threadScript : MonoBehaviour {
//mouse block
   
public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
public RotationAxes axes = RotationAxes.MouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F;

public float minimumX = -360F;
public float maximumX = 360F;

public float minimumY = -60F;
public float maximumY = 60F;

float xInput = 0F;
float yInput = 0F;
float xInputOld = 0F;
float yInputOld = 0F;

float averageXInput=0F;
float averageYInput=0F;

float rotationX = 0F;
float rotationY = 0F;

Quaternion originalRotation;


void mouse()
{
   for(int i=10;i>0;i++)
   {
if (axes == RotationAxes.MouseXAndY)
{
// Pass inputs to inputOlds first...
xInputOld=xInput;
yInputOld=yInput;

// Read the mouse input axis
xInput = Input.GetAxis("Mouse X") * sensitivityX;
yInput = Input.GetAxis("Mouse Y") * sensitivityY;

//Average new inputs with old
averageXInput = xInput + xInputOld;
averageYInput = yInput + yInputOld;
averageXInput *= 0.5f;
averageYInput *= 0.5f;

rotationX += averageXInput;
rotationY += averageYInput;

rotationX = ClampAngle (rotationX, minimumX, maximumX);
rotationY = ClampAngle (rotationY, minimumY, maximumY);

Quaternion xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up);
Quaternion yQuaternion = Quaternion.AngleAxis (rotationY, Vector3.left);

transform.localRotation = originalRotation * xQuaternion * yQuaternion;
}
else if (axes == RotationAxes.MouseX)
{
// Pass inputs to inputOlds first...
xInputOld=xInput;

// Read the mouse input axis
xInput = Input.GetAxis("Mouse X") * sensitivityX;

//Average new inputs with old
averageXInput = xInput + xInputOld;
averageXInput *= 0.5f;

rotationX += averageXInput;
rotationX = ClampAngle (rotationX, minimumX, maximumX);

Quaternion xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up);
transform.localRotation = originalRotation * xQuaternion;
}
else
{
// Pass inputs to inputOlds first...
yInputOld=yInput;

// Read the mouse input axis
yInput = Input.GetAxis("Mouse Y") * sensitivityY;

//Average new inputs with old
averageYInput = yInput + yInputOld;
averageYInput *= 0.5f;

rotationY += averageYInput;

rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = ClampAngle (rotationY, minimumY, maximumY);

Quaternion yQuaternion = Quaternion.AngleAxis (rotationY, Vector3.left);
transform.localRotation = originalRotation * yQuaternion;
}    
}
}   
   
//end mouse block
   

    void Start () {
   
      //
      if (rigidbody)
      rigidbody.freezeRotation = true;
      
      originalRotation = transform.localRotation;
      //
      
      Thread oThread = new Thread(new ThreadStart(mouse));

      oThread.Start();

      /*while (!oThread.IsAlive);
     
      Thread.Sleep(1); */
     
    try
      {
         Debug.Log("Try to restart the print thread");
         oThread.Start();
      }
      catch (ThreadStateException)
      {
         Debug.Log("ThreadStateException trying to restart print. ");
         Debug.Log("Expected since aborted threads cannot be restarted.");
      }
   }
   
   void Update () {}
      

      public static float ClampAngle (float angle, float min, float max)
         {
         if (angle < -360F)
         angle += 360F;
         if (angle > 360F)
         angle -= 360F;
         return Mathf.Clamp (angle, min, max);
         }
}

Но этот скрипт полностью убивает Юнити.
Подскажите пожалуйста, как верно реализовать фунцию аналогичную Апдейт, но такую которая вызывается независимо от каких то параметров и в отдельном потоке.
Функция FixedUpdate даже с маленьким таймером в моих руках безполезна, т.к если таймер делать воистину маленьким то оч сильно возрастает нагрузка на систему, а если оставлять 0,02 то мышка работает дёргано.
Последний раз редактировалось iqubik 14 сен 2009, 18:58, всего редактировалось 1 раз.
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ

Re: MouseLook.js+Update+EEEPC=BAD(вопрос по теме)

Сообщение Neodrop 14 сен 2009, 10:44

В потоке нельзя пытаться что-то изменить в трансформе, рендерере, материалах или текстурах объекта. Короче нельзя менять всё то, что может помешать рендерингу. Отсюда и вылеты. Вы решили двигать камеру в отдельном потоке, попадая на процесс прорисовки? Не правильное решение.
В отдельном потоке вы можете провести только расчёты. Трансформации объектов нужно проводить в системных коллбэках - Update и FixedUpdate
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: MouseLook.js+Update+EEEPC=BAD(вопрос по теме)

Сообщение iqubik 14 сен 2009, 11:42

Neodrop писал(а):В потоке нельзя пытаться что-то изменить в трансформе, рендерере, материалах или текстурах объекта. Короче нельзя менять всё то, что может помешать рендерингу. Отсюда и вылеты. Вы решили двигать камеру в отдельном потоке, попадая на процесс прорисовки? Не правильное решение.
В отдельном потоке вы можете провести только расчёты. Трансформации объектов нужно проводить в системных коллбэках - Update и FixedUpdate

Спасибо, теперь ясно откуда ошибки. Но всё таки, как вы считаете как лучше сделать свой калбэк с высокой частотой опросов чтобы оттуда можно было опрашивать и считать мышку?
Плагином?
Или код плагина тоже вызывается одной из Update функций?
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ

Re: MouseLook.js+Update+EEEPC=BAD(вопрос по теме)

Сообщение Neodrop 14 сен 2009, 12:30

Я же говорю - ВСЕ изменения объектов, влияющие на его рендер (отображение на экране) можно проводить только в Update/FixedUpdate.
И не забывайте самостоятельно закрывать потоки - [unity 3D] Unity за вас этого не сделает. Используйте void OnApplicationQuit() для ручного вырубания потока.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: MouseLook.js+Update+EEEPC=BAD(вопрос по теме)

Сообщение iqubik 14 сен 2009, 13:09

Neodrop писал(а):Я же говорю - ВСЕ изменения объектов, влияющие на его рендер (отображение на экране) можно проводить только в Update/FixedUpdate.
И не забывайте самостоятельно закрывать потоки - [unity 3D] Unity за вас этого не сделает. Используйте void OnApplicationQuit() для ручного вырубания потока.

Спасибо! Я думаю что это может пригодиться!
Как там говорится, осведомлён - значит вооружен)))
Значит проблема так просто не решается?
Вообще очень странное поведение с опросом мышки. Жаль что для устройств ввода не написано спец класса. Или я ошибаюсь?
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ

Re: MouseLook.js+Update+EEEPC=BAD(вопрос по теме)

Сообщение Neodrop 14 сен 2009, 18:02

Я так подозреваю, что мышь тут ни при чём.

К примеру, если на сложной графике, выставить 16х сглаживание, то на моей машине, счётчик FPS показывает 45-60, а всё дёргается так, будто обновление происходит 3 раза в секунду.
Сам то рендеринг проходит быстро, а вот сглаживание ужирает всю производительность.
Так что, боюсь вам надо бороться не с мышью, а с общей оптимизацией приложения.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: MouseLook.js+Update+EEEPC=BAD(вопрос по теме)

Сообщение iqubik 14 сен 2009, 18:39

Neodrop писал(а):Я так подозреваю, что мышь тут ни при чём.

К примеру, если на сложной графике, выставить 16х сглаживание, то на моей машине, счётчик FPS показывает 45-60, а всё дёргается так, будто обновление происходит 3 раза в секунду.
Сам то рендеринг проходит быстро, а вот сглаживание ужирает всю производительность.
Так что, боюсь вам надо бороться не с мышью, а с общей оптимизацией приложения.

Я создасен с вами, вообщем согласен, но в частном:
Писал выше:
"В итоге мы имеем очень корявый обзор мышью, но что примечательно когда мы передвигаем персонажа(стандартного фпконтроллера) то видео отрисовывается плавно, но мышка по прежнему тупит."
То есть приложение само по себе легко отрисовывает более 25 кадров в секунду, но мышь как будто захватывается с очень низким приоритетом.
При этом ясно видно, что при постоянном движении мышью приоритет увеличивается(чуть-чуть).
Вообщем при работе с мышью ущущение как от русских машин - работает только если пнуть.
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ

Re: MouseLook.js+Update+EEEPC=BAD(вопрос по теме)

Сообщение Neodrop 14 сен 2009, 18:42

Это легко проверит на простейшей сцене, практически без графики. Если тормоза останутся- тогда да, действительно какие-то проблемы.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: MouseLook.js+Update+EEEPC=BAD(вопрос по теме)

Сообщение iqubik 14 сен 2009, 18:49

Neodrop писал(а):Это легко проверит на простейшей сцене, практически без графики. Если тормоза останутся- тогда да, действительно какие-то проблемы.

Вот эта сцена.
download/file.php?id=541
И собранный вариант.
6 DC, Tris = 2.5k
TextureAtlas=5textures=729.4kb
[Unity3dPlayer]http://sfmggu.ru/003.unity3d[/Unity3dPlayer]

---
Очень простая сцена, честно говоря от ёжика я не ожидал такого предательства по поводу мышки.
Когда стрейфишься всё очлично, но когда шевелишь мышакой - тормоза оч странные.


-------------

ПРОСТИТЕ МЕНЯ!! Я И СЕБЕ И ВАМ БОШКУ ЗАМОРОЧИЛ((
Всё дело в точпаде, его драйвер имеет невысокий приоритет.
С мышкой всё отлично!
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ

Re: MouseLook.js+Update+EEEPC=BAD(вопрос по теме)

Сообщение Neodrop 14 сен 2009, 18:57

Ну, к сожалению я не могу его протестировать. У меня нет ЕЕЕ
Аааа. Не сразу увидел ваше дополнение ;0)
Вот и славно... В Мемориз...
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: MouseLook.js+Update+EEEPC=BAD(вопрос по теме)

Сообщение iqubik 14 сен 2009, 19:00

Neodrop писал(а):Ну, к сожалению я не могу его протестировать. У меня нет ЕЕЕ
Аааа. Не сразу увидел ваше дополнение ;0)
Вот и славно... В Мемориз...

Да) Я как-то сразу не догадался, начал изобретать велосипеды.
В любом случаем спасибо за ценные замечания по потокам!
----------------------
qub edition
Идеальное общество это общество где каждый станет настолько эгоистом, что начнёт понимать, что делая недоброе другому получит тоже в ответ. (око за око, с прощением)
iqubik
UNIт
 
Сообщения: 74
Зарегистрирован: 11 июн 2009, 13:38
Откуда: Stavropol
  • Сайт
  • ICQ


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7