Вычисление накладных расходов в C # - с использованием GetTers / Deventers vs. Изменение массивов напрямую и скорости литья

StackOverflow https://stackoverflow.com/questions/3018536

Вопрос

Я собирался написать пост давно навесной, но я скинусь здесь:

Я пытаюсь подражать графическому стилю старого школы NES через XNA. Однако мой FPS медленный, пытаясь изменить 65K пикселей на раму. Если я просто петлю через все 65 k пикселей и установите их в какой-то произвольный цвет, я получаю 64FPS. Код, который я сделал, чтобы посмотреть, какие цвета должны быть размещены там, где я получаю 1fps.

Я думаю, что это из-за моего объекта-оременного кода.

Прямо сейчас у меня есть вещи, разделенные на около шести классов, с Getter / Betterters. Я предполагаю, что я по крайней мере называю 360 тыс. Геттерс на кадру, которую я думаю, что много накладных. Каждый класс содержит либо / или или 1D или 2D-массивы, содержащие пользовательские перечисления, int, цвет или вектор2d, байты.

Что, если я объединил все классы только в одну, и добрался до содержимого каждого массива напрямую? Код будет выглядеть беспорядок и бросить концепции объектно-ориентированного кодирования, но скорость может быть намного быстрее.

Я также не беспокоюсь о нарушениях доступа, поскольку любые попытки получить / установить данные в массивах будут выполняться в блоках. Например, все писать на массивы будут иметь место до доступа любых данных.


Что касается кастинга, я заявил, что я использую Пользовательские перечисления, int, цвет и вектор2d, байты. Какие типы данных являются наиболее быстрыми для использования и доступа к .NET Framework, XNA, Xbox, C #? Я думаю, что постоянный кастинг может быть причиной замедления здесь.

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

Это было полезно?

Решение

Есть потрясающая презентация от GDC 2008, которая стоит прочитать, если вы являетесь разработчиком XNA. Это называется Понимание показателей XNA Framework.

Для вашей нынешней архитектуры - вы на самом деле не описали его достаточно хорошо, чтобы дать определенный ответ - вы, вероятно, делаете слишком много ненужных «вещей» в тесной петле. Если бы мне пришлось угадать, я бы предположил, что ваш текущий метод выбивает кеш - вам нужно исправить свой макет данных.

В идеальном случае у вас должен быть хороший большой массив небольшого максимально возможного Типы значений (Структы не классы), а сильно включенная петля, которая вносит данные в него линейно.

(В стороне: Что касается того, что быстро: целочисленные и плавающие точечные математики очень быстро - в целом вы не должны использовать таблицы поиска. Функциональные вызовы довольно быстро - до точки, которая копирует большие структуры, когда вы проходите их, будет более значительным. JIT будет встроить простые Getter и Setters - хотя вы не должны зависеть от этого, чтобы встроить что-либо еще в очень жестких петель - как ваш блаженчик.)

ОДНАКО - Даже если оптимизирован - ваша нынешняя архитектура отстой. То, что вы делаете мух перед лицом того, как работает современные графические процессоры. Вы должны загрузить ваши спрайты на свой GPU и позволить ему составлять свою сцену.

Если вы хотите манипулировать своими спрайтами на уровне пикселей (например: подключаются поддоны, когда вы упомянули), вы должны использовать пиксельные шейдеры. ЦП на 360 (и на ПК) быстро, но ГПУ намного быстрее, когда вы делаете что-то вроде этого!

То Спрайтные эффекты Образец XNA - это хорошее место для начала.

Другие советы

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

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

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

РЕДАКТИРОВАТЬ

Хорошо, я думаю, что ваше решение может загрузить несколько спрайтов с разными цветами (спрайт нескольких пикселей) и повторно использовать тех. Быстрее указывать на тот же спрайт, чем назначать другой цвет для каждого пикселя, поскольку спрайт уже загружен в память

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top