Пример теста, который можно сделать на UE: 1. Создаём сервер с какой-то картой 2. Подключаем два клиента 3. Проверяем что на сервере и на обоих клиентах появились оба аватара 4. Первый аватар прожимает абилку невидимости 5. Проверяем, что на втором клиенте исчезла информация про первого аватара 6. Ждём окончания действия абилки 7. Проверяем, что на втором клиенте вновь появилась информация про первого аватара
Это про сетевой тест, но насколько я понял, в Unity и с несетевыми тестами есть проблемы (выдуманный тест чисто для примера): 1. Создаём мир с какой-то картой 2. Спавним игрока 3. Проверяем, что каждую минуту игрок получает какое-то количество очков за то что он жив 4. Проверяем, что через 15 минут матч завершается
Как понимаю в Unity потребуется магия с ускоренным течением времени, когда реальное время выполнение теста всё равно будет фиксированным и не будет зависеть от производительности билдера. В случае UE все тесты выполняются за миллисекунды/максимум секунды если там прокручивается несколько минут игрового времени. Но может в Unity тоже можно прокручивать время детерминировано и как хочешь и я просто не нашёл как это сделать.
Речь про эффект на производительность всей игры. Вы сами ответили в целом, что пользовательский код - меньшая часть всех вычислений.
Поэтому на практике в рамках оптимизации обычно приходится оптимизировать не скорость выполнения конкретных кусков пользовательского кода, а снижать необходимое количество вызовов к API движка. Но в некоторых статьях пишут, что C++ быстрее чем C#, создавая впечатление, что поэтому игра на UE будет заведомо производительнее - это вот как раз преувеличение.
Привет. Правильно понимаю, что проверки выполняются локально прекомит хуком? Когда перед пушем делается пул чтобы поребейзить локальный комит, отметка о пройденных проверках остаётся или надо опять прогнать проверки? Ну и главный вопрос: + 10 минут на комит для контентмейкеров — легко ли они это приняли и точно ли оно того стоит?
Его не для игровой механики используют, а для всей обвязки вокруг. Хотя для MMO RPG игр подобная архитектура используется и для самого игрового мира. Для сессионных же всё, что не касается самого боя: авторизация, биллинг, матчмейкинг, состояние игрока и куча другой обвязки (ачивки, квесты, чат, соц связи, ивенты, нотификации, магазин и т.п.)
Спасибо за интересную статью! Есть несколько вопросов:
1. В статье не сказано про ослабление требований к качеству матча со временем (например, больше очков можно набрать) — применяется ли в каком-то виде или благодаря CCU нет необходимости?
2. Судя по графику у вас в очень большом промежутке CCU время сбора матча держится на уровне 5 секунд и только в момент минимального повышается до 10 секунд. Это могу объяснить только искусственным ограничением минимального времени сбора матча в 5 секунд (ну или гибкому изменению требований по качеству, но в это слабо верю), когда после 5 секунд ожидания матчи собираются обычно мгновенно для игроков. Но это приводило бы к увеличению очереди в момент пика CCU (каждый должен выждать 5 секунд — очередь линейно бы зависела от CCU). Т.е. не могу объяснить два этих графика одновременно — можете помочь? )
3. Длина очереди выходит на плато на уровне 300 игроков — это подозрительно много для игры 7х7. Это из-за очень сложных правил или есть какие-то банальные причины (несколько версий клиентов несовместимых на одном ММ, или входят разные режимы в эти 300 человек)?
4. Правильно ли понимаю, что стоимость сбора одного матча в таком вариант на несколько порядков выше, чем в предыдущем, поэтому пришлось так распараллеливать и во время пиковых значений ослаблять правила? Т.е. во время пикового CCU у вас начинала расти очередь И увеличиваться время ожидания игроков, т.к. ваш кластер ММ не мог подобрать грубо говоря больше 1 матча в секунду?
Ваше представление об MVP в корне неверно. Либо вы читали такие же некорректные статьи, либо некорректно интерпретировали. У вас даже на КДПВ нет ссылки от Model к View. Хотя и она неверна, т.к. связи должны быть односторонними, а в обратную сторону работа идёт через интерфейсы.
Так в Model вы и не знаете про View ни чего
Вы обманываете, т.к. эти ваши
edittext-а, а во втором из spinner-а
— это часть View.
каждая реализация оборачивает свои UI элементы в Model, представляя общий интерфейс доступа к данным.
Я не занимаюсь разработкой под Android, но в идеальном варианте ни Model, ни Presenter не имеют доступа ни то, что к View, но и к пакету android в принципе, т.е. они не знают, что работают под android'ом. И уж особенно нельзя нарушать правила разделения зависимостей между M, V и P — код в разных модулях и зависимости между ними настроены односторонне M<=P<=V, это принципиально.
MVP это про распределение обязанностей и зависимостей, в вашем случае реализация примера должна иметь следующий вид: Пакет Model:
класс с данными ExampleModel Пакет Presenter:
интерфейс ExampleView с методом updateResponse(String response)
класс ExamplePresenter'а с методами doRequest(String response) Пакет View:
класс-реализация интерфейса ExampleView
ExampleView дёргает ExamplePresenter.doRequest, ExamplePresenter устанавливает в ExampleModel данные запроса, и делает запрос на сервер, когда получает ответ, то устанавливает его в ExampleModel и дёргает метод интерфейса ExampleView.updateResponse.
Также важно выделять весь View в отдельный пакет и обращаться только через интерфейсы, т.к. это позволит делать unit тесты, подменив реализации на тестовые.
150 человек добавило эту статью в избранное — кто-то мог воспринять её серьёзно. Рекомендую удалить её пока, ознакомиться с темой более внимательно и написать действительно полезную статью. В качестве хорошей реализации MVP рекомендую ознакомиться с реализацией на www.mvcsharp.org (она на c#, но смысл от этого не меняется). Плюс там есть несколько статей на эту тему. Можете консультироваться, если будут вопросы.
Так как UI элементы в данном случаи будут выступать и как источник данных и элементы для отображение, то ссылки естественно возникают в реализации Model и View, Presenter связывает Model с View.
Нет, это уже не MVP и с ним общего ничего не имеет, кроме названий классов. Что вы будете делать, когда вам понадобится сделать версию под планшет, где, предположим, из-за особенностей UI придётся использовать совсем другие виджеты? Т.е. я ставлю вас перед фактом, что надо поддерживать два набора View с разным набором виджетов. Как вы это организуете в вашем варианте?
Так как Model и View используют одни и тебе виджеты (в нашем случае EditText и TextView) для своей работы, разумно будет реализовать содержащий их класс.ExampleViewHolder.java:
Недопустимо ссылаться на виджеты равно как на любую UI или Presenter специфик логику из модели, теряется весь смысл концепции MVP. В идеале части M V и P разделены на отдельные модули и имеют односторонние зависимости M <= P <= V.
В указанном примере задание @Nullable для переменной излишне, т.к. IDE и так знает, что метод findUserByName может вернуть null. Помечать необходимо все методы, параметры методов и поля классов. Тогда, как показывает практика, NPE уходит из вашей жизни почти полностью.
Интересующимся кодогенерацией по UML под .NET рекомендую глянуть в сторону фреймворка ECO. Он, правда, не ограничивается лишь этим, и включает в себя ещё ORM (лучшую, на мой взгляд). Использовали на прошлой работе и, реально, жалею, что под Java нет ничего подобного.
Пример теста, который можно сделать на UE:
1. Создаём сервер с какой-то картой
2. Подключаем два клиента
3. Проверяем что на сервере и на обоих клиентах появились оба аватара
4. Первый аватар прожимает абилку невидимости
5. Проверяем, что на втором клиенте исчезла информация про первого аватара
6. Ждём окончания действия абилки
7. Проверяем, что на втором клиенте вновь появилась информация про первого аватара
Это про сетевой тест, но насколько я понял, в Unity и с несетевыми тестами есть проблемы (выдуманный тест чисто для примера):
1. Создаём мир с какой-то картой
2. Спавним игрока
3. Проверяем, что каждую минуту игрок получает какое-то количество очков за то что он жив
4. Проверяем, что через 15 минут матч завершается
Как понимаю в Unity потребуется магия с ускоренным течением времени, когда реальное время выполнение теста всё равно будет фиксированным и не будет зависеть от производительности билдера. В случае UE все тесты выполняются за миллисекунды/максимум секунды если там прокручивается несколько минут игрового времени. Но может в Unity тоже можно прокручивать время детерминировано и как хочешь и я просто не нашёл как это сделать.
Речь про эффект на производительность всей игры. Вы сами ответили в целом, что пользовательский код - меньшая часть всех вычислений.
Поэтому на практике в рамках оптимизации обычно приходится оптимизировать не скорость выполнения конкретных кусков пользовательского кода, а снижать необходимое количество вызовов к API движка. Но в некоторых статьях пишут, что C++ быстрее чем C#, создавая впечатление, что поэтому игра на UE будет заведомо производительнее - это вот как раз преувеличение.
Привет. Правильно понимаю, что проверки выполняются локально прекомит хуком? Когда перед пушем делается пул чтобы поребейзить локальный комит, отметка о пройденных проверках остаётся или надо опять прогнать проверки? Ну и главный вопрос: + 10 минут на комит для контентмейкеров — легко ли они это приняли и точно ли оно того стоит?
Его не для игровой механики используют, а для всей обвязки вокруг. Хотя для MMO RPG игр подобная архитектура используется и для самого игрового мира. Для сессионных же всё, что не касается самого боя: авторизация, биллинг, матчмейкинг, состояние игрока и куча другой обвязки (ачивки, квесты, чат, соц связи, ивенты, нотификации, магазин и т.п.)
1. В статье не сказано про ослабление требований к качеству матча со временем (например, больше очков можно набрать) — применяется ли в каком-то виде или благодаря CCU нет необходимости?
2. Судя по графику у вас в очень большом промежутке CCU время сбора матча держится на уровне 5 секунд и только в момент минимального повышается до 10 секунд. Это могу объяснить только искусственным ограничением минимального времени сбора матча в 5 секунд (ну или гибкому изменению требований по качеству, но в это слабо верю), когда после 5 секунд ожидания матчи собираются обычно мгновенно для игроков. Но это приводило бы к увеличению очереди в момент пика CCU (каждый должен выждать 5 секунд — очередь линейно бы зависела от CCU). Т.е. не могу объяснить два этих графика одновременно — можете помочь? )
3. Длина очереди выходит на плато на уровне 300 игроков — это подозрительно много для игры 7х7. Это из-за очень сложных правил или есть какие-то банальные причины (несколько версий клиентов несовместимых на одном ММ, или входят разные режимы в эти 300 человек)?
4. Правильно ли понимаю, что стоимость сбора одного матча в таком вариант на несколько порядков выше, чем в предыдущем, поэтому пришлось так распараллеливать и во время пиковых значений ослаблять правила? Т.е. во время пикового CCU у вас начинала расти очередь И увеличиваться время ожидания игроков, т.к. ваш кластер ММ не мог подобрать грубо говоря больше 1 матча в секунду?
Вы обманываете, т.к. эти ваши — это часть View.
Я не занимаюсь разработкой под Android, но в идеальном варианте ни Model, ни Presenter не имеют доступа ни то, что к View, но и к пакету android в принципе, т.е. они не знают, что работают под android'ом. И уж особенно нельзя нарушать правила разделения зависимостей между M, V и P — код в разных модулях и зависимости между ними настроены односторонне M<=P<=V, это принципиально.
MVP это про распределение обязанностей и зависимостей, в вашем случае реализация примера должна иметь следующий вид:
Пакет Model:
класс с данными ExampleModel
Пакет Presenter:
интерфейс ExampleView с методом updateResponse(String response)
класс ExamplePresenter'а с методами doRequest(String response)
Пакет View:
класс-реализация интерфейса ExampleView
ExampleView дёргает ExamplePresenter.doRequest, ExamplePresenter устанавливает в ExampleModel данные запроса, и делает запрос на сервер, когда получает ответ, то устанавливает его в ExampleModel и дёргает метод интерфейса ExampleView.updateResponse.
Также важно выделять весь View в отдельный пакет и обращаться только через интерфейсы, т.к. это позволит делать unit тесты, подменив реализации на тестовые.
150 человек добавило эту статью в избранное — кто-то мог воспринять её серьёзно. Рекомендую удалить её пока, ознакомиться с темой более внимательно и написать действительно полезную статью. В качестве хорошей реализации MVP рекомендую ознакомиться с реализацией на www.mvcsharp.org (она на c#, но смысл от этого не меняется). Плюс там есть несколько статей на эту тему. Можете консультироваться, если будут вопросы.
Нет, это уже не MVP и с ним общего ничего не имеет, кроме названий классов. Что вы будете делать, когда вам понадобится сделать версию под планшет, где, предположим, из-за особенностей UI придётся использовать совсем другие виджеты? Т.е. я ставлю вас перед фактом, что надо поддерживать два набора View с разным набором виджетов. Как вы это организуете в вашем варианте?
Недопустимо ссылаться на виджеты равно как на любую UI или Presenter специфик логику из модели, теряется весь смысл концепции MVP. В идеале части M V и P разделены на отдельные модули и имеют односторонние зависимости M <= P <= V.
это их основная прелесть, обнаружение ошибки в рантайме может дорого стоит )
@Nullable
для переменной излишне, т.к. IDE и так знает, что метод findUserByName может вернуть null. Помечать необходимо все методы, параметры методов и поля классов. Тогда, как показывает практика, NPE уходит из вашей жизни почти полностью.