forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Можно ли оптимизировать (http://forum.boolean.name/showthread.php?t=20637)

nikikust 02.08.2017 17:48

Можно ли оптимизировать
 
Здравствуйте, я начал более углублённо изучать BM и решил начать с типов. Изучал я их по примерам и некоторым статьям. Я хотел узнать, можно ли как-нибудь мою программку оптимизировать (вывод,обработку...). Заранее спасибо:) .

Код:

Const W=1920
Const H=1080
Const Gravity#=.15
Const maxsparks=55

HideMouse
Graphics W,H,32,60
Global LSparks:TList=CreateList()
AutoMidHandle(True)

Type TSpark
        Field x#,y#,xs#,ys#,ang,angs,r,g,b
       
        Function Create(x,y,r,g,b)
                Local Spark:TSpark=New TSpark
                Local an#=Rnd(360),sp#=Rnd(2,5)
                Spark.x=x
                Spark.y=y
                Spark.xs#=Cos(an#)*sp
                Spark.ys#=Sin(an#)*sp
                Spark.r=r
                Spark.g=g
                Spark.b=b
                Spark.angs=Rnd(1,10)
                Spark.ang=0
                LSparks.Addlast(Spark)
        EndFunction
       
        Method Remove()
                LSparks.remove(Self)
        EndMethod
       
        Function Update()
                For Local Spark:TSpark=EachIn LSparks
                        Spark.x#:+Spark.xs#
                        Spark.y#:+Spark.ys#
                        Spark.ang:+Spark.angs
                        Spark.ys#:+Gravity#
                       
                        SetRotation Spark.ang
                        SetColor Spark.r,Spark.g,Spark.b
                        SetHandle 8,8
                        DrawRect Spark.x,Spark.y,17,17
                       
                        If Spark.y>H+17 Then Spark.Remove
                       
                        SetColor 255,255,255
                        SetRotation 0
                Next
        EndFunction
EndType

While Not KeyDown(Key_escape)
        Cls
        DrawRect MouseX(),MouseY(),17,17
        SetAlpha 0.5
        SetBlend LIGHTBLEND
        If MouseDown(1) Then
                For Local crsps=1 To maxsparks
                        r=Rnd(255)
                        g=Rnd(255)
                        b=Rnd(255)
                        TSpark.Create(MouseX(),MouseY(),r,g,b)       
                Next
        EndIf
       
        If KeyHit(KEY_D) Then debug=1-debug
       
        If debug Then
                DrawText "MemAlloced="+GCMemAlloced(),10,10
        EndIf
        TSpark.Update
        Flip
Wend


ABTOMAT 03.08.2017 02:53

Ответ: Можно ли оптимизировать
 
Что именно нужно оптимизировать? Или это оптимизация ради оптимизации? Вроде, нормально всё (внимательно не вычитывал, но выглядит как будто всё нормально, можно продолжать).
Какие конкретно части на твой взгляд работают неоптимально?

nikikust 03.08.2017 11:52

Ответ: Можно ли оптимизировать
 
Спасибо за ответ. Я не утверждаю, что у меня в программе что-то не так, просто я только начал разбираться и вдруг есть более удобный (или более короткий) способ создания или отображения частиц (без всяких команд которые знают только супер профессионалы).

Randomize 03.08.2017 13:01

Ответ: Можно ли оптимизировать
 
Предварительно создать максимальное кол-во частиц и оперировать готовыми сущностями?

nikikust 03.08.2017 13:14

Ответ: Можно ли оптимизировать
 
Спасибо за идею

oxid 06.08.2017 01:08

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 - предварительный кеш объектов не помешает - можно добавить для этого метод/функцию.
Пожалуйста.


Часовой пояс GMT +4, время: 21:40.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot