Jump to content
Xtreme .Net Talk

Recommended Posts

Posted

Hi,

 

I'm trying to blit a bitmap image 259x347 pixels in 24 bit color.

But it's VERY slow.

 

I'm using VB.Net and DirectX9

 

Is there any idea's how to speed up this,

 

thanks,

Miura

  • *Experts*
Posted

Can you post the project here so we can take a look?

 

Also, your bitmap may be odd shapes (non-powers of 2 is "odd" for DirectX), but most hardware won't support it. Instead, you'll want to make your bitmap a power of 2 and use a color key to leave out those bits you don't want. So instead of having a bitmap at 259x347, you'll have to use 512x512. Assuming your bitmap is non-rectangular already (you have some bits being masked out), you can just use that same "mask" color to fill in the rest of the bitmap, to extend it out to 512x512.

 

-Nerseus

"I want to stand as close to the edge as I can without going over. Out on the edge you see all the kinds of things you can't see from the center." - Kurt Vonnegut
Posted

I'm using a Pentium 3 450 mHz and the ATI 32 MB graphics card and 384 MB.

Will a faster processor and/or more powerfuld graphics card increase the preformance?

  • *Experts*
Posted

Well sure..... but maybe you should try fixing the problem first :p

 

-Ner

"I want to stand as close to the edge as I can without going over. Out on the edge you see all the kinds of things you can't see from the center." - Kurt Vonnegut
Posted

Of Cause,

 

I have made a test, and draw 62 32x32 Pixels in 16 bits color,

and it is very faster. I used the drawfast metod.

 

Thanks a lot.

Miura

  • *Experts*
Posted

Still, one rectangle at size 259x347 should NOT be slow on pretty much any machine. I see you're using DirectDraw, which is made for blt'ing images of various size - ignore my earlier comment about bitmaps with power of 2, that's more for Direct3D.

 

If your sample is still running slow when you go back to the 259x347 image, post up the project and we can take a look.

 

-Nerseus

"I want to stand as close to the edge as I can without going over. Out on the edge you see all the kinds of things you can't see from the center." - Kurt Vonnegut
Posted

I'm using the

C:\DirectX9\Samples\VB.Net\DirectDraw\AnimatePalette\animatepalette.vbproj as "backbone" program.

 

But When I run the microsoft sample program is sometimes freezes just 1 or 2 frames, and moves normaly again. Freezes again, and the runs again. This can happen many times and differenct places when the program runs.

 

My program does the same thing.

 

Maybe my computer is too small to run Win XP, Visual Basic .Net and the DirectX9-program at the same time. OR maybe the program code from Microsoft could be better!!!!!.

 

Regards,

Miura

  • *Experts*
Posted

You can check out DirectX4VB for a tutorial and sample.

 

I'm not familiar with the AnimatePaletter project so I can't say what it's doing. Do all of the sample projects have this "stuttering" effect? Have you tried changing to Release mode and running outside the IDE?

 

-Nerseus

"I want to stand as close to the edge as I can without going over. Out on the edge you see all the kinds of things you can't see from the center." - Kurt Vonnegut
Posted
It could be you're computer then, I experience jittering problems when running too many things at once, try closing as many programs as possible before running it. If you're on WinXP use the Task Manager to see how much CPU power is being used.
.Net allows software to be written for any version of Windows and not break like Unmanaged applications unless using Unmanaged procedures like APIs. If your program uses large amounts of memory but releases it when something else needs it, then what's the problem?
  • *Experts*
Posted

Some programs, such as WinAmp, are coded to take up more CPU power than other programs. This may cause a jittering.

 

Also, if you're doing animation based on a regular timer, the API timeGetTime, or the Environment.TickCount, keep in mind that they have about 20ms accuracy. I had a Ms Pacman clone that ran choppy because of this - I changed it to use QueryPerformanceCounter and all was better. It was only because my machine was running TOO fast that I saw the stuttering (my old 486/VB5 version used timeGetTime without any problems).

 

-Nerseus

"I want to stand as close to the edge as I can without going over. Out on the edge you see all the kinds of things you can't see from the center." - Kurt Vonnegut
Posted

In fact I would like to make the animation on base of a framecounter. How can it be done ?

 

I would like a procedure to run everytime there is a new frame. Ex. 75 Frames a Sek with the monitors 75 Hz and so on.

 

it seems that my computer is too slow, tried some samples from DirectX7 SDK.

 

Thanks,

And have a nice day :-)

Miura

Posted

You mean an FPS counter

Private NextCount as Int32 = Environment.TickCount
Private FPS as Int16
Public CurrentFPS as Int16

Public Sub CountFPS()
If Environment.TickCount > NextCount Then
    CurrentFPS = FPS + 1
    FPS = 0
    NextCount = Environment.TickCount + 1000
Else
    FPS += 1
End If
End Sub

.Net allows software to be written for any version of Windows and not break like Unmanaged applications unless using Unmanaged procedures like APIs. If your program uses large amounts of memory but releases it when something else needs it, then what's the problem?
Posted

Thanks,

 

I will try to study the code to understand it.

I'm sure that it will help me alot.

 

Thanks again :-)

Miura

Denmark

Posted

Hmmm, how does the code work ?

 

Is seems like the FPS value will be the same no matter if the monitor will run at 75 Hz or 100 Hz.

 

The procedure must count to 75 (75 Hz) and 100 (100 Hz).

 

Thanks,

Miura

Posted

Private NextCount As Int32 = Environment.TickCount 'Time until 1 second has past
Private FPS As Int16 'variable to count frames(32767 Hz max FPS count)
Public CurrentFPS As Int16 'Total FPS count from the last second

Public Sub CountFPS()
If Environment.TickCount > NextCount Then 'If current time has past time for the end of the second
    CurrentFPS = FPS + 1 'Change the returnable value
    FPS = 0 'Reset the counter for next second
    NextCount = Environment.TickCount + 1000 'update time till next second
Else 'if it has not been 1 second yet
    FPS += 1 'just add 1 to the counter
End If
End Sub

To use it:

Public Sub GameLoop()
Do until bRunning = False
   Back.DrawText 0, 0, "Current FPS: " & CurrentFPS.ToString(), False

   Primary.Flip Nothing, .... (Use .NOVSYNC to ignore Windows' max Hz)
   CountFPS() 'Update the FPS counter for this render pass
   Application.DoEvents()
Loop
End Sub

.Net allows software to be written for any version of Windows and not break like Unmanaged applications unless using Unmanaged procedures like APIs. If your program uses large amounts of memory but releases it when something else needs it, then what's the problem?

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...