Monthly Archives: Listopad 2014

Uruchamianie aplikacji lub wątku na konkretnym rdzeniu procesora C#

Pracowałem ostatnio nad projektem, który posiadał jeden wątek, który pożerał wszelkie możliwości mojego niezbyt wydajnego procesora. Wątek korzystał z biblioteki do której źródeł nie miałem dostępu, przez co nie miałem możliwości zoptymalizować jego wykonywania. Więc postanowiłem, że ograniczeniem wydajnościowym dla niego będzie jeden rdzeń procesora.

W tej chwili praktycznie każdy procesor montowany w jakimkolwiek sprzęcie ma więcej niż jeden rdzeń, tak więc uruchomienie aplikacji, która będzie pozyskiwać większość mocy obliczeniowej z jednego rdzenia nie powinno stanowić problemu.

Jak to zrobić?

Okazuje się, że nadanie wątkowi, czy też aplikacji ograniczenia na konkretny rdzeń jest rzeczą bardzo łatwą i sprowadza się do dodania jednej linijki kodu w części aplikacji czy też wątku, który chcemy przekierować na konkretny rdzeń


Process.GetCurrentProcess().ProcessorAffinity = (IntPtr) 1;

Z tym, że zamiast jedynki możemy podać:

  • 1 – pierwszy rdzeń komputera
  • 2 – drugi rdzeń komputera (min. 2 procesory logiczne)
  • 3 – pierwszy i drugi rdzeń komputera (min. 2 procesory logiczne)
  • 7 – 1, 2, 3 rdzeń komputera (min. 3 procesory logiczne)
  • 9 – 1 i 4 rdzeń komputera (min. 4 procesory logiczne)
  • 127 – 1, 2, 3, 4, 5, 6 i 7 rdzeń komputera (min. 7 procesorów logicznych)

Uwaga

Warto obsłużyć błąd InvalidOperationException, jeżeli program może być wykonany na komputerze, który nie ma minimalnej wymaganej ilości procesorów logicznych.

Przykładowa aplikacja, która wykonuje się tylko na drugim rdzeniu:

Process.GetCurrentProcess().ProcessorAffinity = (IntPtr) 2;

while (true)
{
    var a = 1123*1234;
}

 

Efekt wykonania programu

Efekt wykonania programu

 


Chocolatey, czyli menadżer pakietów dla Windows

Ostatnio coraz bardziej popularne są różnego rodzaju menadżery pakietów dla Windows. Temat znany z Linuxa od dawna i słychać wiele głosów, że Microsoft wprowadzając menadżera pakietów w Windows 10 na stałe, po prostu zerżnął pomysł z Linuxa. Ja nie będę oceniał, czy zerżnął czy też nie, po prostu przedstawie menadżer „Chocolatey”, który wydaje mi się ciekawy, a z którego możesz skorzystać nie tylko w Windows 10. Continue reading

Klasyka Gier – Odcinek 6

Mafia: The City of Lost Heaven jest grą akcji z fabułą osadzoną w latach 30 XX wieku. Wcielamy się w postać Tommy’ego Angelo, którego losy całkiem przypadkiem zostały skrzyżowane ze światem gangsterskim. Nie mając zbytniego wyboru z taksówkarza stał się początkującym gangsterem.

Jej premiera odbyła się w 2002 roku i wywołała zamieszanie. Była dopracowana pod względem grafiki, dźwięku, który trzeba przyznać jest kapitalny i ma klimat, ale przede wszystkim miała świetną fabułę. mafia screen 3

Gra jest podzielona na 22 misje, które ukazują jak ciężkie jest żołnierza mafii. Większość misji wymaga użycia broni, której jest wiele typów, od klasycznych kijów baseballowych i noży, poprzez pistolety, strzelby i butelki z benzyną, na karabinach maszynowych (z obowiązkowym okrągłym magazynkiem) i snajperkach kończąc.

Warto wspomnieć o kapitalnej rzeczy jaką zastosowano w tej grze, czyli trybu „Free ride”, który pozwalał poza misjami w kampanii, walczyć z członkami mafii, kraść samochody, wykonywać dodatkowe misje oraz dał wolność poruszania się po mapie. A mapa jak na tamte czasy, była ogromna.mafia screen 2

Wyróżnić trzeba grafikę, ponieważ została stworzona w oparciu o zdjęcia autentycznych budynków i z tego powodu, nie miała wielkiego zapotrzebowania na moc obliczeniową.

Bardzo dobrą rzeczą jest „Carcyclopedia”, czyli encyklopedia samochodów użytych w grze. Można obejrzeć dokładnie samochody z lat 30 i poznać szczegóły techniczne.

Moim zdaniem ta gra nadal zasługuje na tytuł jednej z najlepszych gier, choć powstała 12 lat temu i przeszedłem kampanie jakieś 5 razy, a nadal mam ochotę do niej wracać.

Zapis elementu okna WPF do pliku graficznego

Tworzyłem aplikacje, która miała za zadanie wyświetlać obraz z kamery, a użytkownik miał dodawać elementy typu wąsy, a następnie obraz miał zostać zapisany do pliku. Najprostszym sposobem na zapisanie obrazu z wąsami do pliku okazało się po prostu wy-renderowanie elementu Canvas jako bitmapa i zapis do pliku.

Użyłem tej funkcji:

public void ExportToPng(Uri path, FrameworkElement element)
{
    if (path == null) return;

    Transform transform = element.LayoutTransform;
    element.LayoutTransform = null;

    // Pobieranie rozmiaru elementu graficznego
    Size size = new Size(element.Width, element.Height);
    element.Measure(size);
    element.Arrange(new Rect(size));

    RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32);
    renderBitmap.Render(element);

    // Tworzenie pliku
    using (FileStream outStream = new FileStream(path.LocalPath, FileMode.Create))
    {
        // Wybierz format pliku graficznego i odkomentuj go, ja wybrałem format PNG
        // BmpBitmapEncoder encoder = new BmpBitmapEncoder();
        // JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
        encoder.Save(outStream);
    }

    element.LayoutTransform = transform;
}

Teraz wystarczy już tylko dodać kod, który będzie wywoływał zapis do pliku.


ExportToPng(new Uri("test.png"), paintCanvas);

Równie dobrze można zapisywać w ten sam sposób inne elementy ekranu jak Grid.