60К+ спрайтов на 360?

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

В рамках этой идеи в идеале я хотел бы вручную рисовать каждый пиксель экрана. Итак, в худшем случае мне пришлось бы рисовать около 60 тысяч спрайтов в разрешении 252x240 (я думаю, это правильно). 60К спрайтов на экране одновременно.

Итак, прежде чем я даже попытаюсь закодировать это - сможет ли XBOX 360 не отставать от этого? Это много спрайтов, но они не большие спрайты, и необходимые данные текстуры не будут существовать. Тем не менее, я предполагаю, что то, как этот проект будет реализован, сделает его или сломает, но все, о чем я думал, это придумать 2D-массив и сопоставить, какое значение цвета нужно будет нарисовать в этой точке.

Конечно, сейчас это разбавленный разговор. Но что вы все предлагаете?

РЕДАКТИРОВАТЬ: каждый спрайт будет представлять один пиксель. Например, спрайт в 0,0. Другой на 0,1. и Т. Д.


person Jeffrey Kern    schedule 31.05.2010    source источник
comment
Почему бы просто не нарисовать свои собственные текстуры?   -  person Gabe    schedule 31.05.2010
comment
Эээ... спрайт шириной в один пиксель - это не спрайт, это пиксель   -  person Diadistis    schedule 31.05.2010
comment
@Diadistis: это не спрайт шириной в один пиксель, это спрайт, представляющий 1 пиксель. Обратите внимание, что он говорит о 252x240, а не 1920x1080;)   -  person Wolph    schedule 31.05.2010
comment
Я собираюсь подражать графическому стилю NES, а у NES были аппаратные ограничения на то, что можно было сделать. Например, только 8 спрайтов на строку сканирования, только 24 цвета на строку сканирования, 3 цвета на спрайт и т. д. (если я правильно помню, вся эта информация есть в Википедии). Если бы я просто рисовал спрайты своих персонажей, это сработало бы. Но я не мог эмулировать мерцание среди других эффектов, таких как смена цветовых палитр на лету.   -  person Jeffrey Kern    schedule 31.05.2010
comment
Не могу сказать вам о производительности XBox360, но каждый спрайт будет представлять один пиксель. Например, спрайт в 0,0. Другой на 0,1. и т. д. Это ОЧЕНЬ плохой способ делать что-то. Не делай этого. Всегда. Особенно, если вы собираетесь хранить каждый спрайт как отдельный объект. С ПК и DirectX 9 вы гарантированно получите замедление из-за перегрузки процессора вызовами. Скорее всего, платформа не справится с этим. Также вам действительно нужно прочитать это: msdn.microsoft.com /en-us/library/ee418872(VS.85).aspx   -  person SigTerm    schedule 31.05.2010
comment
@SigTerm: думаю, вы неправильно понимаете термин «пиксель OP». Его пиксель на самом деле является спрайтом размером 7,6x4,5 реальных пикселя...   -  person Peter Lillevold    schedule 31.05.2010
comment
@SigTerm: хотя это верно для ванильного D3D, XNA FX предоставляет класс SpriteBatch, который приведет к одному вызову DIP для большого количества спрайтов, использующих одну и ту же текстуру и другие состояния (для 60 КБ это может быть около 4 вызовов DIP). Однако на самом деле это не лучший способ сделать что-то похожее на эмулятор: лучшим вариантом может быть использование выделенной текстуры 252x240 (с буфером для установки пикселей и Texture2D.SetData) и использование вызова отрисовки растягивания. позвонить им сразу.   -  person Björn    schedule 02.06.2010
comment
@ Бьорн, я пытался это сделать. Потребовалось около минуты, чтобы сделать достаточное количество вызовов Texture2D.SetData для рендеринга всего одного кадра информации в текстуру. :П   -  person Jeffrey Kern    schedule 02.06.2010
comment
@Jeffrey Ни при каких обстоятельствах не вызывайте Texture2D.SetData более нескольких раз за кадр :) Установите пиксели в массиве Color и SetData этого массива и, таким образом, все пиксели одновременно.   -  person Björn    schedule 06.06.2010
comment
Действительно? Так как же тогда работает массив? Например, элемент 0 в массиве принадлежит пикселю 0,0. Пункт 1 принадлежит 1,0? И т.д?   -  person Jeffrey Kern    schedule 07.06.2010


Ответы (1)


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

На самом деле это часть 3D-программирования, но вы полностью опускаете ось Z и указываете ортогональную камеру.

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

60К спрайтов - не лучшая идея.

person SiN    schedule 31.05.2010
comment
Это, вероятно, будет лучшим ответом, так как большинство консолей способны обрабатывать 120 000 треугольников в кадре: D Мне просто слишком лень реализовывать это самому, поэтому я использую другой подход, лол. Но это, вероятно, был бы лучший способ сделать; Я просто не очень хорошо разбираюсь в 3D-математике, но это может быть полезно для тех, кто разбирается. - person Jeffrey Kern; 02.06.2010
comment
Что ж, вам не обязательно быть помешанным на математике. XNA выполняет все сложные вычисления за вас. В любом случае удачи! - person SiN; 02.06.2010
comment
Стоит отметить, что спрайты, реализованные в XNA SpriteBatch, представляют собой примитивные квадраты, а шейдер SpriteBatch сильно оптимизирован для их быстрого рисования. По общему признанию, он выполняет дополнительную работу, такую ​​​​как текстурирование, которую здесь можно было бы удалить. Если вы хотите использовать этот метод, хорошей отправной точкой будет изменение самого шейдера SpriteBatch от создателей. .xna.com/en-US/utilities/spritebatchshader — хотя весь этот метод ужасен — придерживайтесь пиксельных шейдеров, и если вам нужно отправить столько данных на графический процессор, текстура будет использовать меньшую пропускную способность, чем сумасшедший за -пиксельная геометрия! - person Andrew Russell; 11.06.2010