Startsidan

Prenumerera på mina inlägg:
RSS-flöde

Kontakta mig gärna via e-post:
anders.fjeldstad@gmail.com

Följ mig via Twitter:
twitter.com/Hihaj

Sök bland alla inlägg:

Arkiv för februari 2009

Hantera WebBrowser-kontrollens minnesläckor

måndag 23 februari 2009 | Kategorier: .NET, Microsoft, Teknik | Inga kommentarer

Jag har under de senaste åren vid ett flertal tillfällen stött på WebBrowser-kontrollen, som är en .NET wrapper-klass till en underliggande ActiveX-kontroll motsvarande en Internet Explorer-instans. Kontrollen gör det enkelt att lägga in ett webbläsarfönster i sina .NET-baserade Windowsprogram, och även om den är lite bänglig att jobba med så har den definitivt sina tillämpningsområden.

Nu senast var det hos en kund som jag satt och fipplade med WebBrowser. Jag ville att popup-fönster skulle öppnas i en ny WebBrowser-kontroll istället för i ett vanligt Internet Explorer-fönster (vilket är standardbeteendet), och det gick att åstadkomma med lite pill. När användaren öppnat en popup och sedan stängde den så slängdes WebBrowser-instansen bort, med allt vad det innebär av Dispose():ande. Det jag insåg ganska snabbt var att det minne som allokerades vid skapandet av popup-webbläsaren inte frigjordes när den stängdes. En minnesläcka alltså. Detta var något som sett i tidigare projekt, men då handlade det mest om det minne som kontrollen läcker varje gång en ny sida laddas, vilket sker i ett mycket långsammare tempo. Jag hade aldrig tidigare kommit på varför minnesläckorna uppstått eller hur jag skulle komma till rätta med dem. Det har heller inte varit något affärskritiskt i de tidigare fallen, men för den här aktuella kunden var det just det.

Efter lite Googlande kunde jag konstatera att minnesläckorna i WebBrowser-kontrollen är kända av Microsoft, och att det även finns ”hotfixes” för dem (som jag tror ska vara inkluderade i diverse service packs för olika versioner av Windows). Jag provade att installera en sådan hotfix och kunde inte se någon skillnad överhuvudtaget.

Några timmar senare hittade jag däremot ett mycket intressant API-anrop som jag faktiskt tror löser min kunds problem, nämligen SetProcessWorkingSetSize i assemblyn kernel32.dll. Metoden används för att ställa in övre och undre gränser för det reserverade arbetsminnet för en given process, men om man anropar den med -1 som parametrar för gränserna så frigörs så mycket arbetsminne som möjligt. Så här kan det se ut i ett program skrivet med C#:

// Importera metoder från kernel32.dll, någonstans i klassdefinitionen...
[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);

[DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern IntPtr GetCurrentProcess();

// ...och frigör arbetsminne där det passar.
IntPtr pHandle = GetCurrentProcess();
SetProcessWorkingSetSize(pHandle, -1, -1);

Så var det med den saken. Den ursprungliga forumtråden där jag läste om detta hittar du här, och Microsofts dokumentation av de aktuella metoderna i kernel32.dll finns här. Hoppas det hjälper någon.

Allt flyttat från Loopia till Binero

tisdag 17 februari 2009 | Kategorier: Teknik | 2 kommentarer

Jag skrev tidigare att jag skaffat ett webbhotellskonto hos Binero. Idag har jag flyttat allt jag hade hos Loopia till Binero, så det kan hända att något missats eller så. Säg till om ni ser något skumt.

Shit, jag kom precis på att jag glömt skapa upp alla mailkonton…och nu strular Bineros kontrollpanel lite, bra början! Wohoo! Så försök inte skicka något till @fjeldstad.se eller @fjeldstadmedieteknik.se just nu…

Valkyria Chronicles avklarat

söndag 08 februari 2009 | Kategorier: Spel | Inga kommentarer

Innan jul köpte jag Playstation 3-spelet Valkyria Chronicles efter att ha blivit förförd av demot från Playstation Network. Nu ett par månader senare har eftertexterna rullat över TV:n, så jag tänkte dela med mig av några reflektioner.

Valkyria Chronicles är ett slags turbaserat strategispel. Spelets historia berättas som kapitel i en bok och handlar om ett alternativt andra världskrig i en fantasivärld med referenser både hit och dit. Det lilla landet Gallia har hamnat i kläm mellan två stora stridande sidor, Federationen och Imperiet. Som spelare kommer man in i konflikten precis när Imperiets stridsvagnar har börjat rulla in över Gallias gräns. Huvudpersonen heter Welkin och har som största intresse att studera småkryp och lukta på blommor, men finner sig på grund av kriget snart en plats som befäl över en liten grupp soldater i Gallias hemvärn. Så börjar det hela, och längs spelets gång får man via (oändliga) filmsekvenser lära känna gruppens medlemmar ganska bra och se hur de i klassisk David mot Goliat-anda står emot den teknologiskt- och numerärt överlägsna armén som Imperiet förfogar över.

Det måste sägas att historien i sina detaljer är ganska larvig. Fnissande och rodnande är kanske inget jag förknippar med samtal under en pågående strid på liv och död, men så funkar det i Valkyria Chronicles, som på många sätt uppfyller min säkert ganska fördomsulla bild av ett ”typiskt japanskt actionroll/strategispel”. För japanskt är det. Den grafiska stilen känns igen från mangaserier och animefilmer, något som jag personligen alltid haft oproportionerligt svårt för. Det som gör att det funkar i Valkyria är att det är så sjukt snyggt! Det ser verkligen ut som en teknad film trots att det är full 3D-grafik. Knivskarpa detaljer inramade av paradislika pastellfärgade landskap, helt okej karaktärsanimationer och grymma effekter gör detta till ett av de mest estetiskt tilltalande spelen jag sett, alla kategorier.

Gameplaymässigt är spelet också riktigt bra. Bortsett från en del mindre (men irriterande) buggar så funkar de turbaserade striderna precis som de ska – de är kluriga, man får ibland försöka från början eftersom man inte kommit på en tillräckligt bra taktik, men samtidigt håller de ett tillräckligt tempo för att man ska känna en lagom stress och behålla fokus. Soldater och stridsvagnar förhåller sig till varandra enligt sten-sax-påse-principen och det gäller att utnyttja de olika enheternas styrkor för att man ska klara de utmaningar som spelets kampanj erbjuder. Beroende på  hur väl man klarat en bana får man en viss mängd erfarenhetspoäng och pengar, och dessa kan sedan användas för att utveckla både karaktärsklasser och vapen. Vill man kan man gå tillbaka och köra om tidigare uppdrag för att prova en ny taktik eller bara för att samla lite mer poäng så att man kan förbättra sina soldater.

Just genren turbaserade strategispel är kanske inte jättestor i västvärlden – jag har själv inte något modernt exempel på något liknande spel jag testat – men jag gillade verkligen konceptet i Valkyria Chronicles. I och med att det är så taktiskt så sitter man ofta och klurar inför ett svårt ”drag”, och sedan känner man sig smart när ens plan visade sig fungera. (Vilket är anmärkningsvärt tycker jag, det är inte ofta ett spel får mig att känna mig smart. Kanske spelar jag för lite schack?) Striderna blir visserligen potentiellt ganska långa i och med att man har så mycket betänketid man vill på sig, men å andra sidan kan man ta en paus när man känner för det. Plus spelet kan vara rätt socialt – det är kul att sitta ett par stycken och klura tillsammans, och det spelar inte så stor roll vem som håller i handkontrollen.

Så sammantaget – en milt engagerande karaktärsporträtt, några småbuggar och bitvis ojämn kvalitet i mellansekvenser lyckas definitivt inte sänka det här riktigt grymma spelet som glänser med både grafik, gameplay och spelglädje. Har du en Playstation 3 så tycker jag absolut att du åtminstone borde ladda ner demot. Jag har gottat mig.