Problema con Thread.SetAffinity y Threading a través de XNA en Xbox 360

Así que desarrollé un sistema de detección de colisiones muy eficiente, pero el problema es que todavía no puede ejecutarse en el subproceso principal porque es demasiado lento.

Intenté configurar algunos subprocesos y, si el subproceso finaliza, se crea otro subproceso.

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;
}

Ahora noté un comportamiento extraño al depurar. Cuando llamé a Thread.SetAffinity, saltó una y otra vez una o dos veces antes de comenzar a verificar las colisiones.

Y ahora mis colisiones se retrasan entre 5 y 10 segundos...

Si alguien tiene una idea, por favor ingrese algo aquí.

preguntado el 26 de agosto de 12 a las 01:08

En mi humilde opinión, la afinidad es tan baja que el programador "intentará comenzar la acción" pero lo revierte, porque hay "mejores cosas que hacer" (con una mayor afinidad) ... solo después de 5-10 segundos el programador encuentra un tragamonedas para tu acción... -

@TheHe Pensé que el conjunto de SetAffinity es qué núcleo usar. ¿Qué sugieres para mejorar mi enhebrado? Si solo creo un nuevo hilo, se retrasa, porque 2 hilos en 1 núcleo no es tan bueno. -

aah.. seguro que tienes razón... era @priorities y algo... primero: ¡¿la xbox tiene 4 procesadores?! segundo: mira esto -> msdn.microsoft.com/en-us/library/windows/desktop/… tercero: ¿establecer la prioridad del subproceso más baja? -

La Xbox solo tiene 3 núcleos, y uno de ellos (0, si mi memoria no falla) está reservado para el sistema operativo de la consola, por lo que establecer la afinidad en 3 (cuarto procesador) sería inútil. No estoy seguro de que ese sea el problema, pero intente configurarlo en 1 o 2, o lea la documentación sobre este tipo de cosas. -

1 Respuestas

La XBOX 360 tiene 3 núcleos con 2 subprocesos de hardware por núcleo, lo que produce un total de 6 subprocesos de hardware. Los subprocesos 0 y 2 están reservados por XNA Framework, dejando 1, 3, 4 y 5 para que usted los use.

En cuanto a la pregunta, ¿por qué está creando un nuevo hilo después de verificar si hay colisiones, para hacer exactamente lo mismo nuevamente? Si necesita repetir la verificación de colisiones en un hilo, simplemente colóquelo dentro de un while(true) bucle para mantenerlo en marcha.

Respondido el 05 de Septiembre de 12 a las 02:09

Bueno, hice exactamente lo que dijiste, excepto sin el bucle while (true), que es una tontería. - usuario1146887

No es exactamente tonto. Crear y derribar hilos es una operación costosa. Use un bucle sin fin (prefiero for(;;)) y algunas primitivas de sincronización. - Simon

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.