PDA

Просмотр полной версии : PvP игра, php&MySQL&AS v3.0


JackLondon
15.08.2010, 03:35
Вобщем есть игра, требующая информирования одним пользователем другого и в обратном порядке.

Решение: сервер с парой пхп файлов get и set функционала, к которым обращаются оба пользователя, они пишут и читают из БД.

Проблема: скорость, даже при передаче просто координат х, у, rotation = это около 10-ти запросов на запись своих данных и 10-ти запросов на считывание данных противника каждым из клиентов. Получается не очень быстрое слайдшоу.

Вопрос: как можно оптимизировать?

Я в флеш разработке новенький, сильно не пиннайте :)

Добавлено через 3 минуты
Да, забыл. В игре нет и 10-й части требуемого функционала, т.е. дальше fps будет только падать.
Тормоза связаны только со скоростью загрузки/выгрузки с серва/на серв, т.е. код выполняется моментально.

Запросы строю с помощью URLLoader, через URLLoaderDataFormat.VARIABLES..

e_gamer
15.08.2010, 04:02
AMFPHP в помощь.
Так же советую пересмотреть серверный код - 10 запросов это не много.
Если база планируется большая, может стоит поставить PostgreSQL.

Как программист из game-dev`а, хотел поинтересоваться:
Игра реал-тайм?

JackLondon
15.08.2010, 04:20
Спасибо за быстрый ответ, сегодня будем пробовать интегрировать. Если честно, оба эти слова сегодня впервые прочитал :)
Да, естественно реалтайм, поэтому и не хватает 10-ти слайдов в секунду.. Иначе можно было бы хотя бы поочереди ждать полной загрузке произведенных противником действий за ход и только тогда демонстрировать..

e_gamer
15.08.2010, 04:26
10 кадров в секунду - это скорость?

JackLondon
15.08.2010, 04:50
Именно!
И да, приложение лежит ВКонтакте. Хотя про контакт это оффтоп, так что извиняюсь. Из за чего такая низкая производительность? Php скрипты простейшие, их просто нельзя никак оптимайзить. СПб-й хостинг, скорость на нем хорошая.
Сегодня как проснусь попробую использовать вместо БД то место, отведенное самим контактом, собственно стал писть это все в БД потому что не разобрался в вконтакте API. Аааа, опять оффтоплю :) Вобщем разберусь с AMFPHP и PostgreSQL и отпишусь как прошло..
Если у кого еще есть какие советы как качественно и быстро организовать PvP - буду благодарен :)

ShockWave512
15.08.2010, 12:17
очень странно что при довольно высокой плотности запросов (10/сек) рассматривается вариант с php/get-set !!!

только сокет, причем однозначно пересматривать архитектуру, для снижения кол-ва запросов (допустим передавать не координаты, а вектор движения раз в секунду, не текущий угол поворота, а конечный/целевой, и т.д., ну и там - всякие разбития игрового поля на ячейки)

но это надо смотреть на месте, так это абстрактные мысли

e_gamer
15.08.2010, 18:32
Но 10 запросов в секунду в базу - я бы не сказал, что это много.
Игровой сервер не должен виснуть от такого.
Другое дело - как они построены и действительно ли нужны некоторые из них?

Ходы во время игры можно обсчитывать с помощью PHP, даже для реал-тайм игры.
Как показывает практика, я даже по своему опыту знаю, оптимизация запросов и скриптов помогает решить такую ситуацию.

ShockWave512
15.08.2010, 19:48
10 на одного пользователя, зайдет сотня и понадобится выделенный сервер, зайдет 1000 нужен будет довольно крутой сервер и т.д.

только отдельный процесс, который в реалтайме обсчитывает каждую сессию, желательно без запросов к базе, то есть каждая сессия/пвп игра это отдельный компактный объект в памяти

дальше:
- хттп запросы/ответы не гарантируют правильную последовательность доставки
- топик кастер сказал что нет и 10-й части функционала, ждем еще запросов
- обменн данными в сокете быстрее хттп запросов, не скажу на сколько, но разница очень существенная

Котяра
15.08.2010, 22:47
10 запросов в секунду - однозначно сокет и посылать надо только дельты и апдейты.

Psycho Tiger
15.08.2010, 23:15
Крутые сервера не обращаются к базе так часто: они оперируют в памяти, а сохраняют результаты игры по запросу (а ля игрок вышел) и например каждую минуту.

ShockWave512
15.08.2010, 23:57
простой подсчет:
1) FLASH CLIENT -> HTTP -> TCP -> UDP -> NET -> PHP -> MySQL
2) FLASH CLIENT -> SOCKET -> UDP -> NET -> PVP SERVER

схема сильно упрощенная, но все же думаю будет чуть понятней
7 - 5

e_gamer
16.08.2010, 00:23
Ну, если условия задачи не обязывают использовать связку PHP+MySQL, можно на Java серверную часть написать.

-De-
16.08.2010, 02:52
php умеет слушать сокет и принимать соединения - можно и на php сервер. Ну ява и с++ всякие быстрее, да.
PS: ShockWave512, схемы бредовые %)

e_gamer
16.08.2010, 04:30
Я просто такие вещи на Яве пишу, если нужен сокет, потому и предложил =)

Котяра
16.08.2010, 11:16
Проблема php в хранилище данных и межпроцессном взаимодействии.
Например - запущен процесс для подсчёта передвижения ботов. чтобы узнать игроку о координатах ботов нужно писать/читать данные в базу либо придумывать костыли с memcached, сокетами между процессами итп.
Намного лучше когда это можно взять сразу из памяти вызвав напрямую метод другого процесса(либо сам процесс).
Да и не для того пыха сделана - всё таки это в первую очередь - работа с текстами.
Для реалтайм ММО серверов уместнее c++/java/scala/erlang -обсуждалось уже не раз.

JackLondon
16.08.2010, 19:55
> c++/java
я бы с радостью, но у меня просто хостинг, а cpp & java приложения надо было бы инсталлить на свой серв.
AMFPHP прикрутил, перевел функции под него, потестил - это не решение проблемы..
Сейчас читаю материалы по сокетам, пока теорию, потом попробую написать их на php, вдруг получится таким образом оптимизировать.. Кстати, можете посоветовать литературу по этой теме? Т.е. по сокетам на пхп, чтобы хорошо так, с толком разжевано было :)

Котяра
16.08.2010, 20:08
> c++/java
я бы с радостью, но у меня просто хостинг, а cpp & java приложения надо было бы инсталлить на свой серв.
AMFPHP прикрутил, перевел функции под него, потестил - это не решение проблемы..
Сейчас читаю материалы по сокетам, пока теорию, потом попробую написать их на php, вдруг получится таким образом оптимизировать.. Кстати, можете посоветовать литературу по этой теме? Т.е. по сокетам на пхп, чтобы хорошо так, с толком разжевано было :)
Полно java хостингов (http://www.brim.ru/) да и просто VPS на которые ставь что хошь.
Кроме того, запускать постоянные процессы (сокет это тоже процесс) на виртуальном хосте с пыхой/мускулем тоже далеко не везде можно, например, на majordomo надо платить дополнительно.
Попробуйте оптимизировать запросы. отправляйте/принимайте запросы 1 раз в секунду где данные будут пачкой изменений, а не состояний.
Всё, конечно, зависит от цели.
Опишите подробнее что вам надо, может, что посоветую по оптимизации.
А для реалтайма всё же надо c++/java/scala/erlang

JackLondon
17.08.2010, 03:18
Прогресс:
начал было играться с memcached, но на пол пути потестил скорость исполнения скриптов - порядка 2 миллисекунд. Можно, конечно, но при скорости обработки одного запроса с моей машины - 100 - 120 мс, и средней скорости отработки из вк - 150 мс, скорость запросов к БД оказывается вовсе незначительной..
С сокетами на пхп не разобрался( пока..
А насчет подробного описания: http://cl22441.tmweb.ru/ вот сюда можно зайти вдвоем и увидеть лаги.
Т.е. пока вообще ни о чем. Насчет оптимизации передаваемых параметров - если передавать только траекторию/скорость - то он будет улетать в неверном направлении при таких лагах.

Итог: пока решению вижу в сокетах..

ShockWave512
17.08.2010, 10:41
талдычили, талдычили
сокеты всю проблему не снимут
нужно обязательно убрать передачу покадрового состояния

Котяра
17.08.2010, 11:05
не - тут надо строго дельту отсылать - я делал похожую игру - управление мышой - на маус мув. Дельтировал всё подряд, движения мыши по времени, так и по расстоянию,
ускорение персонажей, скорости и.т.п. При определённом подборе параметров - лаги незаметны, но данных становится на порядок а то и несколько порядков меньше.
Кстати, можно посмотреть в сторону p2p и стратус - например через них отсылать перемещения, а счёт и валидацию попаданий отсылать на игросервер.

etc
17.08.2010, 12:31
2) FLASH CLIENT -> SOCKET -> UDP -> NET -> PVP SERVER

Интересно, куда пропал TCP…