Вопрос структуры агностика - PullRequest
2 голосов
/ 02 декабря 2010

Это будет довольно расплывчатый вопрос, но мне интересно, как обойти проблему, с которой я сталкиваюсь ...

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

  • Silverlight
  • Winforms (GDI)
  • XNA
  • DirectX
  • OpenGL (TAO)

Хотя существует 5 разных версий этой платформы, все они делают ТОЧНО одно и то же, просто принимают разные объекты. Примером может служить то, что GDI использует System.Drawing.Point для большинства своих задач, связанных с рисованием, тогда как XNA использует Vector2, однако оба объекта представляют X / Y, как и в других библиотеках, некоторые хранят значения x / y как int, плавающие, двойные, но в конечном итоге в основе они представляют одни и те же данные.

Основная задача структуры пространственного разделения состоит в том, чтобы работать с этими 2/3 размерными значениями и генерировать деревья или выполнять другие задачи сортировки вокруг этих чисел.

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

Итак, моей первой мыслью было создание некоторых агностических объектов для решения этой проблемы X / Y, таких как пользовательские Point2D, Point3D, Quaternion, Rect и т. Д. Однако тогда мне пришлось бы преобразовать их обратно в их исходную версию для рендеринга, и если бы я делал это для каждой точки в каждом объекте в каждом цикле рендеринга, то это звучало бы как серьезное снижение производительности (особенно, когда предполагается, что этот фреймворк настолько высокопроизводительный), насколько это возможно.

Я думал о наличии интерфейсов, которые могли бы решить эту проблему и просто обернуть нативный объект внутренне в части реализации, но я все еще не уверен, что это лучший путь, поскольку я никогда не делал много кроссплатформенных развития, поэтому никогда не приходилось решать эти проблемы.

Во всяком случае, теперь перестанет болтать, и любой совет будет отличным!

1 Ответ

2 голосов
/ 02 декабря 2010

Я бы порекомендовал вам реализовать ваши собственные математические типы и делать все ваши вычисления, используя их.Я бы, вероятно, использовал XNA в качестве основы.Не только потому, что они довольно хороши, но и потому, что вы можете получить их реализацию с открытым исходным кодом из Mono.XNA, SilverSprite или XNATouch.(И, конечно, сам фреймворк в XNA.) Таким образом, вы сэкономите много работы.

Основная проблема, которую я вижу, состоит в том, что ваши разные платформы используют разные типы.GDI использует целые числа, XNA, DirectX и OpenGL используют плавающие с одинарной точностью (как правило), а Silverlight использует плавающие с двойной точностью.

Если бы это было не так, вы могли бы просто назначить свой типисходно идентичный и зависящий от JIT для его оптимизации.

Хорошая особенность OpenGL, DirectX и XNA (исключая такие вещи, как SpriteBatch) заключается в том, что вы в основном сообщаете API свою структуру данных -и вы можете использовать все, что вам нравится внутри.

Для GDI и Silverlight вы, вероятно, в любом случае будете бороться за создание сверхвысокой производительности графики.Так что я бы просто принял преобразование во всплывающее и обратно.Просто напишите простые функции преобразования для отображения ваших данных.Преобразование типов будет чрезвычайно крошечным, крошечным процентом вашего процессорного времени по сравнению с рендерингом.

(Я действительно сделал это для Silverlight - и об этом действительно не стоит беспокоиться.)

...