| Хранение/обработка сложных данных в динамических структурах |
|
Ang3L
| Дата: Пятница, 23.07.2010, 02:11 | Сообщение # 1 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Все знают что делать что-то через один объект эффективнее, чем через несколько образцов. До тех пор пока не возникает вопрос: "А как хранить данные в одном объекте?". Действительно? Как? Когда переменных у "объектов" и самих объектов мало, можно прописать их вручную, но что делать если их немало? Допустим 10 объектов по 10 переменных уже сотня переменных. Дано: Представьте что у вас есть N объектов которые имеют 6 параметров (положение x,y; конечная точка _x, _y; размер _size; скорость _speed;). Объекты линейно перемещаются от положения (x; y) к конечной точке (_x; _y) со скоростью (_speed). Задача: Существенно увеличить кол-во фпс через один объект вместо образцов. Удобность использования. Переменное кол-во параметров у объекта в памяти. Что есть: За основу взял списки. По той причине что делать обход по такой структуре проще чем по сетке в силу часто изменяющейся ситуаций (частое добавление/удаление объектов). По сравнению с отдельными образцами ФПС падает в 5 раз (50 - через динам. структуры, 250 - через образцы; У вас результаты могут отличаться от моих). Что, в принципе, огромный FAIL. Пока, видимо, проблема с функцией list_set(), слишком много переборов (особенность списков). Буду пробовать сетки, но как быть с постоянно изменяющиеся ситуацией? Что требуется: У кого какие предложения по поводу данной проблемы? Кто поможет оптимизировать код или найти "узкие горлышки"? P.S.: Внизу приложение то что получилось. Пробел - меняет режим: OBJ_MODE - Через образцы, DS_MODE - Через один объект со списком. P.P.S.: Выявились пару проблем написания программ чисто через код: 1) нет составных переменных - затрудняет хранение и обработку данных. 2) нет перечисления (эквивалент enum в С++) - затрудняет читабельность программы, увел. кол-во работы. P.P.P.S.: Проблема обвновления данных в списке, по моему, у меня была и в С++ с HGE. Возможно я просто неправильно храню и обрабатываю данные, возможно стоит за основу не список, а сетку (на худой конец, просто массив).
Blogpost
|
| |
| | |
|
DreamRunner
| Дата: Пятница, 23.07.2010, 09:33 | Сообщение # 2 |
Админ
Группа: Админы
Сообщений: 1382
Статус: Offline
|
1. Обратиться к элементу списка дольше чем к объекту, а уж тем более несколько раз (для каждой переменнтой). Исхожу из того что один человек создавал массив через объекты и вроде как было быстрее. 2. Скрипты тоже замедляют демку. Если б ты напрямую в коде обращался к списку, а не через скрипт, было бы быстрее. 3. Если тебе нужна именно оптимизация такого поведения объектов, то можно сделать код быстрее, а если ты просто набил его для нагрузки, то понятно что заниматься им не стоит, пусть это будут как бы абстрактные вычисления. Нужно оптимизировать код самих объектов и оставаться с ними. Как вариант - выкинуть СТЕП и ДРАВ из объектов и сделать его обработу в цикле одного контрольного объекта.
|
| |
| | |
|
SRes
| Дата: Пятница, 23.07.2010, 10:06 | Сообщение # 3 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
|
Массивы должны придать скорости.
Velociped Inc.
|
| |
| | |
|
Ang3L
| Дата: Пятница, 23.07.2010, 13:43 | Сообщение # 4 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Quote (DreamRunner) 1. Обратиться к элементу списка дольше чем к объекту, а уж тем более несколько раз (для каждой переменнтой). Исхожу из того что один человек создавал массив через объекты и вроде как было быстрее. Quote (SRes) Массивы должны придать скорости. Придадут ли они скорости когда надо будет очень часто удалять и добавлять объекты. Вот в чём вопрос. Здесь кол-во объектов всегда постоянно. Quote (DreamRunner) 2. Скрипты тоже замедляют демку. Если б ты напрямую в коде обращался к списку, а не через скрипт, было бы быстрее. Это затруднит читаемость и кодирование. Со скриптами (ФПС: 52): Code draw_circle(list_get(argument0, 0), list_get(argument0, 1), list_get(argument0, 5), true); Без них (только прямой доступ к списку, ФПС: 62): Code draw_circle(ds_list_find_value(list, argument0 * size + 0), ds_list_find_value(list, argument0 * size + 1), ds_list_find_value(list, argument0 * size + 5), true); Добавлено (23.07.2010, 13:43) --------------------------------------------- С прямым степом ещё поднялось до 105. Размер списка тоже без скрипта ещё 20 кадров. Итого: без скриптов вообще ФПС: 125.
Blogpost
|
| |
| | |
|
DreamRunner
| Дата: Пятница, 23.07.2010, 22:33 | Сообщение # 5 |
Админ
Группа: Админы
Сообщений: 1382
Статус: Offline
|
Ну вот, подняли в 2 раза. Неплохо вроде)) Quote (Ang3L) Это затруднит читаемость и кодирование А ты как хотел:) Люди на асме делали ключевые куски кода, тоже удовольствия мало.
|
| |
| | |
|
SRes
| Дата: Пятница, 23.07.2010, 22:36 | Сообщение # 6 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
|
Я немного не в теме, что, вызов обычной функции (скрипта) так сильно замедляет программу ?
Velociped Inc.
|
| |
| | |
|
Фил
| Дата: Пятница, 23.07.2010, 23:38 | Сообщение # 7 |
Всех уже задолбал
Группа: Проверенные
Сообщений: 1007
Статус: Offline
|
наверное не сильнее, чем выполнять код несколько раз без скриптов
Храм нулей и единиц
|
| |
| | |
|
WertyXBOCT
| Дата: Пятница, 23.07.2010, 23:47 | Сообщение # 8 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
|
А мне пофиг на ФПС, пока еще не встречался с сильным проседанием в GM, во флеше - другое дело.
Blog:www.WeslomPo.ru mailto: i@weslompo.ru
|
| |
| | |
|
Ang3L
| Дата: Суббота, 24.07.2010, 01:08 | Сообщение # 9 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Quote (SRes) Я немного не в теме, что, вызов обычной функции (скрипта) так сильно замедляет программу ? Ну видимо в гм да. Без скриптов вообще 125фпс, со скриптами 52. Я знал что падение есть, но не думал что такое сильное. Quote (DreamRunner) Люди на асме делали ключевые куски кода, тоже удовольствия мало. Да, но АСМ не используют для написания средних и тем более крупных программ. Никогда. Проще же изменить одну функцию, чем 10 мест одно и того же кода. А если не 10, а 100? 1000? Это будет долгий, нудный и совершенно бесполезный труд. Хотелось бы повышение производительности и сохранение удобности кодирования в ущерб размерам и сложности программы.
Blogpost
|
| |
| | |
|
SRes
| Дата: Суббота, 24.07.2010, 09:19 | Сообщение # 10 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
|
Капец, это же ведь должен быть обычный call, что там можно такого делать, чтобы прога так лагала ?
Velociped Inc.
|
| |
| | |
|
DreamRunner
| Дата: Суббота, 24.07.2010, 11:12 | Сообщение # 11 |
Админ
Группа: Админы
Сообщений: 1382
Статус: Offline
|
Quote (Ang3L) Да, но АСМ не используют для написания средних и тем более крупных программ. Никогда. Проще же изменить одну функцию, чем 10 мест одно и того же кода. А если не 10, а 100? 1000? Это будет долгий, нудный и совершенно бесполезный труд. Я и не говорю про большие. Но вычислить направления и скорости большого числа объектов можно было бы на асме. Quote (Ang3L) Хотелось бы повышение производительности и сохранение удобности кодирования в ущерб размерам и сложности программы. Создай систему при которой функции будут собираться INLINE в циклах. В ГМ же можно состряпать новый скрипт прямо находу. А вообще производительности никогда не хватает, поэтому лучше подумать как упростить игру при том же фане.
|
| |
| | |
|
Bercut
| Дата: Суббота, 24.07.2010, 14:22 | Сообщение # 12 |
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
|
Из-за вызова -_- Теперь понятно, почему у меня фпс начал падать, по мере добавления скриптов -_- Quote (DreamRunner) Создай систему при которой функции будут собираться INLINE в циклах. В ГМ же можно состряпать новый скрипт прямо находу. Подробнее, подробнее пожалуйста! Актуальная тема
Fast, like fire!
|
| |
| | |
|
Фил
| Дата: Суббота, 24.07.2010, 14:32 | Сообщение # 13 |
Всех уже задолбал
Группа: Проверенные
Сообщений: 1007
Статус: Offline
|
Ну если вызов скрипта не в степе или в драве, тогда не должно слишком тормозить
Храм нулей и единиц
|
| |
| | |
|
Bercut
| Дата: Суббота, 24.07.2010, 14:58 | Сообщение # 14 |
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
|
Quote (Фил) Ну если вызов скрипта не в степе или в драве, тогда не должно слишком тормозить Да это неочень -_- Что если, есть сложная структура данных, и чтобы с ними работать и их обрабатывать написанны для того, чтобы не писать портянистые коды, а сразу вызвать скрипт, и такая обработка будет несколько раз, и собственно код увечилится, допустим таже проверка нахождения мышки в определённой плоскости: что если, у тебя будет несколько кнопок разных размеров, проще ведь написать скрипт, в который надо подать спрайт и координаты, а в нём уже вычисляется размер его, а иначе придётся под каждый размер кнопки писать кусок кода, подставляя вручную данные. А что если уменьшить работу самого кода? То есть происходит выполнение кода, только при изменении чего- либо. Набрать кучу условий, и закрывать их или открывать в зависимости от ситуации?
Fast, like fire!
|
| |
| | |
|
DreamRunner
| Дата: Суббота, 24.07.2010, 19:49 | Сообщение # 15 |
Админ
Группа: Админы
Сообщений: 1382
Статус: Offline
|
Люди, скрипты вызывают тормоза только при больших циклах. Я просто сказал что лучше делать Code repeat (10000) { if a>b c =a; else c=b } вместо Code repeat (10000) { c=max(a,b) } , где в max() и будет то условие, что написано выше. Единичные вызовы скриптов картину не сильно портят. Quote (Bercut) Подробнее, подробнее пожалуйста! В ГМ можно цеплять скрипты в объекты находу (вроде как  ) Посмотри пока справку)
|
| |
| | |
|
Bercut
| Дата: Суббота, 24.07.2010, 19:56 | Сообщение # 16 |
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
|
Quote (DreamRunner) В ГМ можно цеплять скрипты в объекты находу (вроде как ) Посмотри пока справку) Да, да, мы это обсуждали и пришли к выводу, что оно не надо -_- Вроде из темы как создать объект в программе и напичкать его как хочешь. З.Ы.: Ну у меня например в событии драва постоянно рисуется сетка, которая вызывается скриптом. Так же происходит обход списка точек, потом они приобразуются в прямоугольники и рисуются, и так несколько раз. На слабых машинах фпс (24/60), у себя же потерь нет, но видно что процесс занимает 36%.
Fast, like fire!
Сообщение отредактировал Bercut - Суббота, 24.07.2010, 20:00 |
| |
| | |
|
DreamRunner
| Дата: Воскресенье, 25.07.2010, 04:53 | Сообщение # 17 |
Админ
Группа: Админы
Сообщений: 1382
Статус: Offline
|
Bercut, мож нарисовать на сурфе, а потом обновлять при изменениях? Что там за сетка?
|
| |
| | |
|
Bercut
| Дата: Воскресенье, 25.07.2010, 17:31 | Сообщение # 18 |
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
|
Quote (DreamRunner) Bercut, мож нарисовать на сурфе, а потом обновлять при изменениях? Что там за сетка? Да, так, сетка для редактора, для привязки спрайтов, я думаю её можно подгонять под разрешение экрана, но при неокруглённом перемещении так делать нельзя, то есть без привязки. А рисуются ли объекты, то есть выполняется ли те действия рисования, вне суфра?
Fast, like fire!
|
| |
| | |
|
Ang3L
| Дата: Суббота, 18.09.2010, 16:07 | Сообщение # 19 |
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
|
Оказалось что постоянно изменяющиеся данные неэффективно делать через один объект. Quote Непрерывная обработка данных и их отрисовка (Это, повторюсь, 500 объектов по 6 параметров). Результаты таковы (в фпс): Списки - 120 Сетки - 150 Массивы - 200 Объекты - 250 Файл эксперимента (13кб). Тема закрыта
Blogpost
|
| |
| |
|
|