Влияние инкапсуляции

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Влияние инкапсуляции

Сообщение lykov 22 янв 2013, 05:44

Всем привет, интересует вопрос производительности при инкапсуляции, заметил следующую вещь, после очередного рефакторинга и внедрения инкапсуляции для всех классов, написанных на js игра стала тормозить и по статистике FPS упал с 11-10 до 7-6. Сталкивался кто-нибудь с подобной проблемой? Как решали?
Аватара пользователя
lykov
UNец
 
Сообщения: 29
Зарегистрирован: 10 дек 2012, 05:08

Re: Влияние инкапсуляции

Сообщение Syberex 22 янв 2013, 12:50

А смысл что либо инкапсулировать в js? :-\
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Влияние инкапсуляции

Сообщение DbIMok 22 янв 2013, 13:08

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

Re: Влияние инкапсуляции

Сообщение lykov 23 янв 2013, 08:14

все верно, сделал private и public переменные, вот пару скриптов:

Синтаксис:
Используется javascript
                                private var _crate : Crate;
                                function get crate() { return _crate; }
                                function set crate( value : Crate) { _crate = value; }
                               
                                public var description : String;

function Start(){
        Utils.InitializeDynamicGO(gameObject);
       
        if( !description ){
                description = "Подготовка к работе клети " + crate.number;
        }
}

function LateUpdate(){
        Indicate(crate.accident);
}

function OnMouseOver(){
        SceneManager.ShowHint(description);
}

private function Indicate( accident : Accident ){
        switch( accident ){
                case Accident.NONE: DefaultColor(); break;
                case Accident.OIL: AlarmColor(); break;
                case Accident.ELECTRICS: AlarmColor(); break;
                case Accident.MECANICS: AlarmColor(); break;
        }
}

public function AlarmColor(){
        renderer.material.color = Utils.settings.defaultColor;
}

public function DefaultColor(){
        renderer.material.color = Utils.settings.yellowColor;
}
 


Синтаксис:
Используется javascript
                                private var _crate : Crate;
                                function get crate() { return _crate; }
                                function set crate( value : Crate) { _crate = value; }
                               
                                private var currentSpeed : float = 0;
                                private var rotateDirection : Vector3;
                               
                                private var isFirst : boolean = false;
                                private var isVertical : boolean = false;
                               
                                private var _radius : float = 0;
                                function get radius() { return _radius; }
                                                               
                                public var inertPower : float = 2;
                                private var realSpeed : float = 0;
                               
                                private var timer : float;
                                private var oilTimer : float = 30;
                               
                                public var forceMode : ForceMode;
                               
                                public var collaringTime : float = 3;
                                private var timer2 : float;


function Start(){
        Utils.InitializeEngineGO(gameObject);
       
        forceMode = ForceMode.VelocityChange;
       
        if( crate.engines[1] == transform ){
        isFirst = true;
    }
   
    collider.isTrigger = false;
   
    rigidbody.mass = 2500;
    rigidbody.isKinematic = false;
    rigidbody.angularDrag = 25;
   
    InitializeRigidbody();
   
    _radius = renderer.bounds.size.x / 2;
   
    crate.CalculateSection();
   
    timer = oilTimer;
}

private function InitializeRigidbody(){
        if( crate.number == 2 || crate.number == 5 || crate.number == 8 ){
        isVertical = true;
        rigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationZ | RigidbodyConstraints.FreezePosition;
       
        if( crate.engines[2] == transform ){
                isFirst = true;
            } else {
                isFirst = false;
            }
    } else {
        rigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezePosition;
    }
}


function LateUpdate(){
        if( crate.accident == Accident.OIL ){
                timer -= Time.deltaTime;
                if( timer < 0 ){
                        crate.state = State.BROKEN;
                }
        } else if( crate.accident == Accident.NONE ){
                timer = oilTimer;
        } else {
                crate.state = State.BROKEN;
        }
       
        if( crate.state == State.ON ){ //штатный режим
                if( crate.mode != Mode.STOPPED && Mathf.Abs(currentSpeed) > 575 ){
                        crate.SetAccident(Accident.MECANICS);
                }
                RotateEngine(crate.speed);
        } else if( crate.state == State.BROKEN && crate.accident == Accident.OIL ){
                RotateEngine(0, false);
        } else {
                RotateEngine(0);
        }
       
}

private function RotateEngine(crateSpeed : float){
        RotateEngine(crateSpeed, true);
}

private function RotateEngine(crateSpeed : float, inert : boolean) {
        if( inert ){
                if( currentSpeed < crateSpeed ){
                        currentSpeed += Time.deltaTime * inertPower;
                        if( currentSpeed > crateSpeed ){
                                currentSpeed = crateSpeed;
                        }                    
                } else if( currentSpeed > crateSpeed ){
                        currentSpeed -= Time.deltaTime * inertPower;
                        if( currentSpeed < crateSpeed ){
                                currentSpeed = crateSpeed;
                        }
                }
        } else {
                currentSpeed = crateSpeed;
        }
       
        realSpeed = GetRealSpeed(currentSpeed);
       
        if( isVertical ){
                if( Utils.settings.isTorqueOn ){
                        rigidbody.AddTorque(0, realSpeed, 0, forceMode);
                }
                if( Utils.settings.isRotationOn ){
                        transform.Rotate(Vector3.back, realSpeed);
                }
        } else {
                if( Utils.settings.isTorqueOn ){
                        rigidbody.AddTorque(0, 0, realSpeed, forceMode);
                }
                if( Utils.settings.isRotationOn ){
                        transform.Rotate(Vector3.forward, realSpeed);
                }
        }
       
        if( crate.state != State.ON && realSpeed == 0 ){
                Utils.FreezeRigidbody(rigidbody);
        } else if( rigidbody.constraints == RigidbodyConstraints.FreezeAll ){
                InitializeRigidbody();
        }
}

private function GetRealSpeed( speed : float ){
        if (isFirst){
                speed *= -1;
        }
        return speed * crate.program * 0.01f * 360 * Time.deltaTime / 60; //оборот в минуту
}

function OnCollisionEnter( collision : Collision ){
        if(collision.gameObject.name == Utils.settings.billetName) {
                crate.collide = true;
        }
}

function OnCollisionStay( collision : Collision ){
        if(collision.gameObject.name == Utils.settings.billetName) {
                crate.collide = true;
                if (crate.state == State.OFF || crate.mode == Mode.STOPPED) {
                        if (!SceneManager.Get().billet.GetComponent(BilletListener).isMoving) {
                                timer -= Time.fixedDeltaTime;
                                if (timer2 < 0) {
                                        crate.SetAccident(Accident.MECANICS);
                                }
                        }
                } else {
                        timer2 = collaringTime;
                }*/
        }
}

function OnCollisionExit( collision : Collision ){
        if( collision.gameObject.name == Utils.settings.billetName ){
                crate.collide = false;
        }
}

public function StopEmergency(){
        RotateEngine(0, false);
}
 


Инкапсуляцию настраивал, чтобы не было противоречий между разными скриптами, на сцене около 50 объектов, в игре около 20 скриптов
Аватара пользователя
lykov
UNец
 
Сообщения: 29
Зарегистрирован: 10 дек 2012, 05:08

Re: Влияние инкапсуляции

Сообщение jetyb 23 янв 2013, 09:51

по статистике FPS упал с 11-10 до 7-6.

И 11 fps это весьма плохо. Точно тормозят именно скрипты? Сколько ms занимает update скриптов в профилере?
А так, рефакторинг замедляет работу, но не сильно(если не сравнивать с жесткой оптимизацией).

По поводу написанного: не надо обращаться к компонентам каждый раз, надо завести на них ссылку
т.е. вместо
transform.position = ...
писать
thisTransform.position = ...

Литералы в скриптах лучше писать сразу в single формате (вместо 5 писать 5f), чтоб лишний раз не производились преобразования типов.
http://docs.unity3d.com/Documentation/S ... ation.html

Еще мне не нравятся постоянные обращения к rigidbody и transform в апдейте.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Влияние инкапсуляции

Сообщение lykov 23 янв 2013, 10:43

За ссылочку огромное спасибо, по статистике не совсем понимаю что такое профилер, относительно недавно работаю на юнити, вот скрин со статистикой, здесь есть информация о которой Вы спросили?
https://www.dropbox.com/s/9jaw7kty48r7oz1/stats.png
Аватара пользователя
lykov
UNец
 
Сообщения: 29
Зарегистрирован: 10 дек 2012, 05:08

Re: Влияние инкапсуляции

Сообщение seaman 23 янв 2013, 11:12

10 M трианглов! А Вы о какой-то инкапсуляции...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Влияние инкапсуляции

Сообщение lykov 23 янв 2013, 11:30

В другом ракурсе 20М, но игра работает достаточно хорошо и детализация достойная, всевозможные статические объекты настроены статично, также не имеют mesh collider и т.п.
Аватара пользователя
lykov
UNец
 
Сообщения: 29
Зарегистрирован: 10 дек 2012, 05:08

Re: Влияние инкапсуляции

Сообщение Medveckij 23 янв 2013, 12:37

Ну, наделать моделей с высоким количеством полигонов ума много не надо. 20 лямов - по-моему через чур... Тут нужно не код оптимизировать, a начать с моделей. У вас цилиндры на сцене все сглаженные как попка младенца. А можно сеточку?
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: Влияние инкапсуляции

Сообщение lykov 24 янв 2013, 05:47

Вот скрины, сделал несколько:
https://www.dropbox.com/s/4er0wt5qiayqxby/grid.png
https://www.dropbox.com/s/epswpabuot68dug/grid2.png
https://www.dropbox.com/s/nb6x90ytwua7htg/grid3.png

Многие мелкие объекты, как на первом скрине имеют активную настройку Convex в MeshCollider, полагаю это тоже должно немного влиять на оптимизацию.
Аватара пользователя
lykov
UNец
 
Сообщения: 29
Зарегистрирован: 10 дек 2012, 05:08

Re: Влияние инкапсуляции

Сообщение seaman 24 янв 2013, 06:46

Ужас.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Влияние инкапсуляции

Сообщение waruiyume 24 янв 2013, 06:51

Многие мелкие объекты, как на первом скрине имеют активную настройку Convex в MeshCollider, полагаю это тоже должно немного влиять на оптимизацию.

Таки да, влияют, правда в худшую сторону, если используется CharacterController.
--
Модели- жесть, одно только, удаление поперечных рёбер цилиндров, сделает полигонаж раз в 10 меньше %%-
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Влияние инкапсуляции

Сообщение jetyb 24 янв 2013, 06:53

:facepalm: Моделлера гнать нафиг, столько полигонов на небольшую комнату еще не всякая тесселяция даст. Качество графики при этом кстати тянет на игры 10+ летней давности.
Тут вообще текстуры есть? Такое впечатление, что используются только одноцветные материалы. И зачем цилиндр еще поперек несколько раз перерезать?
С такими моделями и на топ железе ни один движок нормальный fps не выдаст.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Влияние инкапсуляции

Сообщение Medveckij 24 янв 2013, 08:17

to jetyb:

А зачем так сразу набрасываться? Что то мне подсказывает, что модели делал сам многоуважаемый, либо скачал с интернета и не оптимизировал.


to waruiyume:

О чем я и написал выше.


to lykov:

сократить полигонаж и сделать второй вариант моделей с мизерным количеством полигонов. Подгружать клоны на дальней дистанции, где детализация не важна. Кстати, зачем вам mesh collider? Какую конкретную роль они играют в данной сцене?
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: Влияние инкапсуляции

Сообщение lykov 24 янв 2013, 10:14

Таки да, влияют, правда в худшую сторону, если используется CharacterController.

Подскажите пожалуйста в каком смысле если используются, на сцене есть один овальный объект Player (стандартный префаб юнити от 1го лица) c CharacterController, в этом случае лучше отключать Convex ?

MeshCollider используется для определения события OnMouseOver, т.к. в этом случае появляется подсказка "Ключ управления ..." и т.п.

Тут вообще текстуры есть?

Есть, но это первый опыт, буду признателен, если кто-нибудь напишет пару советов по этому вопросу. В сцене основные действия это повороты объектов, вращение цилиндров на конвеере, движение балки по конвееру, ее деформация, остальные объекты статические, что здесь можно оптимизировать текстурами? Вращение объектов делаю через Rotate, балка движется по цилиндрам за счет AddTorque, есть проблемы с инерцией конечно и не до конца понятно, как тут м/с получить.

Что то мне подсказывает, что модели делал сам многоуважаемый, либо скачал с интернета и не оптимизировал.

Модели делали сами, в инете таких не найдете, но делал не я, я программист. А разрабатывали их на 3d max, но я в нем не силен и полагаю теперь, что 3д художник, который их делал, тоже не имеет опыта в разработке моделей для игр.
Аватара пользователя
lykov
UNец
 
Сообщения: 29
Зарегистрирован: 10 дек 2012, 05:08

След.

Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 19