[C++] 16bit <==> 32bit colour conversion.

Pagina: 1
Acties:
  • 283 views sinds 30-01-2008
  • Reageer

  • Lord Maximus
  • Registratie: Oktober 1999
  • Laatst online: 09-09 15:59
Ik heb een eenvoudige routine NODIG waarmee ik 16bit kleurwaarden uit een palet om kan zetten naar 32bit kleur waarden die ik in Borland C++ Builder weer kan gebruiken om een canvas vol te kliederen.

Ik heb zelf al het 1 en ander geprobeerd. Maar geen soelaas. Iemand een idee?

Woops was een woordje vergeten.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op woensdag 05 september 2001 15:20 schreef Lord Maximus het volgende:
Ik heb een eenvoudige routine waarmee ik 16bit kleurwaarden uit een palet om kan zetten naar 32bit kleur waarden die ik in Borland C++ Builder weer kan gebruiken om een canvas vol te kliederen.

Ik heb zelf al het 1 en ander geprobeerd. Maar geen soelaas. Iemand een idee?
Uhm wat is nu exact je probleem?

Professionele website nodig?


Verwijderd

kleurconversie?

Makkie
is het 6-5-6bits?

je hebt dus de waarde van elke pixel,
code:
1
2
3
R = waarde/(2^(5+6))
G = (waarde/(2^6))%(2^5)
B = waarde%(2^6)

Dan moet je die nu nog van 5/6 bits naar 8 bits omzetten:
code:
1
2
3
R = R * 2^8 / 2^6
G = G * 2^8 / 2^5
B = B * 2^8 / 2^6

Maak daar een mooie functie van en je bent klaar.

Als je snelheid wilt moet je het in assembler doen of met bits schuiven ("<" en ">") maar daar ben ik niet goed in dus dat doe ik maar niet.


edit:

|:(
6+5+6 != 16

Nouja, je snapt het idee wel, waarschijnlijk is het 5-6-5 bits en zit ik te :z

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

5-6-5 dus.
code:
1
2
3
4
#define Color16To32(p_Color)              \
     ((((p_Color >> 11) & 0x1f) << 19) |      \
    (((p_Color >> 5) & 0x3f) << 10) |       \
     ((p_Color & 0x1f) << 3))

100% Gegarandeerd niet getest as usual :)

[edit]
Oeps ik zat ook te :z, had 'm Color32To16 genoemd *D

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

er was een snellere methode waarvan je alleen gebruik maakte van shifts en rolls (oh nee daar gaan we weer *D), maar ik heb nu effe geen zin om die uit te zoeken :7

.edit: oh nee wacht dat was voor 32 -> 16 kleuren
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
; color32to16
; converts a 32 bits color value to a 16 bits color value
; in: eax: 32 bits color value
; out: eax: 16 bits color value

color32to16:
    shr eax, 3
    ror eax, 5
    shr eax, 2
    ror eax, 6
    shr eax, 3
    rol eax, 11
    ret

:)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

en dan ook nog gelijk effe voor de ARM processor, omdat we voor project op school een spel voor de GameBoy Advance gaan maken :)
code:
1
2
3
4
5
6
7
8
9
rem in: r0: 32 bits color value
rem out: r0: 16 bits color value

mov r0, r0, LSR #3
mov r0, r0, ROR #5
mov r0, r0, LSR #2
mov r0, r0, ROR #6
mov r0, r0, LSR #3
mov r0, r0, ROR #21

:7

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
inline int Color16To32_asm(int kleur16)
{
    int kleur32;

    _asm
    {
      mov    EAX,    kleur16

      mov    EBX,    EAX
      mov    ECX,    EAX
      and    EBX,    0x01F
      shl    EBX,    3

      and    ECX,    0x07E0
      shl    ECX,    5
      add    EBX,    ECX

      mov    ECX,    EAX
      and    ECX,    0x0F800
      shl    ECX,    8
      add    EBX,    ECX

      mov    [kleur32], EBX;
    }

    return kleur32;
}

sorry, ik kon het niet laten :'(

  • toraq
  • Registratie: September 2000
  • Niet online

toraq

Shoving is the answer

Op woensdag 05 september 2001 23:47 schreef marcusk het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
inline int Color16To32_asm(int kleur16)
{
    int kleur32;

    _asm
    {
      mov    EAX,    kleur16

      mov    EBX,    EAX
      mov    ECX,    EAX
      and    EBX,    0x01F
      shl    EBX,    3

      and    ECX,    0x07E0
      shl    ECX,    5
      add    EBX,    ECX

      mov    ECX,    EAX
      and    ECX,    0x0F800
      shl    ECX,    8
      add    EBX,    ECX

      mov    [kleur32], EBX;
    }

    return kleur32;
}

sorry, ik kon het niet laten :'(
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
inline int Color16To32_asm(int kleur16)
{
    int kleur32;

    _asm
    {
      mov    EAX,    kleur16

      mov    EBX,    EAX
      mov    ECX,    EAX
;     and    EBX,    0x01F
      shl    EBX,    3

      and    ECX,    0x07E0
      shl    ECX,    5
[b]   mov    bh,     cl[/b]

;     mov    ECX,    EAX
      and [b]EAX[/b],    0x0F800
      shl    ECX,    8
      add    EBX,    ECX

      mov    [kleur32], EBX;
    }

    return kleur32;
}

Dit is al beter :)

I am a shover robot, do not trust the pusher robot, I will protect you from the terrible secrets of space!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

dan moet je het wel goed doen natuurlijk :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
inline int Color16To32_asm(int kleur16)
{
    _asm
    {
      mov    eax,    kleur16

      mov    ebx,    eax
      mov    ecx,    eax
      and    eax,    0x0F800
      and    ecx,    0x07E0
      and    ebx,    0x01F
      shl    eax,    8
      shl    ecx,    5
      lea    eax,    [eax + ebx * 8]
      add    eax,    ecx
    }
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Jullie zijn echt onverbeterlijk :o :D

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 06 september 2001 00:35 schreef beelzebubu het volgende:
Jullie zijn echt onverbeterlijk :o :D
dit zijn tenminste rielekste topics, en niet de 23487234ste php topic of een post-de-antwoorden-voor-mijn-huiswerk-zodat-ik-het-lekker-zelf-niet-hoef-te-doen-omdat-ik-er-toch-geen-reet-van-snap-topic die vandaag ineens als paddestoelen uit de grond zijn geschoten :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op donderdag 06 september 2001 00:39 schreef OiSyN het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
_asm
    {
      mov    eax,    kleur16
      mov    ebx,    eax
      mov    ecx,    eax
      and    eax,    0x0F800
      and    ecx,    0x07E0
      and    ebx,    0x01F
      shl    eax,    8
      shl    ecx,    5
      lea    eax,    [eax + ebx * 8]
      add    eax,    ecx
    }
Je doet je ondertitel eer aan :)
dit zijn tenminste rielekste topics, en niet de 23487234ste php topic of een post-de-antwoorden-voor-mijn-huiswerk-zodat-ik-het-lekker-zelf-niet-hoef-te-doen-omdat-ik-er-toch-geen-reet-van-snap-topic die vandaag ineens als paddestoelen uit de grond zijn geschoten :)
Daar ben ik het helemaal mee eens :)

Verwijderd

Op donderdag 06 september 2001 00:39 schreef OiSyN het volgende:

[..]

dit zijn tenminste rielekste topics, en niet de 23487234ste php topic of een post-de-antwoorden-voor-mijn-huiswerk-zodat-ik-het-lekker-zelf-niet-hoef-te-doen-omdat-ik-er-toch-geen-reet-van-snap-topic die vandaag ineens als paddestoelen uit de grond zijn geschoten :)
Het was als compliment bedoeld, en ik kan niet zeggen dat ik het met je oneens ben hier ;)

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op donderdag 06 september 2001 00:16 schreef toraq het volgende:
code:
1
...

Dit is al beter :)
Vreemdgenoeg is dat niet sneller (integendeel):
code:
1
2
3
 Marcus_asm - 845.568920 ms
  toraq_asm - 2115.977031 ms
  OiSyN_asm - 819.062199 ms

(100.000.000 iteraties)
Dit heb ik ff gefixed trouwens: (zoek de verschillen ;))
code:
1
2
3
4
...
and   EAX,    0x0F800
shl   EAX,    8
add   EBX,    EAX

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

WTF ?!?!? :?
bijna 3x zo langzaam

damn


toraq, jij gaat echt niet asm'en voor ons GBA projectje hoor, dat doe ik voortaan wel :7 ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

wat overigens een veel betere meetmethode is, is de clock counter in te laden voor en na de routine, en dan het verschil uit te rekenen. Dan heb je het aantal clocks dat de routine is + de overhead van het berekenen.

Als je dat ook even doet voor puur de clockcounter inladen, resultaat opslaan, en nog een keer clockcounter inladen, en dat totaal eraf trekt, dan heb je dus alleen het aantal cycles voor de routine.

Dit moet alleen wel met interrupts gedisabled gebeuren natuurlijk... overigens kun je ook gewoon meerdere iteraties doen, en de keren dat het aantal clocks echt veel te veel is dan weet je dat ie een keer van thread is geswitched. Gewoon het minst aantal clocks onthouden klopt meestal ook wel, omdat er bijna altijd hetzelfde zal uitkomen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Jullie zijn getikt.

Dat wou ik ff kwijt. O+ :7


(ps. waarom heb je die macro van mij niet gebenched? :Y) )

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op donderdag 06 september 2001 01:49 schreef OiSyN het volgende:
en de keren dat het aantal clocks echt veel te veel is dan weet je dat ie een keer van thread is geswitched.
Volgende code voor de bench uitvoeren doet wonderen:
code:
1
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

Een realtime process switcht ECHT niet tenzij je 'm expliciet toestemming geeft door een sleep of zo.

Professionele website nodig?


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op donderdag 06 september 2001 10:03 schreef curry684 het volgende:
(ps. waarom heb je die macro van mij niet gebenched? :Y) )
Selectieve benchmarking heet dat: ;)
code:
1
2
3
4
 Marcus_asm - 845.270837 ms
  toraq_asm - 2116.588281 ms
  OiSyN_asm - 819.211939 ms
   curry684 - 0.001117 ms

hmmmm.... 100.000.000 iteraties / 0,001117 ms = 89.525.514.771 it. / ms. 733 MHz --> 733.000 kloktikken / ms. --> 122.135 iteraties per kloktik. Dat is best efficient ;)

Het lijkt erop dat jouw functie 'weggeoptimalizeerd' wordt doordat ik niets met het resultaat doe ofzo :) :?
Volgende code voor de bench uitvoeren doet wonderen:
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
Ik heb gewoon die testdinges van jou gebruikt, dus dat zit er idd in.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 06 september 2001 10:03 schreef curry684 het volgende:
Jullie zijn getikt.

Dat wou ik ff kwijt. O+ :7
nee, geklokt heet dat :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Ik zit in dat GObject/C vs. C++ topic nog steeds te wachten op zinnige reacties ipv domme flames, waar blijven jullie reacties? :P

Verwijderd

Ik specificeer altijd GL_RGBA8 voor 32bit en GL_RGB5_A1 voor 16bit :D

no probs so far ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 06 september 2001 10:07 schreef curry684 het volgende:

[..]

Volgende code voor de bench uitvoeren doet wonderen:
code:
1
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

Een realtime process switcht ECHT niet tenzij je 'm expliciet toestemming geeft door een sleep of zo.
hoe verklaar je deze uitkomst dan?
code:
1
2
3
4
        min   avg   max
marcusk:  60,   60,  23179
toraq:    60,   60,  11949
oisyn:    57,   57,  35727

de functies van macusk en toraq zijn dus even snel, en die van mij is 3 clocks sneller, maar aan het maximum te zien wordt er dus WEL van threads geswitched...

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Misschien helpt het nog iets als je je ThreadPriority ook omhoog schroeft?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

ho shit ik zie trouwens ineens dat die uitkomst die ik hiervoor heb gepost niet klopt... het was een debug build :D

hier de echte scores, gebuild met maximum speed optimization, maar geen inline function expansion
code:
1
2
3
4
        min  avg  max
marcusk:  11,  13,  7940
toraq:    10,  10, 14781
oisyn:     6,   6,  6612

Dus relatief gezien is mijn functie NOG sneller dan die van jullie :P

.edit: en zelfs als ik de thread priority op THREAD_PRIORITY_TIME_CRITICAL zet, krijg ik nog thread switches
code:
1
2
3
4
        min  avg  max
marcusk:  12,  13,    229
toraq:    10,  10,     19
oisyn:     6,   6,  27436

opvallend dat marcusk's routine nou ineens 1 clock langzamer is :? (4 keer getest met 100.000 iteraties, steeds dezelfde minimale antwoorden)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • toraq
  • Registratie: September 2000
  • Niet online

toraq

Shoving is the answer

Okee, ik probeer me even te revancheren :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
inline int Color16To32_asm(int kleur16)
{
    _asm
    {
      mov    eax,    kleur16
      mov    ecx,    eax
      and    eax,    0x0F800
      shl    eax,    5
      and    ecx,    0x07FF
      lea    eax,    [eax + ecx * 8]
    }
}

I am a shover robot, do not trust the pusher robot, I will protect you from the terrible secrets of space!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

das wel leuk, maar daar klopt dus geen reet van :)

bovendien, het is het niet eens waard een simpel routinetje als dit maar 1 of 2 clocks sneller te krijgen, das gewoon miereneukerij natuurlijk, en als je er dan ook nog eens een uur mee bezig bent zou ik zeggen: zonde van je tijd :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • toraq
  • Registratie: September 2000
  • Niet online

toraq

Shoving is the answer

Op donderdag 06 september 2001 19:07 schreef toraq het volgende:
Okee, ik probeer me even te revancheren :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
inline int Color16To32_asm(int kleur16)
{
    _asm
    {
      mov    eax,    kleur16
      mov    ecx,    eax
      and    eax,    0x0F800
      shl    eax,    5
      and    ecx,    0x07FF
      lea    eax,    [eax + ecx * 8]
    }
}
dit werkt helaas niet

I am a shover robot, do not trust the pusher robot, I will protect you from the terrible secrets of space!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

overigens nog een miereneukerij opmerking over de macro van ketchu... ik bedoel.. curry684 ;)
Op woensdag 05 september 2001 16:20 schreef curry684 het volgende:
5-6-5 dus.
code:
1
2
3
4
#define Color16To32(p_Color)              \
     ((((p_Color >> 11) & 0x1f) << 19) |      \
    (((p_Color >> 5) & 0x3f) << 10) |       \
     ((p_Color & 0x1f) << 3))

100% Gegarandeerd niet getest as usual :)
zet de macro variabelen ALTIJD tussen haakjes, zodat je geen problemen krijgt met precedence ordering (heet dat zo :?)

als je bijvoorbeeld doet Color16To32 (kleur & 0x00ff), dan wordt dit vertaald naar
((((kleur & 0x00ff >> 11) ...

dit wordt uitgerekend als kleur & (0x00ff >> 11), terwijl je bedoelt: (kleur & 0x00ff) >> 11, omdat de >> voor de & wordt uitgerekend

dus:
code:
1
2
3
4
]#define Color16To32(p_Color)             \
     (((((p_Color) >> 11) & 0x1f) << 19) |    \
    ((((p_Color) >> 5) & 0x3f) << 10) |     \
     (((p_Color) & 0x1f) << 3))

:)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

en toraq, er is zo'n leuk knopje 'edit', en ook nog eens een ander ook heel leuk knopje 'quote'. Misschien dat jij het 'quote' knopje leuker vindt dan het 'edit' knopje, maar dat is zo verwarrend voor de andere mensen op dit forum :7 ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 11-09 10:38

Killemov

Ik zoek nog een mooi icooi =)

Hey Curry,

Nu nog ff een MC680X0 versie ... toch ? ;)

Hey ... maar dan heb je ook wat!


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Eikels ;)

Stelletje bitneukers hiero :)

Oh ja de reden dat groen bij 16 bit 1 bit meer heeft is omdat groen de kleur is waar het oog van de de homo sapiens het meest gevoelig voor is.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op donderdag 06 september 2001 22:22 schreef Killemov het volgende:
Hey Curry,

Nu nog ff een MC680X0 versie ... toch ? ;)
Oh ja ff vergeten!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Input : d0 - 16 bit color value (high 16 bits empty)
// Output: d0 - 32 bit color value

Color16To32:
  move.l     d0, d1
  move.l     d0, d2
  and.w #$f800, d0
  and.w #$07e0, d1
  and.w #$001f, d2
  lsl.l #8, d0
  lsl.l #5, d1
  lsl.l #3, d2
  or.l   d1, d0
  or.l   d2, d0
  rts

Zo :)

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op donderdag 06 september 2001 11:18 schreef marcusk het volgende:
hmmmm.... 100.000.000 iteraties / 0,001117 ms = 89.525.514.771 it. / ms. 733 MHz --> 733.000 kloktikken / ms. --> 122.135 iteraties per kloktik. Dat is best efficient ;)

Het lijkt erop dat jouw functie 'weggeoptimalizeerd' wordt doordat ik niets met het resultaat doe ofzo :) :?
Ik denk eerder dat je er een constante instopt, en dat de compiler dus het antwoord al op compiletijd weet (leuk zo'n macro ;) ), en dat je met DAT resultaat niets doet waardoor ie 'm weggooit. Pleur er maar eens een variabele in?

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op donderdag 06 september 2001 18:10 schreef OiSyN het volgende:
.edit: en zelfs als ik de thread priority op THREAD_PRIORITY_TIME_CRITICAL zet, krijg ik nog thread switches
Hmm kan aan de Linux implementatie liggen dat zelfs de meest ondergeschoven thread gegarandeerd ooit een timeslice krijgt. Als je onder Windows een thread naar realtime schupt en je doet nergens een kernel-mode wait (Sleep of WaitForSingleObject en zo) doen zelfs je muis, je harddisk, en je desktop repaints geen hol meer.

Oh en over die operator precedence in variabelen: als ik een macro in een compiler IDE intyp denk ik daar wel aan, als ik snel een macrootje blind in een webpage inklop zie ik wel eens iets over het hoofd ;)

[edit]
Er is natuurlijk sowieso een fundamenteel linguistisch verschil tussen REALTIME en TIME_CRITICAL. De eerste impliceert dat ie constant loopt, de tweede dat ie zoveel mogelijk loopt.

Professionele website nodig?


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op donderdag 06 september 2001 23:34 schreef curry684 het volgende:
Ik denk eerder dat je er een constante instopt, en dat de compiler dus het antwoord al op compiletijd weet (leuk zo'n macro ;) ), en dat je met DAT resultaat niets doet waardoor ie 'm weggooit. Pleur er maar eens een variabele in?
Ik had er een functie van gemaakt, en geprobeerd of het uitmaakte als ik color16 steeds met 1 verhoog. Maakte niets uit.
Als je onder Windows een thread naar realtime schupt en je doet nergens een kernel-mode wait (Sleep of WaitForSingleObject en zo) doen zelfs je muis, je harddisk, en je desktop repaints geen hol meer
En dat is heel leuk als je programma in een oneindige loop terecht komt ;)
(Dat had ik bij die a-->c replace zooi. Toen moest ik dus de reset knop opzoeken :) Gelukkig druk ik elke 10 seconde op control-s)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 06 september 2001 23:38 schreef curry684 het volgende:

[..]

Hmm kan aan de Linux implementatie liggen dat zelfs de meest ondergeschoven thread gegarandeerd ooit een timeslice krijgt. Als je onder Windows een thread naar realtime schupt en je doet nergens een kernel-mode wait (Sleep of WaitForSingleObject en zo) doen zelfs je muis, je harddisk, en je desktop repaints geen hol meer.
erg leuk verhaal, maar mijn test WAS dus onder windows :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op vrijdag 07 september 2001 00:18 schreef OiSyN het volgende:

[..]

erg leuk verhaal, maar mijn test WAS dus onder windows :)
Ah, herkende zo snel de parameter THREAD_PRIORITY_TIME_CRITICAL waar je naar verwees niet, maar dat is er een van SetThreadPriority, en die moet je dus niet hebben. Deze functie zet alleen de relatieve priority binnen je priority class, die normaliter op NORMAL_PRIORITY_CLASS staat. Je geeft de thread dus de hoogste prioriteit van alle normale processen., maar nog steeds lager dan alle high-priority of realtime processen. Als je het hele process echter met SetPriorityClass naar REALTIME_PRIORITY_CLASS trapt krijg je gegarandeerd geen thread switches (er zijn normaliter geen realtime processen in Windows).

Professionele website nodig?


Verwijderd

Op vrijdag 07 september 2001 10:17 schreef curry684 het volgende:

[..]

Ah, herkende zo snel de parameter THREAD_PRIORITY_TIME_CRITICAL waar je naar verwees niet, maar dat is er een van SetThreadPriority, en die moet je dus niet hebben. Deze functie zet alleen de relatieve priority binnen je priority class, die normaliter op NORMAL_PRIORITY_CLASS staat. Je geeft de thread dus de hoogste prioriteit van alle normale processen., maar nog steeds lager dan alle high-priority of realtime processen. Als je het hele process echter met SetPriorityClass naar REALTIME_PRIORITY_CLASS trapt krijg je gegarandeerd geen thread switches (er zijn normaliter geen realtime processen in Windows).
Dat hangt van je windows af. Onder win9x niet, maar onder WinNT/win2k wel degelijk hoor, maar wel weinig.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op vrijdag 07 september 2001 11:27 schreef Otis het volgende:
Dat hangt van je windows af. Onder win9x niet, maar onder WinNT/win2k wel degelijk hoor, maar wel weinig.
En jij dacht dat ik de afgelopen 2 jaar nog een 9x-bak had aangeraakt? ;)

Ik denk dat je in de war bent met HIGH_PRIORITY_CLASS, daar zitten bijvoorbeeld WinLogon.exe, TaskManager, csrss.exe en aanverwant spul dat wel responsief moet zijn, maar 99,999% van z'n tijd in kernelmode waits spendeert. *Gelukkig* zijn er in NT/2k/XP geen realtime processen van het OS, anders zou je bijna geen applicatie meer gestart krijgen.

Professionele website nodig?


  • Sjonny
  • Registratie: Maart 2001
  • Laatst online: 08:06

Sjonny

Fratser

ik wil geen roet in je asm gooien, maar was het niet zo dat op verschillende kaarten die 16 bits indeling ook anders kan zijn? dus ipv 5-6-5 iets van 6-5-5 ofzo.. volgens mij had ik daar vroeger wel es last van met die oude S3 kaartjes enzo..

The problem is in the part of your brain that handles intelligence.


Verwijderd

sommige kaarten hebben alphabits in de 16bits zitten, althans in de textures. op de kaart zelf (framebuffer/colorbuffer) bewaart bijna geen kaart alphavalues. Hoe de kaart het overigens opslaat doet er niet toe, met die values werk je nooit, de driver converteert het altijd voor je.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op vrijdag 07 september 2001 10:17 schreef curry684 het volgende:

[..]

Ah, herkende zo snel de parameter THREAD_PRIORITY_TIME_CRITICAL waar je naar verwees niet, maar dat is er een van SetThreadPriority, en die moet je dus niet hebben. Deze functie zet alleen de relatieve priority binnen je priority class, die normaliter op NORMAL_PRIORITY_CLASS staat. Je geeft de thread dus de hoogste prioriteit van alle normale processen., maar nog steeds lager dan alle high-priority of realtime processen. Als je het hele process echter met SetPriorityClass naar REALTIME_PRIORITY_CLASS trapt krijg je gegarandeerd geen thread switches (er zijn normaliter geen realtime processen in Windows).
:)
ik had dus eerst SetPriorityClass met REALTIME_PRIORITY_CLASS aangeroepen, en ik kwam erachter dat er nog steeds van thread geswitched werd
toen heb ik ook nog eens SetThreadPriority aangeroepen met THREAD_PRIORITY_TIME_CRITICAL, en NOG werd er van thread geswitched
Dit is overigens getest in Windows 98 SE, op een athlon classic 800 op een :r epox 7kxa (die ik te leen heb van toraq omdat mijn eigen Abit KA7 kapoet is gegaan)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op vrijdag 07 september 2001 12:13 schreef Sjonny het volgende:
ik wil geen roet in je asm gooien, maar was het niet zo dat op verschillende kaarten die 16 bits indeling ook anders kan zijn? dus ipv 5-6-5 iets van 6-5-5 ofzo.. volgens mij had ik daar vroeger wel es last van met die oude S3 kaartjes enzo..
Nou dat niet, maar het wil wel nog aardig wat voorkomen dat kaarten de R en de B component omwisselen (dus het verschil tussen RGB en BGR).
Voor GDI functies maakt dit niet uit (das altijd BGR, en converteert zelf naar RGB als dat nodig is), maar als je bijvoorbeeld met DirectDraw zit te spelen dan moet je daar wel rekening mee houden

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • toraq
  • Registratie: September 2000
  • Niet online

toraq

Shoving is the answer

Op vrijdag 07 september 2001 12:48 schreef OiSyN het volgende:

[..]

:)
ik had dus eerst SetPriorityClass met REALTIME_PRIORITY_CLASS aangeroepen, en ik kwam erachter dat er nog steeds van thread geswitched werd
toen heb ik ook nog eens SetThreadPriority aangeroepen met THREAD_PRIORITY_TIME_CRITICAL, en NOG werd er van thread geswitched
Dit is overigens getest in Windows 98 SE, op een athlon classic 800 op een :r epox 7kxa (die ik te leen heb van toraq omdat mijn eigen Abit KA7 kapoet is gegaan)
Als ik jou was, zou ik mijn 3opsy1 map er nog eens bij pakken en eens lezen over priority boosting :)

I am a shover robot, do not trust the pusher robot, I will protect you from the terrible secrets of space!


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op vrijdag 07 september 2001 12:13 schreef Sjonny het volgende:
ik wil geen roet in je asm gooien, maar was het niet zo dat op verschillende kaarten die 16 bits indeling ook anders kan zijn? dus ipv 5-6-5 iets van 6-5-5 ofzo.. volgens mij had ik daar vroeger wel es last van met die oude S3 kaartjes enzo..
Windows kan op een DIB intern alle mogelijke formaten aan, en het leuke aan een DIB is dat je programma niet verantwoordelijk meer is voor het converteren naar iets wat de grafische kaart snapt: dat handelen de drivers af.

Professionele website nodig?


  • Lord Maximus
  • Registratie: Oktober 1999
  • Laatst online: 09-09 15:59
Lol

Ik was al vergeten dat ik op GoT ook wat gepost had. :)

Had niet gedacht dat er zoveel reacties zouden komen.

Maar thnx dudes. It worx. 8-)

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Op zaterdag 08 september 2001 13:54 schreef curry684 het volgende:

[..]

Windows kan op een DIB intern alle mogelijke formaten aan, en het leuke aan een DIB is dat je programma niet verantwoordelijk meer is voor het converteren naar iets wat de grafische kaart snapt: dat handelen de drivers af.
Dat is zo voor alle bitmapformaten. Als ik een 24-bits bitmap bekijk op 16 kleuren, dan wordt dat goed afgehandeld. En dan bedoel ik niet met Paint of zo, maar gewoon met eigen code.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21-09 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

normaal ben ik tegen ouwe topics omhoog schoppen... maar aangezien dit een c(++) topic is was het toch wel leuk om nog een keer door te lezen :7

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1