🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

5 total messages Started by Dominik Deobald Thu, 07 Sep 1995 11:29
PutPixel
#1
Author: Dominik Deobald
Date: Thu, 07 Sep 1995 11:29
34 lines
1819 bytes
Hi...

Ich suche die schnellste Moeglichkeit in Turbo C++ 3.0 mit einer  
aufzurufenden Funktion einen Punkt auf den Bildschirm zu bringen.

(VGA-Modus 13h, also 320x200x256)

Diese darf auch gerne Inline-ASM benutzen. Sie sollte nur schneller sein  
als alle anderen.

a) Bitte keine Mails, dass ich im falschen Brett bin (PC, ANSI, ...)
b) Antworten bitte als PM. Falls es gewuenscht wird, kann ich da dann das   
   entgueltige Ergebnis bekanntgeben, also welche Routine die schnellste    
   ist.

Die schnellste, die ich bisher habe ist die folgende:

char *ScreenAddr = (char*)0xA0000000;

// Schreibt einen Punkt der Farbe 'color' an die stelle 'x/y'
void drawxy(int x,int y,char color)
{
  *(ScreenAddr+320*y+x) = color;
}

Mein erster Versuch in ASM war langsamer als das.

Oder hat vielleicht jemand die Sources zu einer kompletten Grafik- 
Funktionsbibliothek mit Linien, Kreisen, ... ? Auch haben woll ;)

CiAo... BLACK MAGiCiAN                     SNAiL-MAiL:    DoMiNiK DEoBALD
                                                        MAGiC PoWER-WARE!
Jeder will in den Himmel, aber keiner will sterben     DiAKoNiSSENSTR. 1O
                                                             67346 SPEYER
Re: PutPixel
#2
Author: Herman Dullink
Date: Mon, 11 Sep 1995 09:49
36 lines
1677 bytes
>Hi...
Ah, an English word, too bad the rest aren't...

>Ich suche die schnellste Moeglichkeit in Turbo C++ 3.0 mit einer  
>aufzurufenden Funktion einen Punkt auf den Bildschirm zu bringen.
Most overhead is the call to the plot routines. To really speed things
up, you should use a macro (#define) instead of a function.

>(VGA-Modus 13h, also 320x200x256)
>Diese darf auch gerne Inline-ASM benutzen. Sie sollte nur schneller sein  
>als alle anderen.
A putpixel routine is sooo simple, inline assembly won't do much good.
All you can do is a faster 'multiply'.

>char *ScreenAddr = (char*)0xA0000000;
>
>void drawxy(int x,int y,char color)
>{
>  *(ScreenAddr+320*y+x) = color;
>}
320*y = (y << 8) + (y << 6) =>

{
  *(ScreenAddr+(y << 8) + (y << 6) + x) = color;
}

or better

#define drawxy(x,y,c) {*(ScreenAddr + (y << 8) + (y << 6) + x) = color;}

Of course, with multiple pixel primitives (lines, circles, polygons) inline
assembly _can_ make a difference.

Another tip; NEVER user the drawxy primitive to draw lines, circles, etc..

Herman
Re: PutPixel
#3
Author: Lars Troen
Date: Mon, 11 Sep 1995 13:20
35 lines
1815 bytes
Dominik Deobald (MAGICIAN@m-night.domino.de) wrote:
: Hi...

: Ich suche die schnellste Moeglichkeit in Turbo C++ 3.0 mit einer  
: aufzurufenden Funktion einen Punkt auf den Bildschirm zu bringen.

: (VGA-Modus 13h, also 320x200x256)

: Diese darf auch gerne Inline-ASM benutzen. Sie sollte nur schneller sein  
: als alle anderen.

: a) Bitte keine Mails, dass ich im falschen Brett bin (PC, ANSI, ...)
: b) Antworten bitte als PM. Falls es gewuenscht wird, kann ich da dann das   
:    entgueltige Ergebnis bekanntgeben, also welche Routine die schnellste    
:    ist.

: Die schnellste, die ich bisher habe ist die folgende:

: char *ScreenAddr = (char*)0xA0000000;

: // Schreibt einen Punkt der Farbe 'color' an die stelle 'x/y'
: void drawxy(int x,int y,char color)
: {
:   *(ScreenAddr+320*y+x) = color;

Es ist schneller mit 
    *(ScreenAddr+y<<8+y<<6+x) = color;
: }

--
(***************************************************************************)
(*   Lars Trøen på Høgskolen i Sør-Trøndelag                               *)
(* "The key, the whole key, and nothing but the key. So help me Codd."     *)
(* Who is General Failure and why is he reading my C: drive?               *)
(***************************************************************************)
Re: PutPixel
#4
Author: Hans Insulander
Date: Fri, 15 Sep 1995 10:19
30 lines
1354 bytes
larstr@stud.idb.hist.no (Lars Troen) wrote:
>Dominik Deobald (MAGICIAN@m-night.domino.de) wrote:
[snap, snap]
>: Die schnellste, die ich bisher habe ist die folgende:
>
>: char *ScreenAddr = (char*)0xA0000000;
>
>: // Schreibt einen Punkt der Farbe 'color' an die stelle 'x/y'
>: void drawxy(int x,int y,char color)
>: {
>:   *(ScreenAddr+320*y+x) = color;
>
>Es ist schneller mit 
>    *(ScreenAddr+y<<8+y<<6+x) = color;
>: }
>

Don't be so sure about that... Depends on your compiler! some compilers 
(bc4.5, watcom 10.5) will use the lea instruction. i.e.

mov eax,y
mov ebx,x
lea eax,[eax*4+eax]  ; eax=y*5
mov cl,color
shl eax,6            ; eax=y*5*64=y*320
mov [0A0000h+eax+ebx],cl ; For Watcom. Use a seg for realmode. 

which is much faster than shifting!

/H.
Re: PutPixel
#5
Author: Geert Jansen
Date: Tue, 26 Sep 1995 07:40
37 lines
1916 bytes
Dominik Deobald (MAGICIAN@m-night.domino.de) wrote:
: Hi...

: Ich suche die schnellste Moeglichkeit in Turbo C++ 3.0 mit einer  
: aufzurufenden Funktion einen Punkt auf den Bildschirm zu bringen.

: (VGA-Modus 13h, also 320x200x256)

: Diese darf auch gerne Inline-ASM benutzen. Sie sollte nur schneller sein  
: als alle anderen.

: a) Bitte keine Mails, dass ich im falschen Brett bin (PC, ANSI, ...)
: b) Antworten bitte als PM. Falls es gewuenscht wird, kann ich da dann das   
:    entgueltige Ergebnis bekanntgeben, also welche Routine die schnellste    
:    ist.

: Die schnellste, die ich bisher habe ist die folgende:

: char *ScreenAddr = (char*)0xA0000000;

: // Schreibt einen Punkt der Farbe 'color' an die stelle 'x/y'
: void drawxy(int x,int y,char color)
: {
:   *(ScreenAddr+320*y+x) = color;
: }

: Mein erster Versuch in ASM war langsamer als das.

: Oder hat vielleicht jemand die Sources zu einer kompletten Grafik- 
: Funktionsbibliothek mit Linien, Kreisen, ... ? Auch haben woll ;)

: CiAo... BLACK MAGiCiAN                     SNAiL-MAiL:    DoMiNiK DEoBALD
:                                                         MAGiC PoWER-WARE!
: Jeder will in den Himmel, aber keiner will sterben     DiAKoNiSSENSTR. 1O
:                                                              67346 SPEYER

BITTE talk english!
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads