RDP ohne interaktion implementiern?





  • volkard schrieb:

    cooky451 schrieb:
    Läuft bei mir mit unverantwortlichen 2%-3% Prozessorauslastung; und dabei muss hier noch auf dem eigenen Rechner gezeichnet werden. Da lohnt ein Grafikkartentreiber natürlich!

    Ich denke, es geht nicht darum. Man will ja nicht gerade 1000/15*1650*1280*3 == 422400000 Bytes pro Sekunde übers Netzwerk schieben. Also muß irgendwas her, das spart. Zunächst mal kann man versuchen, die Bilder zu packen. Aber mit dem Desktopimage von dieser Frau da und dem Porsche, viel holt man da nicht raus. Stärker ist es vielleicht, nur die Änderungen von Frame zu Frame zu schicken. Das ist ja schnell berechnet und auch schonmal recht nett.
    Aber so supi lassen sich kaum noch Sachen packen. Die Geraden sind nicht mehr treppig, sondern antialiazed glatt und verwaschen und viele Bytes groß. Würde man statt der ganzen Pixels nur die Anweisung bekommen, dort und dort eine antialiazed Gerade zu malen, das würde so richtig sparen. Ich vermute, darauf zielt das ab. Die grafischen Grundbefehle zu bekommen und sie auf dem Zielrechner zu rendern. Und vielleicht, weil man eh ein Treiber ist, weniger Ruckeln und ein stärkeres subjektives Geschwindigkeitsgefühl.

    Trotzdem würde ich screenshotten, weil ich gerne ausprobieren würde, wie stark man packen kann, wenn man sich 1G history leistet und nicht die Änderungen zum vorhergehenden Frame, sondern die Änderungen zum bestpassenden history-Frame schickt. Oder man sammelt mit der Zeit rechteckige Bausteine, die oft in Frames auftauchten. Buchtstaben und ganze Menus würde er lernen.

    Du weist um was es geht 😉



  • @cooky451
    Dein Programm ist für ein Hund! Erstens brauche ist auf einem normalen Cpu 20% Auslastung! Und dies dann übers Netzwerk zu schicken wäre fatal langsam! Egal ob mit oder ohne compression!

    Volkard! Ich hätte gerne mehr gewüsst von Bildoptimierungs - Kompressions - Techniken.



  • www.c-plusplus.net schrieb:

    @cooky451
    Dein Programm ist für ein Hund!

    Na solange es nicht für den Hund ist, ist doch alles in Ordung 😃

    www.c-plusplus.net schrieb:

    Erstens brauche ist auf einem normalen Cpu 20% Auslastung!

    Na, wenn du das Zeichnen weg lässt ist die Auslastung wieder auf ~0%.

    www.c-plusplus.net schrieb:

    Und dies dann übers Netzwerk zu schicken wäre fatal langsam! Egal ob mit oder ohne compression!

    Auch mit Kompression? Aha. Zum Glück liegen die Daten in der Grafikkarte schon fertig als .mp4, muss man nur noch auslesen!



  • Wie kämme ich zbsp. an den bildspeicher heran? in deinem Code? Also die Daten in einem array. Oder ein Zeiger darauf?



  • www.c-plusplus.net schrieb:

    Wie kämme ich zbsp. an den bildspeicher heran? in deinem Code? Also die Daten in einem array. Oder ein Zeiger darauf?

    Wenn du willst, bastel ich dir was, würde mich eh reizen. Ich setze mich mal drann, sollte heute/morgen fertig sein 😉
    (Allerdings erst mal ohne Komprimierung etc., nur die Daten über Netz schicken.)



  • Dass mit dem übers Netz schicken ist kein Problem...möchte nur wissen wie ich auf denn Speicher des hdc zugreifen kann.



  • Kenne mich mit der GDI nicht so aus!



  • www.c-plusplus.net schrieb:

    Kenne mich mit der GDI nicht so aus!

    Ich auch nicht 😉

    Es funktioniert jedenfalls so:

    Sender:

    screen_x = GetSystemMetrics(SM_CXSCREEN);
    screen_y = GetSystemMetrics(SM_CYSCREEN);
    deskDC = GetDC(0);
    memDC = CreateCompatibleDC(deskDC);
    memBMP = CreateCompatibleBitmap(deskDC, screen_x, screen_y);
    SelectObject(memDC, memBMP);
    
    // see http://msdn.microsoft.com/en-us/library/dd183402%28v=vs.85%29.aspx
    imgSize = ((screen_x * 32 + 31) / 32) * 4 * screen_y;
    buf = (char*)malloc(imgSize);
    
    BITMAPINFO bmpInfo = {0};
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfo.bmiHeader.biWidth = screen_x;
    bmpInfo.bmiHeader.biHeight = screen_y;
    bmpInfo.bmiHeader.biPlanes = 1;
    bmpInfo.bmiHeader.biBitCount = 32;
    bmpInfo.bmiHeader.biCompression = BI_RGB;
    bmpInfo.bmiHeader.biSizeImage = 0;
    bmpInfo.bmiHeader.biXPelsPerMeter = 0;
    bmpInfo.bmiHeader.biYPelsPerMeter = 0;
    bmpInfo.bmiHeader.biClrUsed = 0;
    bmpInfo.bmiHeader.biClrImportant = 0;
    
    BitBlt(memDC, 0, 0, screen_x, screen_y, deskDC, 0, 0, SRCCOPY);
    GetDIBits(memDC, memBMP, 0, screen_y, buf, &bmpInfo, DIB_RGB_COLORS);
    

    Empfänger:

    winDC = GetDC(hwnd);
    memDC = CreateCompatibleDC(winDC);
    memBMP = CreateCompatibleBitmap(memDC, SCREEN_X, SCREEN_Y);
    SelectObject(memDC, memBMP);
    
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfo.bmiHeader.biWidth = SCREEN_X;
    bmpInfo.bmiHeader.biHeight = SCREEN_Y;
    bmpInfo.bmiHeader.biPlanes = 1;
    bmpInfo.bmiHeader.biBitCount = 32;
    bmpInfo.bmiHeader.biCompression = BI_RGB;
    bmpInfo.bmiHeader.biSizeImage = imgSize;
    bmpInfo.bmiHeader.biXPelsPerMeter = 0;
    bmpInfo.bmiHeader.biYPelsPerMeter = 0;
    bmpInfo.bmiHeader.biClrUsed = 0;
    bmpInfo.bmiHeader.biClrImportant = 0;
    
    SetDIBitsToDevice(winDC, 0, 0, SCREEN_X, SCREEN_Y, 0, 0, 0, 
      SCREEN_Y, buf, &bmpInfo, DIB_RGB_COLORS);
    

    Wobei das natürlich suboptimal ist, ich würde an deiner Stelle versuchen die Bitmaps auf Senderseite direkt in eine Art Videostream oder so was umzuwandeln. Wenn du noch Interesse an einem vollständigen Beispielprogramm hast, schreib eben.



  • Vielen Dank das reicht mir so.



  • @cooky451

    Spätestens bei übertragung ins "WAN" auf einen anderen PC wirst Du ohne starke Kompression nicht mal ein Bild pro Sec haben.. Ohne jetzt das gross nachgerechnet zu haben!



  • xy schrieb:

    @cooky451

    Spätestens bei übertragung ins "WAN" auf einen anderen PC wirst Du ohne starke Kompression nicht mal ein Bild pro Sec haben.. Ohne jetzt das gross nachgerechnet zu haben!

    Der nächste Experte. Bitte erst alles lesen und danach schreiben, danke 🙄



  • cooky451 schrieb:

    xy schrieb:

    @cooky451

    Spätestens bei übertragung ins "WAN" auf einen anderen PC wirst Du ohne starke Kompression nicht mal ein Bild pro Sec haben.. Ohne jetzt das gross nachgerechnet zu haben!

    Der nächste Experte. Bitte erst alles lesen und danach schreiben, danke 🙄

    Naja





  • Mit dem freien x264 Codec, eventuell in Verbindung mit ffmpeg könnte man es schaffen, einen direkten .mp4 Videostream zu erzeugen. ffmpeg ist leider relativ bescheiden dokumentiert, aber vielleicht reicht der x264 Codec ja. Solche Kompressionsverfahren belasten die CPU natürlich, aber auf Qualität muss man ja nicht sonderlich achten und ich denke nicht, dass es viel performanter geht bevor nicht flächendeckend vdsl verfügbar ist.

    Edit:
    Alles klar 😉



  • Bitte beim Thema bleiben...


Anmelden zum Antworten