Maximale systemlast, wenn programm als Child läuft.



  • Hi @ll.

    ich bins nochma. also ich hab das problem, das das game was ich als child fenster laufen lasse, in meiner app alle verfügbaren ressourcen belegt, wenn ich BOINC anhab sind es die, die er übrig läßt, wenn der computer idlet nahezu 100%.

    das ganze geschieht aber erst, wenn ich ein game erstelle und mich im spiel bewege.
    wenn ich ganz normal nur das game lade und als child nutze ist die systemlast normal.

    nun meine frage, wie bewege ich das child dazu, net so ne hohe systemlast zu haben? muss ich irgendwie die msgqueque abfangen vom child? oder liegts an wm_paint vom child? muss ich da per subclassing irgendwie nen begin und endpaint einbaun?

    plz helft mir 🙂

    danke und cYa CAD

    PS.: hab jetzt per Subclassing die WM_PAINT abgefangen. keine veränderung

    LRESULT CALLBACK WndProcChild( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       switch (message)
       {
          case WM_PAINT:
            {
                hdc = BeginPaint( hChild, &ps);
                EndPaint( hChild, &ps);
                return( 0);
            }
            break;
       }
    return CallWindowProc ((WNDPROC) PrevWndProcChild, hwnd, message, wParam, lParam);
    }
    


  • Wie ist denn die Systemlast, wenn du das Spiel normal startest - Spiel erzeugen häufig soviel Systemlast, wie sie bekommen können...



  • nö flenders, die systemlast is vollkommen human , bis zu dem punkt wo ich nen spiel erstelle oder joine. selbst im chan ist noch ne normale systemlast von 2-5% also net der rede wert.



  • Es liegt vermutlich daran, dass Du versucht so schnell wie möglich das Fenster neu zu Zeichnen (bzw. InvalidateRect aufrufst). Du kannst aber auch einfach debuggen, zw. ein Profiler laufen lassen...



  • sry jochen aber ich nutze winapi jetzt erst ne geraume woche 😕

    kannst du mir das vielleicht bitte etwas näher erklären wie ich das löse.

    danke CAD



  • MasterCAD schrieb:

    die systemlast is vollkommen human , bis zu dem punkt wo ich nen spiel erstelle oder joine.

    Also ist die Systemlast niedrig, wenn du das Spiel (das stammt nicht von dir und ist eine fertige Anwendung?) direkt startest - also nicht in deine Anwendung eingebunden?



  • ums weng vorstellbarer zu machen flenders :

    ich hab nen progg für diablo II geschrieben, da das im window mode beim klick auf den desktop ständig minimiert und man dadurch keine kontrolle mehr über das game hat so lange bis mans wieder maximiert, da das ne nervige funktion ist und viele leute in der comm mega nervt hab ich halt ein progg gebaut, was das d2 window als parent übernimmt und im vordergrund hält, wenn man wo aufn desktop klickt.

    einfach aber wirkungsvoll und alle sind glücklich, ich würd nun aber gern dauerhaft so spielen, wenn da net sie hohe systemlast wäre. die wie gesagt nur dann ist, wenn ich in ein spiel gehe. so lange ich im chanel steh is die systemlast nahezu 0, egal ob ich das game als parent gegriffen habe oder obs allein läuft.

    wenn das game hingegen allein läuft hab ich auch net sone hohe systemlast wenn ich in nem game bin, das wiederum habe ich nur wenn ichs als parent am laufen habe. ich hoffe jetzt is die ganze sache weng klarer 🙂



  • Du kannst es ja mal mit einer anderen Anwendung als Diabolo 2 versuchen - z.B. Notepad. Ich vermute nämlich, dass das ganze an dem Spiel liegt (sonst müsste es ja auch vorher schon so hohe Systemlast erzeugen). Problem ist eben, dass die meisten Spiele als Vollbildanwendung ausgelegt sind, da sie dann mehr System-Ressourcen bekommen können. Bindest du es jetzt als Child ein, läuft das Spiel nicht mehr im Exklusiv-Modus und andere Anwendungen ziehen zusätzlich Prozessor-Leistung. Daher denke ich, dass sich das nicht wirklich lösen lässt - aber ich habe auch nicht so viel Ahnung, dass das heißt, dass es auf keinen Fall nicht geht.



  • naja flenders man kann diablo II per parameter von haus aus auch als window mode also im fenster starten, und da is die auslastung wie gesagt gegen null.



  • Startest du es dann auch so (also mit diesem Parameter), wenn du es bei dir als Child einbindest? Evtl. wird da dann Code-technisch auch eine andere Nachrichtenschleife vervendet?! 🙄



  • klar , ich starte es, ich muss es sogar so starten, mit parametern, das fenster ist nicht veränderbar in seiner größe, selbst wenn ich versuche aus dem window mode nen vollbild zu machen funzt das net. es maximiert zwar das fenster, aber man sieht trotzdem net mehr als nur die 800x600 aus dem window mode.

    schwer zu erklären ^^ alles in allem bin ich aber gezwungen es im window mode zu starten. das programm ist ja auch nur für den window mode geplant. d2 minimiert zwar auch im vollbild modus, wenn irgend etwas auf dem desktop aufpoppt( wie icq oder so) aber das ist nicht mein haupt augenmerk atm.

    mir gehts darum das ich das window von d2 im window mode oben , also OnTop halt. was auch funktioniert aber eben unter ner extrem hohen system last wenn ich in ein spiel gehe. für mich sieht es auch so aus als wenn d2 die ressourcen nur vorsorglich auf 100% setzt aber nicht so viel brauch, da ich nach wie vor mit den meiner meinung nach selben fps spiele als wenn ichs net mit meiner anwendung onTop halte. ich denke mal das programm brauch die ressourcen gar net.

    da ich noch nicht so weit fortgeschritten bin mit der windows programmierung kann ich leider nicht ganz nach vollziehen, was da genau passiert. denke mir aber das da irgend welche commands gesendet werden aber nicht abgefangen.

    ich hatte ja auch gehofft das konrad seine idee noch etwas ausführt 🙂

    danke und ein schönes wochenende CAD



  • Hm, dann weiß ich auch nicht so wirklich weiter - kannst ja mal mit Spy++ bzw. WinSpector nachschauen, ob du viele Messages gesendet bekommst, die du abfangen solltest?!

    Hast du mal versucht, das Programm gar nicht als Child einzubinden, sondern normal zu starten und dann die Window-Styles auf Always-On-Top zu korrigieren?



  • wenn ich dieses spy++ richtig verstanden habe ( ich nutze normal kein vc) dann zeigt das alle threads des programms an wenn man auf das + vor dem programm namen klickt. da wäre dann aber das prob das es vor Game.exe von Diablo II kein + gibt. oO

    // Edit

    ich hab schon alles mögliche probiert um das fenster onTop zu setzen, das game fesnter von d2 nimmt keine änderungen an. daher hab ich mir ja erst die arbeit gemacht dieses tool zu schreiben, sonst hätt mans ja einfachstens mit nem button baun können.



  • Ich habe das auch schon festgestellt.
    Bei mir ist das auch immer, wenn ich die Message-Funktion

    PeekMessage(...)
    

    anstatt

    GetMessage(...)
    

    verwende.

    Wenn ich also

    GetMessage(..)
    

    verwende, dann habe ich normale Systemauslastung.

    PeekMessage(...)
    

    hingegen wartet ja nicht auf eine Nachricht, sondern holt sich immer eine und wartet nicht.
    Vielleicht Hilft Dir das ja weiter...

    Wobei es mich mal interessieren würde, wie man bei PeekMessage() die Systemleitung runterschrauben kann?!?!
    D.h, dass der Computer nicht immer 100% Systemauslastung hat.

    Gruß
    DeineMutter



  • DeineMutter schrieb:

    Wobei es mich mal interessieren würde, wie man bei PeekMessage() die Systemleitung runterschrauben kann?!?!

    Indem du mit WaitMessage, Sleep o.ä. auf deine Rechenzeit verzichtest...



  • ich betnutze weder GerMessage noch PeekMessage, denke aber das es was bringen würde wild umherfliegende messages vom game window ab zufangen und gegebenen falles zu lenken bzw weiter zu leiten.

    würd GetMessage oder PeekMessage sowas erledigen?



  • MasterCAD schrieb:

    ich betnutze weder GerMessage noch PeekMessage...

    Das heißt, du hast bisher noch gar keine Message-Loop?! 😕

    Wie sieht denn dann deine Parent MessageProc aus? Und wie deine WinMain - wenn du angeblich gar kein GetMessage / PeekMessage verwendest?!



  • kann sein das ich euch auch falsch verstehe, ich hab halt keinen befehl eingebaut der so heist.

    oh ich sehs grad. in der winmain is nen getmessage, jo an die hab ich schon gar net mehr gedacht ^^ das is schon in fleisch und blut 😃 ja ok dann hab ich ne GetMessage() sry 😮

    bin schon vollkommen verwirrt wegen diesen blöden 100% ich zerbrech mir schon tage lang den kopf und nix ändert sich.

    sry



  • Zeig doch z.B. mal deine WndProc des Parent-Windows...



  • //------------------------------------------------------------------------------
    int WINAPI WinMain (HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance     = hInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc   = WindowProcedure;      /* This function is called by windows */
        wincl.style         = CS_DBLCLKS;                 /* Catch double-clicks */
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon         = LoadIcon (hInstance, MAKEINTRESOURCE( IDI_MYICON));
        wincl.hIconSm       = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_MYICONSM));
        wincl.hCursor       = LoadCursor (hInstance, IDC_ARROW);
        wincl.lpszMenuName  = NULL;                 /* No menu */
        wincl.cbClsExtra    = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra    = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground =  (HBRUSH) COLOR_BACKGROUND;//CreateSolidBrush(RGB( 236, 233, 216));
                                // macht das fenster durchsichtig
                                //(HBRUSH) GetStockObject( RGB( 236, 233, 216));//COLOR_BACKGROUND;
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Syllis kleines Helferlein",       /* Title Text */
               DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               690,                 /* The programs width */
               430,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    

    das ?


Log in to reply