Hallo allemaal! In deze thread zou ik een vraag willen stellen op basis van mening en suggesties / ideeën waar ik mogelijk niet over nagedacht heb. Ik ben bezig met het bouwen van een programma en dat programma doet het volgende.
Er draait een applicatie in window mode. Mijn programma maakt continue screenshots van dit venster, loopt door de pixels heen en kijkt of de kleur van de pixel matcht met de geconfigureerde kleur. Als de kleur matcht dan verplaatst het programma de cursor naar deze pixel.
Dit stuk code is zeer performance kritisch. De eerste methode die ik hanteerde was de simpelste, met GetPixel. GetPixel was echter veel te langzaam bij het snel renderen van screenshots en gebruikte ook veel te veel processorkracht. Nu heb ik de manier veranderd in het doorlopen van de RGB waardes van de bitmap, wat 2 tot 2,5 keer zo snel is. Daar ben ik nu tevreden over. Echter vind ik het een uitdaging om het nog sneller te krijgen. Ik wil ervoor zorgen dat meerdere threads tegelijk werken om deze operatie sneller te laten werken. De cursor moet zo soepel mogelijk worden verplaatst, wat deze code moet verzorgen
Ik heb nagedacht over twee mogelijkheden:
- Ik maak meerdere threads die allemaal een aparte screenshot maken en renderen. Het voordeel hiervan is dat het gemakkelijker te implementeren is. Het nadeel is dat ik goed moet bedenken hoe ik ervoor kan zorgen dat de threads niet helemaal gelijk lopen. Als ze gelijk lopen betekent het dat ze dezelfde screenshot maken, wat overbodig werk is, maar ook de cursor de verkeerde kant op zou kunnen sturen.
- Ik splits de RGB data van de bitmap in meerdere delen, waarna iedere thread zijn eigen deel rendert. Het voordeel is dat er steeds maar één screenshot wordt gemaakt, dus dat het hierboven beschreven probleem niet zal voorkomen. Het nadeel is dat het moeilijker te implementeren is, en dat ik moet uitzoeken hoe ik ervoor kan zorgen dat alle threads van elkaar weten of er al een pixel is gevonden die matcht. Als ik dit niet doe kan het voorkomen dat meerdere threads een pixel vinden, wat er voor gaat zorgen dat de cursor over verschillende plekken op het scherm gaat springen.
Zouden er nog andere manieren zijn om met gebruik van meerdere threads een programma als dit nog sneller te laten draaien? Ik ben aan het proberen te bedenken hoe ik dit zou kunnen oplossen maar tot nog toe ben ik niet verder gekomen dan deze twee oplossingen. Ook heb ik nog geen idee over hoe ik de beschreven problemen zou kunnen oplossen in code.
Er draait een applicatie in window mode. Mijn programma maakt continue screenshots van dit venster, loopt door de pixels heen en kijkt of de kleur van de pixel matcht met de geconfigureerde kleur. Als de kleur matcht dan verplaatst het programma de cursor naar deze pixel.
Dit stuk code is zeer performance kritisch. De eerste methode die ik hanteerde was de simpelste, met GetPixel. GetPixel was echter veel te langzaam bij het snel renderen van screenshots en gebruikte ook veel te veel processorkracht. Nu heb ik de manier veranderd in het doorlopen van de RGB waardes van de bitmap, wat 2 tot 2,5 keer zo snel is. Daar ben ik nu tevreden over. Echter vind ik het een uitdaging om het nog sneller te krijgen. Ik wil ervoor zorgen dat meerdere threads tegelijk werken om deze operatie sneller te laten werken. De cursor moet zo soepel mogelijk worden verplaatst, wat deze code moet verzorgen
Ik heb nagedacht over twee mogelijkheden:
- Ik maak meerdere threads die allemaal een aparte screenshot maken en renderen. Het voordeel hiervan is dat het gemakkelijker te implementeren is. Het nadeel is dat ik goed moet bedenken hoe ik ervoor kan zorgen dat de threads niet helemaal gelijk lopen. Als ze gelijk lopen betekent het dat ze dezelfde screenshot maken, wat overbodig werk is, maar ook de cursor de verkeerde kant op zou kunnen sturen.
- Ik splits de RGB data van de bitmap in meerdere delen, waarna iedere thread zijn eigen deel rendert. Het voordeel is dat er steeds maar één screenshot wordt gemaakt, dus dat het hierboven beschreven probleem niet zal voorkomen. Het nadeel is dat het moeilijker te implementeren is, en dat ik moet uitzoeken hoe ik ervoor kan zorgen dat alle threads van elkaar weten of er al een pixel is gevonden die matcht. Als ik dit niet doe kan het voorkomen dat meerdere threads een pixel vinden, wat er voor gaat zorgen dat de cursor over verschillende plekken op het scherm gaat springen.
Zouden er nog andere manieren zijn om met gebruik van meerdere threads een programma als dit nog sneller te laten draaien? Ik ben aan het proberen te bedenken hoe ik dit zou kunnen oplossen maar tot nog toe ben ik niet verder gekomen dan deze twee oplossingen. Ook heb ik nog geen idee over hoe ik de beschreven problemen zou kunnen oplossen in code.