Хранение/обработка сложных данных в динамических структурах - Проблема - решение. GML и прочее. - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Проблема - решение. GML и прочее. » Хранение/обработка сложных данных в динамических структурах
Хранение/обработка сложных данных в динамических структурах
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. Возможно я просто неправильно храню и обрабатываю данные, возможно стоит за основу не список, а сетку (на худой конец, просто массив).

  • Прикрепления: ads.gmk(12Kb)


    Blogpost
     
    DreamRunner Дата: Пятница, 23.07.2010, 09:33 | Сообщение # 2
    Админ
    Группа: Админы
    Сообщений: 1382
    Статус: Offline
    1. Обратиться к элементу списка дольше чем к объекту, а уж тем более несколько раз (для каждой переменнтой). Исхожу из того что один человек создавал массив через объекты и вроде как было быстрее.
    2. Скрипты тоже замедляют демку. Если б ты напрямую в коде обращался к списку, а не через скрипт, было бы быстрее.
    3. Если тебе нужна именно оптимизация такого поведения объектов, то можно сделать код быстрее, а если ты просто набил его для нагрузки, то понятно что заниматься им не стоит, пусть это будут как бы абстрактные вычисления.

    Нужно оптимизировать код самих объектов и оставаться с ними. Как вариант - выкинуть СТЕП и ДРАВ из объектов и сделать его обработу в цикле одного контрольного объекта.

     
    SRes Дата: Пятница, 23.07.2010, 10:06 | Сообщение # 3
    Каждый 5й пост мой
    Группа: Страж
    Сообщений: 2512
    Статус: Offline
    Массивы должны придать скорости. smile


    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
    Я немного не в теме, что, вызов обычной функции (скрипта) так сильно замедляет программу ? eek


    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 в циклах. В ГМ же можно состряпать новый скрипт прямо находу. smile

    А вообще производительности никогда не хватает, поэтому лучше подумать как упростить игру при том же фане.

     
    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)
    Подробнее, подробнее пожалуйста!

    В ГМ можно цеплять скрипты в объекты находу (вроде как wacko ) Посмотри пока справку)
     
    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кб).

    Тема закрыта
    Прикрепления: ads_fast.gmk(13Kb)


    Blogpost
     
    Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Проблема - решение. GML и прочее. » Хранение/обработка сложных данных в динамических структурах
    Страница 1 из 11
    Поиск:



    Сообщество Gmaker.SU 2005-2012
    Используются технологии uCoz
    Простой вход