Проблема с Thread.SetAffinity и Threading через XNA на Xbox 360

Поэтому я разработал очень эффективную систему обнаружения столкновений, но проблема в том, что она по-прежнему не может работать в основном потоке, поскольку она чертовски медленная.

Я попытался настроить потоки, и если поток заканчивается, создается другой поток.

if (doneCollisions)
            {
                PopulateGrid();
            }


            if (doneCollisions)
            {
                Thread thread = new Thread(new ThreadStart(CheckCollisionsGrid));

                thread.Start();

            }

void CheckCollisionsGrid()
{
Thread.CurrentThread.SetProcessorAffinity(3);
            doneCollisions = false;
            //Increments through all the grids.
.
.
.
doneCollisions = true;
}

Теперь я заметил странное поведение при отладке. Когда я вызвал Thread.SetAffinity, он несколько раз возвращался к нему снова и снова, прежде чем, наконец, начал фактически проверять коллизии.

И теперь мои столкновения задерживаются на 5-10 секунд ...

Если у кого-то есть понимание, пожалуйста, введите сюда.


person Robert Gawdzik    schedule 26.08.2012    source источник
comment
imho, сродство настолько низкое, что планировщик попытается начать действие, но отменит его, потому что есть дела поважнее (с более высоким сродством) ... только через 5-10 секунд планировщик найдет слот для вашего действия ...   -  person TheHe    schedule 26.08.2012
comment
@TheHe Я подумал, какое ядро ​​SetAffinity использовать? Что вы предлагаете для улучшения моей цепочки? Если я просто создаю новый поток, он тормозит, потому что 2 потока на 1 ядре не так уж и хороши.   -  person Robert Gawdzik    schedule 26.08.2012
comment
ааа .. я уверен, что ты прав ... я был @ priority и что-то в этом роде ... во-первых: у xbox 4 процессора ?! во-вторых: проверьте это - ›msdn .microsoft.com / en-us / library / windows / desktop / третий: установить более низкий приоритет потока?   -  person TheHe    schedule 26.08.2012
comment
У Xbox всего 3 ядра, и одно из них (0, если моя память не сбой) зарезервировано для ОС консоли, поэтому установка привязки на 3 (четвертый процессор) будет бесполезной. Я не уверен, что в этом проблема, но попробуйте установить значение 1 или 2 или почитайте документацию по этому поводу.   -  person Elideb    schedule 27.08.2012


Ответы (1)


XBOX 360 имеет 3 ядра с 2 аппаратными потоками на каждое ядро, что в сумме дает 6 аппаратных потоков. Потоки 0 и 2 зарезервированы XNA Framework, оставляя вам 1, 3, 4 и 5.

Что касается вопроса, почему вы создаете новый поток после проверки на коллизии, чтобы делать то же самое снова и снова? Если вам нужно повторить проверку столкновений в потоке, просто поместите ее в цикл while(true), чтобы он продолжал работать.

person Tom Lint    schedule 05.09.2012
comment
Что ж, я сделал именно то, что вы сказали, за исключением того, что без цикла while (true), что глупо. - person Robert Gawdzik; 05.09.2012
comment
Не совсем глупо. Создание и удаление потоков - дорогостоящая операция. Используйте бесконечный цикл (я предпочитаю для (;;)) и некоторые примитивы синхронизации. - person Simon; 05.09.2012