Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax > 2D-программирование

Ответ
 
Опции темы
Старый 02.08.2017, 17:48   #1
nikikust
AnyKey`щик
 
Регистрация: 01.08.2017
Сообщений: 18
Написано 0 полезных сообщений
(для 0 пользователей)
Можно ли оптимизировать

Здравствуйте, я начал более углублённо изучать 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
(Offline)
 
Ответить с цитированием
Старый 03.08.2017, 02:53   #2
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Можно ли оптимизировать

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

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 03.08.2017, 11:52   #3
nikikust
AnyKey`щик
 
Регистрация: 01.08.2017
Сообщений: 18
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Можно ли оптимизировать

Спасибо за ответ. Я не утверждаю, что у меня в программе что-то не так, просто я только начал разбираться и вдруг есть более удобный (или более короткий) способ создания или отображения частиц (без всяких команд которые знают только супер профессионалы).
(Offline)
 
Ответить с цитированием
Старый 03.08.2017, 13:01   #4
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Можно ли оптимизировать

Предварительно создать максимальное кол-во частиц и оперировать готовыми сущностями?
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
nikikust (07.08.2017)
Старый 03.08.2017, 13:14   #5
nikikust
AnyKey`щик
 
Регистрация: 01.08.2017
Сообщений: 18
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Можно ли оптимизировать

Спасибо за идею
(Offline)
 
Ответить с цитированием
Старый 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)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com