Большая проблема с оптимизацией

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

Re: Большая проблема с оптимизацией

Сообщение Lestar 26 июн 2011, 21:17

Задам в третий раз наводящий вопрос.Как вы спавните моба ? Вы можете привести полный листинг или это военная тайна,раскрытие которой карается расстрелом?И на момент спавна сделаете скриншот полностью развернутого профайлера.
Lestar
UNIт
 
Сообщения: 114
Зарегистрирован: 05 июн 2011, 02:36

Re: Большая проблема с оптимизацией

Сообщение Alcatraz 26 июн 2011, 22:01

всё вы со своими шуточками!... завтра отскриню профилер (щас с мобы) а код простой, без листингов обошёлся пока что.
код не весь помню, вот что помню:

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

public class Respawner : MonoBehaviour
{

public GameObject enemePrefab;
public  float nextSpawn = 10.0f;
public float spawnRange = 4.0f;

void Update()
{

if(Time.time > nextSpawn)
{
Respawn();
spawnRange -= Random.Range(0.1, 0.5);
nextSpawn = Time.time + spawnRange;
}

}

public void Respawn()
{

GameObject[] enemyNum
= GameObjects.FindGameObjectsWithTag("Enemy");

if(enemyNum.Lenght < 10)
{
// тут расчёт переменной position, не очень //помню на память что тут..
Instantiate(enemyPrefab, transform.position, transform.rotation);
}

}
 
Unity3D Game Developer
Аватара пользователя
Alcatraz
UNITрон
 
Сообщения: 236
Зарегистрирован: 07 июн 2011, 09:12
Откуда: Москва
  • Сайт
  • ICQ

Re: Большая проблема с оптимизацией

Сообщение seaman 26 июн 2011, 22:10

Имхо лучше сделать
Синтаксис:
Используется csharp
static class EnemyCount
{
   static int enemies;
}

И при спауне:
Синтаксис:
Используется csharp
EnemyCount.enemies++;

а при смерти врага
Синтаксис:
Используется csharp
EnemyCount.enemies--;

Тогда не нужно при спауне искать всех врагов - их число уже есть в EnemyCount.enemies
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Большая проблема с оптимизацией

Сообщение Alcatraz 26 июн 2011, 22:59

Точняк, спасибо, завтра попробую) :)
Unity3D Game Developer
Аватара пользователя
Alcatraz
UNITрон
 
Сообщения: 236
Зарегистрирован: 07 июн 2011, 09:12
Откуда: Москва
  • Сайт
  • ICQ

Re: Большая проблема с оптимизацией

Сообщение Alcatraz 27 июн 2011, 22:13

Посмотрел в Profiler'e, во время падения фпс до 5 и меньше, около 87 % нагрузки, идёт от Physics.RayCast -> LegAnimator.cs.Start(), тобишь из void Start, в скрипте (LegAnimator.cs), а LegAnimator.cs, это у нас Locomotion System.. только ничего странного в void Start(), не нашел... :-?
Unity3D Game Developer
Аватара пользователя
Alcatraz
UNITрон
 
Сообщения: 236
Зарегистрирован: 07 июн 2011, 09:12
Откуда: Москва
  • Сайт
  • ICQ

Re: Большая проблема с оптимизацией

Сообщение Zaicheg 27 июн 2011, 22:56

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

Re: Большая проблема с оптимизацией

Сообщение Alcatraz 27 июн 2011, 23:19

Да понял я..просто инет вырубили.. только с 1-го июля будет!..

п.с: по этому щас с мобы..
Unity3D Game Developer
Аватара пользователя
Alcatraz
UNITрон
 
Сообщения: 236
Зарегистрирован: 07 июн 2011, 09:12
Откуда: Москва
  • Сайт
  • ICQ

Re: Большая проблема с оптимизацией

Сообщение Alcatraz 02 июл 2011, 10:34

вот скрины:

1) http://savepic.ru/2817477.png
2) http://savepic.ru/2807237.png

Заранее благодарен за подсказки и помощь с оптимизацией) :)
Unity3D Game Developer
Аватара пользователя
Alcatraz
UNITрон
 
Сообщения: 236
Зарегистрирован: 07 июн 2011, 09:12
Откуда: Москва
  • Сайт
  • ICQ

Re: Большая проблема с оптимизацией

Сообщение Lestar 02 июл 2011, 11:32

Покажите скрипт LegAnimator.И не понятно,что делает Reycast в Start().
Lestar
UNIт
 
Сообщения: 114
Зарегистрирован: 05 июн 2011, 02:36

Re: Большая проблема с оптимизацией

Сообщение Alcatraz 02 июл 2011, 12:29

вот скрипт, он из Locomotion System. код метода Start() и переменные (на всякий случай):

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

public enum LegCyclePhase {
        Stance, Lift, Flight, Land
}

public class LegState {
        // Past and future step
        public Vector3 stepFromPosition;
        public Vector3 stepToPosition;
        public Vector3 stepToPositionGoal;
        public Matrix4x4 stepFromMatrix;
        public Matrix4x4 stepToMatrix;
        public float stepFromTime;
        public float stepToTime;
       
        public int stepNr = 0;
       
        // Continiously changing foot state
        public float cycleTime = 1;
        public float designatedCycleTimePrev = 0.9f;
        public Vector3 hipReference;
        public Vector3 ankleReference;
        public Vector3 footBase;
        public Quaternion footBaseRotation;
        public Vector3 ankle;
       
        // Foot cycle event time stamps
        public float stanceTime   = 0;
        public float liftTime     = 0.1f;
        public float liftoffTime  = 0.2f;
        public float postliftTime = 0.3f;
        public float prelandTime  = 0.7f;
        public float strikeTime   = 0.8f;
        public float landTime     = 0.9f;
       
        public LegCyclePhase phase = LegCyclePhase.Stance;
       
        // Standing logic
        public bool parked;
       
        // Cycle properties
        public Vector3 stancePosition;
        public Vector3 heelToetipVector;
       
        public List<string> debugHistory = new List<string>();
       
        public float GetFootGrounding(float time) {
                if ( (time<=liftTime) || (time>=landTime) ) return 0;
                if ( (time>=postliftTime) && (time<=prelandTime) ) return 1;
                if ( time<postliftTime ) {
                        return (time-liftTime)/(postliftTime-liftTime);
                }
                else {
                        return 1-(time-prelandTime)/(landTime-prelandTime);
                }
        }
}

public class MotionGroupState {
        public AnimationState controller;
        public float weight;
        public AnimationState[] motionStates;
        public float[] relativeWeights;
        public float[] relativeWeightsBlended;
        public int primaryMotionIndex;
}

[RequireComponent(typeof(LegController))]
[RequireComponent(typeof(AlignmentTracker))]
public class LegAnimator : MonoBehaviour {
       
        public bool startAutomatically = true;
        public bool useIK = true;
        public float maxFootRotationAngle = 45.0f;
        public float maxIKAdjustmentDistance = 0.5f;
       
        // Step behavior settings
        public float minStepDistance = 0.2f; // Model dependent, thus no better default
        public float maxStepDuration = 1.5f; // Sensible for most models
        public float maxStepRotation = 160; // Sensible for most models, must be less than 180
        public float maxStepAcceleration = 5.0f; // Model dependent, thus no better default
        public float maxStepHeight   = 1.0f;
        public float maxSlopeAngle = 60; // Sensible for most models, must be less than 90
       
        // Transition behavior settings
        public bool enableLegParking = true;
        public float blendSmoothing = 0.2f;
        public LayerMask groundLayers = 1; // Default layer per default
       
        // Tilting settings
        public float groundHugX = 0; // Sensible for humanoids
        public float groundHugZ = 0; // Sensible for humanoids
        public float climbTiltAmount = 0.5f; // Sensible default value
        public float climbTiltSensitivity = 0.0f; // None as default
        public float accelerateTiltAmount = 0.02f; // Sensible default value
        public float accelerateTiltSensitivity = 0.0f; // None as default;
       
        // Debug settings
        public bool renderFootMarkers = false;
        public bool renderBlendingGraph = false;
        public bool renderCycleGraph = false;
        public bool renderAnimationStates = false;
       
        private bool isActive;
        private float currentTime;
       
        private LegController legC;
        private AlignmentTracker tr;
        private LegInfo[] legs;
        private LegState[] legStates;
       
        private Vector3 position;
        private float speed;
        private float hSpeedSmoothed;
        private Vector3 objectVelocity;
        private Vector3 usedObjectVelocity;
        private Quaternion rotation;
        private Vector3 up;
        private Vector3 forward;
        private float scale;
        private Vector3 baseUpGround;
        private Vector3 bodyUp;
        private Vector3 legsUp;
        private float accelerationTiltX;
        private float accelerationTiltZ;
       
        private AnimationState controlMotionState;
        private MotionGroupState[] motionGroupStates;
        private AnimationState[] nonGroupMotionStates;
        private float[] nonGroupMotionWeights;
       
        private AnimationState[] motionStates;
        private AnimationState[] cycleMotionStates;
        private float[] motionWeights;
        private float[] cycleMotionWeights;
        private float summedMotionWeight;
        private float summedCycleMotionWeight;
        private float locomotionWeight;
       
        private float cycleDuration;
        private float cycleDistance;
        private float normalizedTime;
       
        private bool updateStates = true;
       
        [System.NonSerialized]
        public GameObject ghost;
       
        private Dictionary<string,TrajectoryVisualizer> trajectories
                = new Dictionary<string,TrajectoryVisualizer>();
       
        [Conditional("VISUALIZE")]
        void AddTrajectoryPoint(string name, Vector3 point) {
                trajectories[name].AddPoint(Time.time,point);
        }
       
        [Conditional("DEBUG")]
        void Assert(bool condition, string text) {
                if (!condition) UnityEngine.Debug.LogError(text);
        }
       
        [Conditional("DEBUG")]
        void AssertSane(float f, string text) {
                if (!Util.IsSaneNumber(f)) UnityEngine.Debug.LogError(text+"="+f);
        }
       
        [Conditional("DEBUG")]
        void AssertSane(Vector3 vect, string text) {
                if (!Util.IsSaneNumber(vect.x)
                        || !Util.IsSaneNumber(vect.y)
                        || !Util.IsSaneNumber(vect.z)
                ) UnityEngine.Debug.LogError(text+"="+vect);
        }
       
        [Conditional("DEBUG")]
        void AssertSane(Quaternion q, string text) {
                if (!Util.IsSaneNumber(q.x)
                        || !Util.IsSaneNumber(q.y)
                        || !Util.IsSaneNumber(q.z)
                        || !Util.IsSaneNumber(q.w)
                ) UnityEngine.Debug.LogError(text+"="+q);
        }
       
        void Start () {
                tr = GetComponent(typeof(AlignmentTracker)) as AlignmentTracker;
                legC = GetComponent(typeof(LegController)) as LegController;
                legs = legC.legs;
                if (!legC.initialized) {
                        UnityEngine.Debug.LogError(name+": Locomotion System has not been initialized.",this);
                        enabled = false;
                }
               
                legStates = new LegState[legs.Length];
               
                updateStates = true;
                ResetMotionStates();
                ResetSteps();
               
                isActive = false;
               
                for (int leg=0; leg<legs.Length; leg++) {
                        trajectories.Add(
                                "leg"+leg+"heel",
                                new TrajectoryVisualizer(legs[leg].debugColor, 3)
                        );
                        trajectories.Add(
                                "leg"+leg+"toetip",
                                new TrajectoryVisualizer(legs[leg].debugColor, 3)
                        );
                        trajectories.Add(
                                "leg"+leg+"footbase",
                                new TrajectoryVisualizer(legs[leg].debugColor, 3)
                        );
                }
        }
 
Unity3D Game Developer
Аватара пользователя
Alcatraz
UNITрон
 
Сообщения: 236
Зарегистрирован: 07 июн 2011, 09:12
Откуда: Москва
  • Сайт
  • ICQ

Re: Большая проблема с оптимизацией

Сообщение Alcatraz 02 июл 2011, 14:13

скорее всего дело в 2-х вызываемых в Start, методах, их код:

Синтаксис:
Используется csharp
private void ResetMotionStates() {
                motionStates = new AnimationState[legC.motions.Length];
                cycleMotionStates = new AnimationState[legC.cycleMotions.Length];
                motionWeights = new float[legC.motions.Length];
                cycleMotionWeights = new float[legC.cycleMotions.Length];
                nonGroupMotionWeights = new float[legC.nonGroupMotions.Length];
               
                // Create control motion state
                controlMotionState = animation["LocomotionSystem"];
                if (controlMotionState==null) {
                        // Create dummy animation state with control motion name
                        animation.AddClip(new AnimationClip(), "LocomotionSystem");
                        controlMotionState = animation["LocomotionSystem"];
                }
                controlMotionState.enabled = true;
                controlMotionState.wrapMode = WrapMode.Loop;
                controlMotionState.weight = 1;
                controlMotionState.layer = 10000;
               
                // Create motion states
                motionGroupStates = new MotionGroupState[legC.motionGroups.Length];
                int cm = 0;
                for (int m=0; m<legC.motions.Length; m++) {
                        motionStates[m] = animation[legC.motions[m].name];
                        if (motionStates[m]==null) {
                                animation.AddClip(legC.motions[m].animation, legC.motions[m].name);
                                motionStates[m] = animation[legC.motions[m].name];
                        }
                        motionStates[m].wrapMode = WrapMode.Loop;
                        if (legC.motions[m].motionType==MotionType.WalkCycle) {
                                cycleMotionStates[cm] = motionStates[m];
                                cycleMotionStates[cm].speed = 0;
                                cm++;
                        }
                }
               
                // Create motion group states
                for (int g=0; g<motionGroupStates.Length; g++) {
                        AnimationState controller = animation[legC.motionGroups[g].name];
                        if (controller==null) {
                                // Create dummy animation state with motion group name
                                animation.AddClip(new AnimationClip(), legC.motionGroups[g].name);
                                controller = animation[legC.motionGroups[g].name];
                        }
                        controller.enabled = true;
                        controller.wrapMode = WrapMode.Loop;
                        if (startAutomatically && g==0) controller.weight = 1;
                       
                        // Create state for this motion group
                        motionGroupStates[g] = new MotionGroupState();
                        motionGroupStates[g].controller = controller;
                        motionGroupStates[g].motionStates = new AnimationState[legC.motionGroups[g].motions.Length];
                        motionGroupStates[g].relativeWeights = new float[legC.motionGroups[g].motions.Length];
                        for (int m=0; m<motionGroupStates[g].motionStates.Length; m++) {
                                motionGroupStates[g].motionStates[m] =
                                        animation[legC.motionGroups[g].motions[m].name];
                        }
                        motionGroupStates[g].primaryMotionIndex = 0;
                }
               
                // Create list of motions states that are not in motions groups
                nonGroupMotionStates = new AnimationState[legC.nonGroupMotions.Length];
                for (int m=0; m<legC.nonGroupMotions.Length; m++) {
                        nonGroupMotionStates[m] = animation[legC.nonGroupMotions[m].name];
                        if (nonGroupMotionStates[m]==null) {
                                animation.AddClip(legC.nonGroupMotions[m].animation, legC.nonGroupMotions[m].name);
                                nonGroupMotionStates[m] = animation[legC.nonGroupMotions[m].name];
                                nonGroupMotionWeights[m] = nonGroupMotionStates[m].weight;
                        }
                }
               
                for (int leg=0; leg<legs.Length; leg++) {
                        legStates[leg] = new LegState();
                }
        }
       
        private void ResetSteps() {
                up = transform.up;
                forward = transform.forward;
                baseUpGround = up;
                legsUp = up;
                accelerationTiltX = 0;
                accelerationTiltZ = 0;
                bodyUp = up;
               
                tr.Reset();
               
                for (int leg=0; leg<legs.Length; leg++) {
                        legStates[leg].stepFromTime = Time.time-0.01f;
                        legStates[leg].stepToTime = Time.time;
                       
                        legStates[leg].stepFromMatrix = FindGroundedBase(
                                transform.TransformPoint(legStates[leg].stancePosition/scale),
                                transform.rotation,
                                legStates[leg].heelToetipVector,
                                false
                        );
                        legStates[leg].stepFromPosition = legStates[leg].stepFromMatrix.GetColumn(3);
                       
                        legStates[leg].stepToPosition = legStates[leg].stepFromPosition;
                        legStates[leg].stepToMatrix = legStates[leg].stepFromMatrix;
                }
                normalizedTime = 0;
               
                cycleDuration = maxStepDuration;
                cycleDistance = 0;
        }
 
Unity3D Game Developer
Аватара пользователя
Alcatraz
UNITрон
 
Сообщения: 236
Зарегистрирован: 07 июн 2011, 09:12
Откуда: Москва
  • Сайт
  • ICQ

Re: Большая проблема с оптимизацией

Сообщение Lestar 02 июл 2011, 14:44

Нет,в этих простынях я разбираться не буду.Я не имею столько свободного времени.Исключайте из Start попеременно инструкции и ищете что грузит.
Lestar
UNIт
 
Сообщения: 114
Зарегистрирован: 05 июн 2011, 02:36

Re: Большая проблема с оптимизацией

Сообщение Alcatraz 02 июл 2011, 14:53

ок, я уже много всего перепробовал.. :-B попробую ещё порытся..
Unity3D Game Developer
Аватара пользователя
Alcatraz
UNITрон
 
Сообщения: 236
Зарегистрирован: 07 июн 2011, 09:12
Откуда: Москва
  • Сайт
  • ICQ

Re: Большая проблема с оптимизацией

Сообщение Zaicheg 02 июл 2011, 15:15

Alcatraz писал(а):нет, предупреждения и сообщения, у врага появляются, и при спавне тормоза, с кубом, всё было идеально..

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

Re: Большая проблема с оптимизацией

Сообщение Alcatraz 02 июл 2011, 15:29

не, ошибок нет! :)
Unity3D Game Developer
Аватара пользователя
Alcatraz
UNITрон
 
Сообщения: 236
Зарегистрирован: 07 июн 2011, 09:12
Откуда: Москва
  • Сайт
  • ICQ

Пред.След.

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

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

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