Archive

Archive for March, 2008

Tænde og slukke for Vista Window Manager

March 15th, 2008

Hvis man gerne vil køre et fuldskærms spil i Vista kan man støde ind i problemet at system ikonerne kan begynde at flimre igennem spillet. Det gjorde jeg under udvikling af SharpMedia. Så jeg fandt ind på: Enable and Control DWM Composition.

Der fandt jeg de funktioner der skal til for at slå Aero fra når man vil vise et fullscreen spil. Jeg er i tvivl om hvorvidt XNA selv kan finde ud af det når man bruger Game klassen, men den fejler ved det når man bruger XNA i WinForms.

Her er lige noget kode til at slukke og tænde for Dwm:

public class VistaControl
{
    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern bool DwmIsCompositionEnabled();

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern int DwmEnableComposition(uint uCompositeAction);

    public const uint DWM_EC_ENABLECOMPOSITION = 1;
    public const uint DWM_EC_DISABLECOMPOSITION = 0;

}

For at opretholde noget kombatibilitet til XP har jeg selvfølgelig et check på at disse funktioner kun bliver kaldt hvis man kører vista, min endelige funktion som jeg kalder inden mit GraphicsDevice bliver reset ser således ud:

if (Environment.OSVersion.Version.Major >= 6) // if vista
{
    if (Windowed == WindowMode.ExclusiveFullscreen
        && VistaControl.DwmIsCompositionEnabled())
    {
        VistaControl.DwmEnableComposition(VistaControl.DWM_EC_DISABLECOMPOSITION);
    }
    else if (Windowed != WindowMode.ExclusiveFullscreen
        && !VistaControl.DwmIsCompositionEnabled())
    {
        VistaControl.DwmEnableComposition(VistaControl.DWM_EC_ENABLECOMPOSITION);
    }
}

felizk OS, Programming, XNA

DirectShow i XNA

March 9th, 2008

Jeg har længe rodet med mit hjemmelavede media center program i C#: SharpMedia og det varer ikke alt for længe før jeg udgiver en beta version af det her på min hjemmeside.

De første versioner af SharpMedia var blot en “glorified” fil browser, når man startede en film åbnede SharpMedia blot en 3. parts afspiller som Media Player Classic eller Zoom Player. Det synes jeg dog var lidt for trist så jeg gav mig i med at implementere DirectShow i programmet. DirectShow er Windows’ indbyggede media framework, det er det der gør at når man installerer DivX decoder på sin computer så kan alle afspillere man har afspille DivX filer.

Til det brugte jeg DirectShow.Net som er en Managed Wrapper til DirectShow. Da jeg gjorde dette første gang var det til Managed DirectX og ikke XNA, men for nyeligt portede jeg hele mit SharpMedia til XNA. Så første opgave når man laver sådan noget er at finde ud af hvordan jeg skal få videoen vist i XNA.

Der findes en løsning allerede (udviklet parallelt med det jeg foreslår) her. Den løsning bruger dog ikke samme metode, som jeg har brugt. I denne løsning bruges noget der kaldes en SampleGrabber, der stortset blot tager et screenshot som derefter kopieres over på en texture.

Jeg har valgt at bruge en Allocator/Presenter, som er en feature VMR9 har. Fordelen ved denne metode er at den er designet til at arbejde med Direct3D (som XNA er baseret på). Den virker ved at du ved start af en video laver en instans af VMR9 renderen og giver den en reference til en Direct3D surface. For hver frame af videoen bliver den surface så tegnet på af VMR9 og dit program får det af vide så du kan tegne surfacens texture i dit spil/program.

Der er flere gode grunde til at bruge denne metode frem for den anden, først er performance, det er meget tungt at kopiere en hel video frame manuelt i Managed kode, specielt hvis vi snakker High Definition content. Ved at bruge VMR9 får codecs også bedere muligheder for hardware acceleration til ting som fx deinterlacing. Det nyder man specielt godt af hvis man bruger Nvidia PureVideo til DVD afspilning. Sidst, men bestemt ikke mindst, giver denne fremgangsmåde mulighed for det der kaldes Exclusive Fullscreen. Fordi et XNA program er Direct3D kan man lave en fullscreen applikation der har 100% råderet over grafikkortet. Det giver bedere muligheder for at undgå visuelle artefakter, som screen tearing, så bedre kvalitet i sidste ende ^^

XNA Implementationen

Men hvordan får vi så adgang til disse fede features? Først og fremmest så skulle jeg finde ud af hvordan man får fat i en pointer til en Direct3D surface i XNA. Pointeren skal VMR9 bruge for at kunne tegne til surfacen. Dette er faktisk ikke en hel triviel opgave i XNA. Alt er pakket godt ind i Managed kode og vi vil jo normalt helst ikke rode rundt med pointere. Først prøvede jeg at bruge reflection til at grave ned i en Texture2D og få fat i en surface. Dette var dog ikke muligt lige umiddelbart, der var en pointer til en Direct3d9 Texture men ikke til dens surface.

Svaret ligger i RenderTarget2D. Det lyder sådan set meget logisk da man normalt bruger et rendertarget til at tegne direkte til en texture istedet for til grafikkortets backbuffer. I XNA kan et rendertarget være sat i to forskellige tilstande, et der efterligner hvordan det virker på en Xbox360, hvor indholdet af rendertargeten bliver slettet efter brug(DiscardContent), og en tilstand til windows hvor det bliver gemt (PreserveContent). For at bruge RenderTarget2D til vores allocator skal den være sat i DiscardContent, for hvis den er sat til PreserveContent findes der ikke en pointer til en Direct3D9Surface gemt dybt begravet i objektet.

Når vi har surfacen er det “bare” at implementere en Allocator/Presenter som beskrevet i linket ovenfor så har man DirectShow i XNA.

Nu har jeg selvfølgelig snydt lidt hjemmefra og kogt et lille projekt sammen der kan det grundlæggende, hvis der er nogen der interesserede i en dybere forklaring eller hjælp til at lave deres egen så sig endelig til :)

Download:

DirectShow in XNA using Allocator

felizk DirectShow, Programming, XNA

Filofil Workshop i går

March 9th, 2008

I går Lørdag 8/3 afholdte vi det første af mange workshops i Bretteville på Brettevillesgade 14. Vi er glade for at der dukkede så mange op for at sidde og bruge en weekend på at udvikle computer spil. Der var folk fra mange forskellige steder og det er vi meget glade for at se. Der blev arbejdet hårdt på diverse projekter og dem der har gået og ikke kunne tage sig sammen til at lægge noget tid i deres projekter kom godt igang og havde gode muligheder for at få hjælp fra andre.

Bretteville er et fedt sted for os at holde disse spil udviklings LAN, der er massere af plads, gode faciliteter og så er det på neutral grund da det er åbent for alle, til forskel for de workshops vi har afholdt på AAU. Så jeg vil gerne lige takke de ansatte hos Bretteville for deres hjælp til at få os op og køre :)

Næste workshop bliver afholdt om ca en måned, vi finder hurtigt en dato til det og sender det ud på alle mailinglister vi har. Desuden har vi fået/lånt en server af Bretteville som kommer online snarest, på den sætter vi en SVN server hvor i kan gemme og dele jeres projekter med os andre. Vores hjemmeside filofil.dk flyttes også over på den nye server og bliver opdateret med et (ikke über spammet) forum.

Filofil kan I læse mere om på vores hjemmeside.

felizk Personal

Microsoft Student Partner (MSP)

March 9th, 2008

Som Martin Esmann har skrevet på hans blog så er jeg officielt blevet Microsoft Student Partner. “Hvorfor dog det?”, ville nogle folk måske spørge, og svaret er simpelt: Som MSP kan man få en fod inden for døren hos en af verdens største software virksomheder, og i følge “Great Place To Work” den bedste arbejdsplads i Danmark.

Det der interesserede mig mest og virkelig overbeviste mig om at MSP var noget for mig, var til et XNA arrangement i København hvor Charles Cox og Dave Mitchell, som er henholdsvis generelt cool XNA person og XNA Director, lavede en præsentation af XNA frameworket, lukkede nogle guldkorn ud om fremtiden og lavede et spil i XNA på 59 mins. Efter arrangementet hvor vi andre tog tilbage til Aalborg lavede Morten Sneftrup Pedersen, AAU’s anden MSP, et interview med de 2 herrer fra USA, som til dagligt arbejder med at lave XNA til os andre.

Det er sådan nogle muligheder der interesserer mig for MSP programmet og da jeg alligevel bruger Visual Studio og XNA til dagligt og synes det er rigtig gode tools er MSP en oplagt mulighed og motivator for at ikke bare at lære de tools man bruger, men lære dem så godt at man kan præsentere dem for andre.

Jeg begynder med denne post at skrive på dansk på min blog. Dvs. at jeg i fremtiden vil poste nogle guldkorn jeg er faldet over i XNA eller andre interessante emner på dansk.

Hvis du er interesseret i at blive MSP så tag et kig på Martins blog.

felizk MSP, Personal, XNA