AnimatedTexture: о том, что плохо\хорошо

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

AnimatedTexture: о том, что плохо\хорошо

Сообщение gnoblin 13 окт 2010, 16:19

Давно хотел провести сравнительные тесты по производительности разных подходов к анимированию текстуры.

В стандартном случае (я так всё время раньше делал, такой пример есть на википедии) работа ведется с renderer.material.offset\scale.
Минусом такого подходом является то, что при изменении смещения текстуры на одном объекте создается копия материала в памяти и они не бачатся.

Тест первых двух способов:
200 квадов (2 треугольника, 4 вершины), dynamic batching включен
1. "material offset"
результаты: 330 fps, 200 draw calls, 0 batched
2. "swap meshes" (при запуске композиции на каждый кадр анимации создается копия меша, кадр переключается через MeshFilter.mesh = frames[index], материал на всех квадах один и тот же)
результаты: 615 fps, 1 draw calls, 200 batched

Вывод: material.offset - говно :D

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

public class MatOffsetAnimScript : MonoBehaviour
{
            //vars for the whole sheet
        int colCount =  4;
        int rowCount =  4;

        //vars for animation
        int rowNumber =  0; //Zero Indexed
        int colNumber =  0; //Zero Indexed
        int totalCells =  4;
        public int fps = 10;
        Vector2 offset;  //Maybe this should be a private var

        MeshFilter mf;

        void Start()
        {
            mf = gameObject.GetComponent<MeshFilter>();
        }

        //Update
        void Update () { SetSpriteAnimation(colCount,rowCount,rowNumber,colNumber,totalCells,fps);  }

        //SetSpriteAnimation
        void SetSpriteAnimation(int colCount,int rowCount,int rowNumber,int colNumber, int totalCells, int fps)
        {

            // Calculate index
            int index = (int)Time.time * fps;
            // Repeat when exhausting all cells
            index = index % totalCells;
           
            // Size of every cell
            Vector2 size = new Vector2 (1.0f / colCount, 1.0f / rowCount);
           
            // split into horizontal and vertical index
            int uIndex = index % colCount;
            int vIndex = index / colCount;
         
            // build offset
            // v coordinate is the bottom of the image in opengl so we need to invert.
            ////Vector2 offset = new Vector2 ((uIndex+colNumber) * size.x, (1.0f - size.y) - (vIndex+rowNumber) * size.y);
           
            //type1
            //renderer.material.SetTextureOffset ("_MainTex", offset);
            ////renderer.material.SetTextureScale  ("_MainTex", size);

            mf.mesh = FrameHolder.singleton.frames[uIndex];
        }
}
using UnityEngine;
using System.Collections;

public class FrameHolder : MonoBehaviour
{
    [HideInInspector]
    public Mesh[] frames;

    public Mesh source_mesh;

    public static FrameHolder singleton;

    void Awake()
    {
        singleton = this;

        int n=4;
        frames = new Mesh[n];
        float step = 1f/n;

        for(int i=0; i<n; i++)
        {
            frames[i] = (Mesh)Instantiate(source_mesh);

            frames[i].uv = new Vector2[] { new Vector2(i * step + 0, 0), new Vector2(i * step + step, 0), new Vector2(i * step + 0, step), new Vector2(i * step + step, step) };
        }
    }
}
 
У вас нет доступа для просмотра вложений в этом сообщении.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: AnimatedTexture: о том, что плохо\хорошо

Сообщение Paul Siberdt 13 окт 2010, 16:31

Очень верным путём идете, господин хороший :)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: AnimatedTexture: о том, что плохо\хорошо

Сообщение Neodrop 13 окт 2010, 16:32

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

Re: AnimatedTexture: о том, что плохо\хорошо

Сообщение gnoblin 13 окт 2010, 16:33

Если менять меши и выключить динамик бачинг - то фпс на 30-35 выше чем в случае с изменением оффсета материала.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: AnimatedTexture: о том, что плохо\хорошо

Сообщение gnoblin 13 окт 2010, 17:24

еще получается подсвечивать объекты при наведении и прятать\показывать плавно надо не через material.color.a, а через вертексные цвета :)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: AnimatedTexture: о том, что плохо\хорошо

Сообщение Neodrop 13 окт 2010, 17:53

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

Re: AnimatedTexture: о том, что плохо\хорошо

Сообщение Paul Siberdt 13 окт 2010, 18:06

Нео.. если в хаде разок изменить альфу кнопки, она навсегда склонирует материал. Если таких кнопок - 10 - получим 10 дравчиков.
У меня кристаллы при рождении выблендиваются, соответственно, сразу клонили новый материал и добавляли под себя дравкол. Именно вертексный бленд собрал все кристаллы вместе. :)

А если подумать про пропадание/проявление геометрии, что мешает обзору камеры, вертексный бленд окажется благодатью.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: AnimatedTexture: о том, что плохо\хорошо

Сообщение Neodrop 13 окт 2010, 18:09

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


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

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

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