Помогите с оптимизацией

Раздел, посвящённый самому важному - скорости.

Помогите с оптимизацией

Сообщение BANNERTM 28 апр 2012, 20:05

Есть префаб с объектом, при пристустивии более 10 объектов на сцене , начинаются лаги(15-20 фпс)
Объекты простые кубы, но с этим скриптом:

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class cannon : MonoBehaviour {
       
Transform target; // цель
public Transform sp;//spawn point (спавн пулей)
public Transform bullet;//пуля
public float attackRange = 30.0f;
public float shootAngleDistance = 10.0f;
       
int i = 50;//колво пулей
       
float _time = 5.0f;
double t = 0.3f;//число для счетчика выстрелов
       
       
       
       
void Start(){
               
               
               
}
               
               
void FixedUpdate(){
               
                       
               
               
target=FindClosestEnemy().transform;//Пушка ищет ближайшую цель
               
               
               
       
if (target == null) //если не нашла то ретурн
return;
 
        //повороачиваем пушку к цели    
   var targetPoint = target.position;
   var targetRotation = Quaternion.LookRotation (targetPoint - transform.position, Vector3.up);
   transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 2.0f);

   var forward = transform.TransformDirection(Vector3.forward);
   var targetDir = target.position - transform.position;
 ////повороачиваем пушку к цели
               
RaycastHit hit;
               
               
                if(Physics.Raycast(transform.position,transform.forward,out hit,500f)){//стрельба
                        Debug.DrawLine( transform.position, target.position, Color.red);
                       
                       
                       
                       
                       
                       
                               
                       
                        Pause ();//пауза  
                               
                               
                        if(i>0&&t>=0.5){//ждем пока счетчик обнулится  
                               
                               
                        Transform prefabinstance = (Transform)Instantiate(bullet, sp.transform.position,
                                Quaternion.identity);//создаем пулю в спавн поинт
                       
                        prefabinstance.rigidbody.velocity=transform.forward*500;//добавляем скорость пули
                        --i;//отнимаем пули
                               
                        t=0;//счетчик выстрела обнуляем 
                               
                               
                               
                        }
                       
                       
                       
                }
               
               
               
               
        }
               
        GameObject FindClosestEnemy(){//ищем ближайшую цель
               
                GameObject[] gos;
                gos = GameObject.FindGameObjectsWithTag("Player");
               
                GameObject closest=null;
               
               
                float distance = Mathf.Infinity;
                Vector3 position = transform.position;
               
                foreach(var go in gos){
               
                        var diff = (go.transform.position-position);
                        var curDistance=diff.sqrMagnitude;
                        if(curDistance<distance)
                        {
                                closest=go;
                                distance=curDistance;
                               
                        }
                }
                       
                       
                       
                       
if(closest==null)//если цели нет то возвращаем нулл
return null;
               
               
               
               
return closest;//возвращаем ближайшую цель
}
               
               
void Pause(){//пауза
               
if(t<0.5){
t+=Time.deltaTime*(1.0/_time); 
}
               
               
               
               
               
        }
       
}


Как я понял дело в скрипте, помогите его оптимизировать. :ympray:
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Помогите с оптимизацией

Сообщение BANNERTM 28 апр 2012, 20:30

Как я понял это из-за функции FindClosestEnemy(), может подскажите как его ис править или какие есть аналоги?
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Помогите с оптимизацией

Сообщение Battle Angel Alita 28 апр 2012, 20:36

Вместо поиска по тегу сделать пулл, и бегать по нему.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Помогите с оптимизацией

Сообщение BANNERTM 28 апр 2012, 20:43

Battle Angel Alita писал(а):Вместо поиска по тегу сделать пулл, и бегать по нему.

Простите , что? :-\
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Помогите с оптимизацией

Сообщение Battle Angel Alita 28 апр 2012, 21:07

Твои "враги" когда создаются то они просто кидаются на сцену. Можно кидать их не только на сцену, но и заносить в какой-нибудь заранее сделанный статический массивчик. И вместо использования FindGameObjectsWithTag просто пробегаться по этому массиву. Массивчик может быть размером гарантировано больше теоретического максимума, например 1000. Но это не эффективно. Или может быть ограниченного размера, например 10, и при убивании врага мы просто переносим его в точку откуда они спавнятся. Вот этот случай с ограниченным массивом и называется пул.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Помогите с оптимизацией

Сообщение BANNERTM 28 апр 2012, 21:38

Battle Angel Alita писал(а):Твои "враги" когда создаются то они просто кидаются на сцену. Можно кидать их не только на сцену, но и заносить в какой-нибудь заранее сделанный статический массивчик. И вместо использования FindGameObjectsWithTag просто пробегаться по этому массиву. Массивчик может быть размером гарантировано больше теоретического максимума, например 1000. Но это не эффективно. Или может быть ограниченного размера, например 10, и при убивании врага мы просто переносим его в точку откуда они спавнятся. Вот этот случай с ограниченным массивом и называется пул.


А если объектов сотня или 3? Что каждый заносить?
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Помогите с оптимизацией

Сообщение DbIMok 28 апр 2012, 21:57

еще выкинуть все ненужное из FixedUpdate (часть перенести в Update), убрать Pause...
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Помогите с оптимизацией

Сообщение Battle Angel Alita 28 апр 2012, 21:58

???
Числа 1000 и 10 были даны для примера.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Помогите с оптимизацией

Сообщение BANNERTM 28 апр 2012, 21:59

DbIMok писал(а):еще выкинуть все ненужное из FixedUpdate (часть перенести в Update), убрать Pause...

Дело в том что без этой функции(FindClosestEnemy) Все работает идеально даже при сотне объектов на сцене
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Помогите с оптимизацией

Сообщение BANNERTM 28 апр 2012, 22:02

Battle Angel Alita писал(а):???
Числа 1000 и 10 были даны для примера.

Извините,если я не понимаю, но у меня на сцене будет примерно 30 пушек, и рандомное количество врагов, которые будут спавнится отовюду(я делаю стртегию) , некоторые враги будут умирать, другие спавнится - подскажите пожалуйста как все это сделать(или натолкните на мысль) ~x(
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Помогите с оптимизацией

Сообщение Battle Angel Alita 28 апр 2012, 22:37

Рандомное хоть и рандомное, но всё-таки ограниченное какими-то рамками. Делаем большой массив, заполняем его "монстрами" с неким условным enabel = false. Когда "монстр" должен заспавниться ищем первый элемент в массиве со значением enabel = false , переносим его на место спавна и делаем enabel = true. Когда "монстра" убивают - делаем enabel = false.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Помогите с оптимизацией

Сообщение BANNERTM 29 апр 2012, 16:58

Battle Angel Alita писал(а):Рандомное хоть и рандомное, но всё-таки ограниченное какими-то рамками. Делаем большой массив, заполняем его "монстрами" с неким условным enabel = false. Когда "монстр" должен заспавниться ищем первый элемент в массиве со значением enabel = false , переносим его на место спавна и делаем enabel = true. Когда "монстра" убивают - делаем enabel = false.


А мой главный вопрос то вот в чем: этот массив нужно заполнять объектами в инспекторе?
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Помогите с оптимизацией

Сообщение BANNERTM 29 апр 2012, 18:30

Battle Angel Alita писал(а):Рандомное хоть и рандомное, но всё-таки ограниченное какими-то рамками. Делаем большой массив, заполняем его "монстрами" с неким условным enabel = false. Когда "монстр" должен заспавниться ищем первый элемент в массиве со значением enabel = false , переносим его на место спавна и делаем enabel = true. Когда "монстра" убивают - делаем enabel = false.


Хммммммммм, странно, вытащил тело функции в FixedUpdate - фпс в норме (200-300), даже при >50 пушек на карте и 20 врагов
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Помогите с оптимизацией

Сообщение Battle Angel Alita 29 апр 2012, 18:37

Зачем в инспекторе? Просто когда создаёшь врага делай не Instantiate(enemyPrefab), а enemiesArray[findFirstEmptyElement()] = Instantiate(enemyPrefab)

>Хммммммммм, странно
:ymhug:
Может боги ООП объяснят?
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: Помогите с оптимизацией

Сообщение Zaicheg 29 апр 2012, 18:44

BANNERTM писал(а):Хммммммммм, странно, вытащил тело функции в FixedUpdate - фпс в норме (200-300), даже при >50 пушек на карте и 20 врагов

FixedUpdate вызывается реже → нагрузка меньше.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец


Вернуться в Оптимизация

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

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