Я собирался написать скучный пост, но здесь я его выкину:
Я пытаюсь подражать графическому старому стилю NES через XNA. Тем не менее, мой FPS медленный, пытается изменить 65K пикселей на кадр. Если я просто переберу все 65K пикселей и установлю их в произвольный цвет, я получу 64FPS. Код, который я сделал, чтобы посмотреть, какие цвета должны быть размещены, где, я получаю 1FPS.
Я думаю, это из-за моего объектно-ориентированного кода.
Прямо сейчас у меня есть вещи, разделенные на шесть классов, с геттерами / сеттерами. Я предполагаю, что я, по крайней мере, вызываю 360K геттеров на кадр, что, по-моему, является чрезмерной нагрузкой. Каждый класс содержит / и / или одномерные или двумерные массивы, содержащие пользовательские перечисления, int, Color или Vector2D, байты.
Что если я объединю все классы в один и получу доступ к содержимому каждого массива напрямую? Код выглядел бы беспорядочно и угробил бы концепции объектно-ориентированного кодирования, но скорость могла бы быть намного выше.
Меня также не беспокоит нарушение доступа, поскольку любые попытки получить / установить данные в массивах будут выполняться блоками. Например, вся запись в массивы будет выполняться до того, как к ним будут получены какие-либо данные.
Что касается приведения, я заявил, что я использую пользовательские перечисления, int, Color и Vector2D, байты. Какие типы данных наиболее быстро используются и доступны в .net Framework, XNA, XBox , C #? Я думаю, что постоянное приведение может быть причиной замедления здесь.
Кроме того, вместо математики для определения того, в какие индексы следует помещать данные, я использовал предварительно вычисленные таблицы поиска, поэтому мне не нужно использовать постоянное умножение, сложение, вычитание, деление на кадр. :)