Показать сообщение отдельно
Старый 02.06.2009, 23:15   #21
Черный крыс
 
Сообщений: n/a
Ответ: Рендер в Image с альфой

нашел тему...по которой я сечас немного загоняюсь....итак поехали!
Вот меня уже сколько времени добивает этот пресловутый GrabPixmap() - метод настолько медленный, что диву даешься - оно всех устраивает??? Ее в реалтайме можно использовать, чтобы скопировать максимум квадратик 16*16 пикселей, да и то будет ощутимое падение производительности. Или же никто в своих проектах не использует спецэффекты при рендере в текстуру? Вот взять тот же Blitz3D - тама RTT работает на ура.
Оставим тофтологию и перейдем к делу...откроем исходник D3D7Max2D и глянем на этот тормознутый метод :
Method GrabPixmap:TPixmap( x,y,width,height )
If Not IsValid() Return
 
Local pixmap:TPixmap
Local srcdc,destdc
Local surf:IDirectDrawSurface7
Local renderSurf:IDirectDrawSurface7
 
D3D7GraphicsDriver().EndScene
device.GetRenderTarget Varptr renderSurf
 
pixmap=TPixmap.Create( width,height,PF_BGR888 )
renderSurf.GetDC Varptr srcdc
surf=surffrompixmap( pixmap )
surf.GetDC Varptr destdc
BitBlt(destdc, 0, 0, width, height, srcdc, x, y, ROP_SRCCOPY)
surf.ReleaseDC destdc
renderSurf.ReleaseDC srcdc
surf.Release_()
D3D7GraphicsDriver().BeginScene
Return pixmap 
End Method
Как видно из кода - Марк как всегда отжигает не по детски!
BitBlt(destdc, 0, 0, width, height, srcdc, x, y, ROP_SRCCOPY) - с такими котовасями, неудивительно, что оно тормозит. Вообще то за такие вещи надо руки отрывать (с) Knightmare.
Тут всего то требуеться - залочить таргет, получив при этом указатель на сюрфейс и скопировать участок памяти в pixmap.pixels, и всего то делов...функция заработает в 100 раз быстрее.

Последний раз редактировалось Черный крыс, 02.06.2009 в 23:27.
 
Ответить с цитированием