Это будет довольно расплывчатый вопрос, но мне интересно, как обойти проблему, с которой я сталкиваюсь ...
В настоящее время у меня есть много разных проектов, которые я написал некоторое время назад, и у всех из них есть похожая структура для работы с пространственным разделением и сортировкой, однако в каждом проекте была реализована собственная версия этой платформы. Все они представляют собой графические приложения, но имеют реализации в:
- 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 и т. Д. Однако тогда мне пришлось бы преобразовать их обратно в их исходную версию для рендеринга, и если бы я делал это для каждой точки в каждом объекте в каждом цикле рендеринга, то это звучало бы как серьезное снижение производительности (особенно, когда предполагается, что этот фреймворк настолько высокопроизводительный), насколько это возможно.
Я думал о наличии интерфейсов, которые могли бы решить эту проблему и просто обернуть нативный объект внутренне в части реализации, но я все еще не уверен, что это лучший путь, поскольку я никогда не делал много кроссплатформенных развития, поэтому никогда не приходилось решать эти проблемы.
Во всяком случае, теперь перестанет болтать, и любой совет будет отличным!