Эффективность Game.Services.GetService () в XNA - PullRequest
0 голосов
/ 07 августа 2011

По сути, я пытаюсь выяснить, должен ли я хранить ссылку на службу, которую я получаю, или я могу просто вызывать GetService каждый раз, когда мне это нужно.

Прекрасным примером того, с чем я это использую, является SpriteBatch. Вместо того, чтобы хранить объект, ссылающийся на SpriteBatch, я вызываю

    SpriteBatch spriteBatch = (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch)); 

в начале каждого метода Draw (), который в этом нуждается.

В заключение, что такое Big O в GetService ()? Это поможет мне решить. Я предполагаю, что это хеш-таблица, поэтому обычно O (1)?

Ответы [ 3 ]

3 голосов
/ 07 августа 2011

Big-O GetService не имеет значения, потому что у вас там небольшое и постоянное количество услуг. Таким образом, эффективный вызов GetService - это операция O (1) с постоянным временем. (Внутренне он использует Dictionary - я не мог легко отыскать окончательный ответ на его Big-O, но я думаю, что он довольно хорош).

Это лот медленнее, чем получить ссылку? Да.

Является ли слишком медленным для игрового мира, скажем, с 100 игровыми объектами? номер

Это слишком медленно для каждой из 100000 частиц в системе частиц? Да.

Является ли использование сервисной архитектуры для этого плохой идеей, даже если вы игнорируете производительность и рассматриваете только архитектурную точку зрения? Да.

1 голос
/ 07 августа 2011

Не могу сказать, что я знаю что-либо об асимптотической эффективности GetService, но очевидная вещь заключается в том, что гарантированно медленнее, чем сохранение ссылки на объект.По крайней мере, это должно быть очевидным, так как ссылка просто находится там, ожидая, чтобы быть использованной, в то время как GetService требует извлечения экземпляра Type из класса, а затем ищет этот Type внезависимо от того, какая коллекция используется, и, наконец, приведение к правильному типу, выполнение проверок во время выполнения и т. д.

По отдельности, ни одна из этих вещей не является проблемой.Даже все вместе, ни одна из них не является проблемой, если используется только несколько раз.Но если посмотреть, как вы извлекаете их для каждого кадра, то это может стать очевидным, в зависимости от того, сколько сервисов вы извлекаете в каждом кадре.

На основании небольшого количества информации, которую я имею о вашем кодеЯ бы сказал, что переход на опорную ссылку не должен быть таким сложным.Но чтобы действительно решить, стоит ли это того, возможно, попробуйте переключиться на сохранение ссылки (по крайней мере, на пару сервисов) и проверить, насколько сильно меняется ваш FPS.В качестве альтернативы, добавьте несколько посторонних вызовов GetService и посмотрите, какое снижение FPS это вызывает.Это был бы более точный способ выяснить важность изменения всего.

0 голосов
/ 05 февраля 2013

Если этот экземпляр SpriteBatch необходим для всего процесса моделирования, я думаю, вам следует сохранить его в службах. Я думаю, что если вы используете GameServiceContainer правильно, вам не нужно беспокоиться о скорости. Например: в моей симуляции у меня есть около 20 GameServices, которые должны быть доступны для многих GameComponents. Большинство этих служб извлекаются из служб при вызове Initialize (), потому что экземпляр не изменяется во время выполнения. Единственные сервисы, которые могут измениться (в моем моделировании), это ICamera и IGlobalLight. Так что это единственные ссылки, которые извлекаются из Служб при каждом Draw ().

Наконец, я думаю, что затраты на производительность того стоят, по сравнению с «архитектурным решением», таким как суперглобальные переменные или создание всех сервисов Singletons.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...