2016-05-02 8 views
0

Я пишу сценарий экспорта анимации для своей сцены, и мне нужно обнаружить только те фреймы, в которых появляются клавиши анимации для некоторых объектов сцены. Мне нужно экспортировать только часть (временной интервал) всей анимации.Получите все анимированные кадры в интервале эффективно

В настоящее время я использую код последующие

keys = #() 
for o in objects do 
(
    join keys o.position.controller.keys 
    join keys o.rotation.controller.keys 
    join keys o.scale.controller.keys 
) 

собрать все ключи для всех объектов, а затем

timeValues = (for k in keys where k.time >= animationRange.start and k.time <= animationRange.end collect k.time) as array 
timeValues = makeUniqueArray timeValues 

для выбора интервала времени и падение дупликации.

Но проблема в том, что моя сцена содержит около 3000 кадров в общей сложности с множеством различных анимированных объектов с положением, поворотом и клавишами масштабирования. Так ключи дублируются много раз в моей коллекции «ключи» - всего около 1 000 000 ключей.

Мне нужно выбрать ключи за небольшой промежуток времени (около 50 кадров), но поскольку коллекция очень большая, потребовалось много времени (около минуты), чтобы выбрать нужные клавиши и удалить дубликаты.

Есть ли способ получить все кадры с анимационными клавишами за указанный промежуток времени более эффективно?

ответ

1

Поскольку количество кадров не часто обращается к миллионам, использование bitarray должно быть как быстрее, так и более эффективным с точки зрения памяти. Компромисс заключается в том, что он может хранить только значения, равные одному или более, - если ключи начинаются с нулевого кадра, сохраняйте их время + 1; для отрицательных клавиш соответствующим образом отрегулируйте смещение.

frames = #{} 

for o in objects do 
(
    for key in o.position.controller.keys do append frames key.time 
    for key in o.rotation.controller.keys do append frames key.time 
    for key in o.scale.controller.keys do append frames key.time 
) 

frames.count = animationRange.end 
frames