Показать сообщение отдельно
Старый 06.08.2017, 01:08   #6
oxid
Нуждающийся
 
Регистрация: 20.08.2006
Сообщений: 54
Написано 3 полезных сообщений
(для 4 пользователей)
Re: Можно ли оптимизировать

1. Для лучшей наглядности надо перенести Global LSparks:TList=CreateList() в тип:
Type TSpark
Global LSparks:TList = CreateList()
...
2. Если ВМ не форкнутый, то в нем косяк с наследованием функций типов и если ты в дальнейшем будешь наследоваться от TSpark, то с Function Create будут проблемы с другим типом аргументов и другим возвращаемым значением.
Солюшны:
а) фиксить ВМ (он же в исходниках теперь)
б) вынести функцию за тип в глобальное пространство имен и назвать как-то CreateTSpark
в) не наследоваться или не использовать в наследниках переопределение функции Create
г) флоу-подход типа: new TSpark().initSpark(...) - т.е. заменить функцию Create на методы.
д) сделать все на общих типах Object с последующим явным приведением к нужному типу: function create:Object( arguments:Object )
3. Как правило функции и методы для создания инициализации возвращают значение экземпляра, а не ничего. Хорошо бы добавить в конец Create такое действие: return Spark, предварительно, конечно немного изменив ее описание на Function Create:TSpark(x,y,r,g,b)
4. Удалять из списка по значению (как у тебя LSparks.remove(Self) ) - долгая операция, чем больше список, тем дольше. Пользуйся классом TLink в котором и хранится и само значение и ссылки на другие линки.
Добавляем в тип поле link:TLink. Значение получаем в операции добавления значения в список: link = LSparks.Addlast(Spark)
Удалять, соответсвенно вместо LSparks.remove(Self) - пишем: link.remove()
5. Еще по наглядности и удобности советую все поля вынести по отдельным строкам
Field x#
Field y#
...
field link:TLink
Для
а) Добавления комментариев по назначению полей
б) для убирания(навсегда или щадяще - комментированием)/добавления ненужных/новых полей
6. Вместо отдельного вызова sin и cos можно вызывать совместный sincos - это быстрее раза в 2 или больше - т.к. для каждого вызова используется загрузка регистров сопра, ожидание его ответа. Один раз это сделать быстрее чем два. Модуль можно написать самому или взять бесплатно и без регистрации здесь http://blitzmax.3dn.ru/load/11-1-0-10
7. И если уж совсем заморачиваться, то для рандома можно свое что-то заюзать на xor-ах есть быстрые алгоритмы псевдорандомов.
8. Использовать пул для TSpark. Для этого очень хорошо подходит уже имеющаяся функция Create, только сам пул добавить. Но пулы надо юзать очень осторожно.
Как-то так.
По безгиморной оптимизации на чистом ВМ только п.4 и присодиняюсь к Randomize - предварительный кеш объектов не помешает - можно добавить для этого метод/функцию.
Пожалуйста.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
nikikust (07.08.2017)