2010-02-25 17 views
8

Al perfilar mi aplicación con Pix, noté que la GPU pasa (en modo DX10) la mayor parte del tiempo en espera de un recurso no disponible. (Y siempre está en la fila con la CPU (por ejemplo, si la CPU está procesando marco X, la GPU también está procesando marco X) para este problema)Contención de recursos

Algunos nota:

1) La aplicación es GPU limitado (la CPU es básicamente inactivo (el 20% del uso de la CPU en la escena más pesado))

Mis preguntas son:

1) ¿Cómo tengo que interpretar estos resultados? En Pix cada fotograma en el lado de la GPU, veo 2-3 barras rojas pequeñas (hasta donde sé, el recurso no está disponible) y después una barra gris media/grande (eso significa que la GPU está inactiva). La CPU en otro lado tiene algunas operaciones, una gran barra vacía y algunas otras operaciones (¿está esperando algo?)

Otra nota, cuando la GPU está inactiva, generalmente la CPU está funcionando. (Lo contrario no es válido, obviamente)

2) ¿Qué llamadas pueden hacer que el recurso no esté disponible?

¿Se considera que un MAPA con DESCARTE es una llamada de bloqueo?
¿Una consulta para obtener el DESC de un objeto?
Compartir un efecto Shader se considera una disputa?
¿Qué otros?

Mi marco general es:

41 DrawPrimitives/DrawIndexedPrimitives (más objeto son instanciado)
7/8 Bloqueos en una memoria tampón de vértice con descarte
9 cambio de sombreado de píxeles/vértice shader
1 SetRenderTarget

Gracias!

P.S. Captura de pantalla de pix

http://img191.imageshack.us/img191/6800/42594100.jpg

Si uso una sola llamada sorteo (con la misma carga GPU (por ejemplo, un motor de partículas con partículas de X o un objeto de instancia)) en lugar del juego completo I conseguir un azul lleno barra y la GPU correctamente 2-3 marco detrás de la CPU ...

EDIT: Me estoy enfocando cada vez más en el Marco de efectos que probablemente sea la razón de este problema. Comparto un efecto entre más objetos para ahorrar memoria y tiempo para crearlos. ¿Es seguro asumirlo sin contención?

+0

hum, pix ejecutando, ¿no puede aislar qué llamada está forzando la descarga? – Bahbar

Respuesta

1

Lo que viene a la mente con la información proporcionada:

  • ¿Utiliza el doble buffer con VSYNC? Quizás ambos estén esperando que el backbuffer esté disponible. Pruebe el triple almacenamiento en memoria intermedia o la presentación inmediata.
  • ¿Ha intentado bloquear el buffer de su vértice con una estrategia circular NOOVERWITE en lugar de 8 veces DISCARD? Tal vez haya demasiada presión de memoria para que la GPU reasigne un nuevo búfer para su descarte. Además, algunos dispositivos de hardware no permiten descartar el mismo búfer de vértices más de X veces antes de que pueda renderizarlo.
  • Dado que está compartiendo el mismo efecto, ¿los parámetros también se comparten?
+0

1) Intenté todos los tipos, buffering inmediato/doble/triple. Sin cambios 2) Descarté un búfer una vez por cuadro a un máx. (hay 8 búfer) 3) Mhn ... no, los parámetros están separados ya que son de clase lógica separada. – feal87

Cuestiones relacionadas