Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: И все-таки, как сожрать WPF? Добавлено: 26.01.11 00:32  

Автор вопроса:  VβÐUηìt | Web-сайт: смекаешь.рф
Вобщем я решил конкретно разобраться с этим вопросом. Я его уже кучу раз оговаривал, но мало-ли что, может кто что узнал и все пучком.

Суть: Необходимо отрендерить с помощью WPF картинку с помощью видеокарты, затем скопировать полученный результат из видеокарты в оперативную память. Есть официальный вариант RenderTargetSource, или как его там, но он рендерит процессором - медленно.

Все, до чего я докопался, это жуткий хак через DirectX, который подменяет функцию создания, вроде бы сурфейса, на свою. В своей создаешь свой сурфейс, отдаешь WPF, он рисует, дальше копируешь с сурфейса. Но у этого способа есть фатальные недостатки:

1) Чтобы это чудо отрисовывалось, нужно создавать окно. В любом случае. Причем видимое. Приходится делать ShowInTaskbar = false и выпихивать за пределы экрана. Если так не сделать, отрисовываться ничего не будет.

2) WPF отрисовывает все это дело когда хочет, а не когда надо. Отсюда стабильных плавных кадров хрен дождешься. Я научился управлять внутренним временем (уже не помню как, но повторить легко путем запихивания исходников Framework в программу Reflector - там найти скрытый статический класс времени, к которому можно обратиться через Reflection). Да, я управляю временем WPF. Выставляю, скажем, 1 секунду. А вот чтобы он эту секунду отрисовать - это он уже сам решает. Нужно эту сволочь как-то заставить самому рисовать.

В новом .NET 4 появился CachedBitmap, который кэширует отрисованную хрень в памяти видеокарты для ускорения работы. Может можно как-то с помощью него выципить изображение?

И вообще, есть какой-нибудь нормальный способ получения картинки с WPF?

В идеале хочется чего-то примерно такого:

var c = new WPFCapturer();
Bitmap bmp = c.Capture(grid1, 640, 480);

При этом метод Capture сам вызывает отрисовку grid1 на видеокарте, копирует результат в ОЗУ и отдает результат. Если вдобавок ко всему не надо будет делать костыль в виде видимого заныканного окна, то будет просто супер.

Ну что, есть идеи?

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 26.01.11 01:05
Я бы советовал перевести это на английский язык и отправить на форумы msdn и stackoverflow

Ответить

Номер ответа: 2
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #2
Добавлено: 26.01.11 11:55
С моими знаниями только через translate.google.ru. Во всяком случае, мой перевод будет не лучше :) Не, я не думаю, что-то там найду. Тот пример с подменой адреса функцией как раз со stackoverflow вроде бы.

Просто предлагаю помочь пораскинуть мозгами :)

Ответить

Номер ответа: 3
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #3
Добавлено: 26.01.11 21:29
Бо :(

Ответить

Номер ответа: 4
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #4
Добавлено: 04.02.11 00:37
Боооо...

Ответить

Номер ответа: 5
Автор ответа:
 VbStarter



ICQ: 357911808 

Вопросов: 118
Ответов: 1340
 Web-сайт: moscowdevils.ru
 Профиль | | #5
Добавлено: 12.02.11 19:29
копируй англ версию тыды.
Нужно эту сволочь как-то заставить самому рисовать.
в более читабильную форму... и не только это.
что то типа этого (переработано-испрабленый перевод гугла)
The aim: It is necessary to render the image with the help of WPF with the video card, and then copy the result of the video card memory. There is an official version RenderTargetSource, or as it is there, but it renders with the processor - slow.

Everything what I found - a terrible hack via DirectX, which replaces the function of creating a seemingly surface on his own. In it you create your surface, you give WPF, he draws, and copy with surface. But this method has fatal flaws:

1) To make this miracle is drawn, you need to create a window. In any case. Where visible. Have to do ShowInTaskbar = false and push out beyond the screen. If this is not done, nothing will be drawn.

2) WPF renders the whole thing when he wants to, not when it is necessary. Hence, we won’t see stable smooth frame. I learned how to manage the internal time (can not remember how, but again easily by copying Framework source code to the program Reflector - where to find the hidden static class time, which can be accessed via Reflection). Yes, I manage time WPF. Exhibit, say, 1 second. But to this he had a second draw - it is he himself decides. Need this scum somehow get me to draw.

The new. NET 4 they added CachedBitmap, which caches were drawn crap in video memory to accelerate the work. Maybe you can somehow get the image using it?

In general, there is any normal way to get pictures with WPF?

Ideally, it is something similar to this:


var c = new WPFCapturer ();
Bitmap bmp = c.Capture (grid1, 640, 480);


Moreover, the method calls itself Capture grid1 drawing on a graphics card, copies the result into RAM and gives the result. If, in addition to everything else to do his crutch in the form of visible window, it will be just super.


Well, any ideas?

Ответить

Номер ответа: 6
Автор ответа:
 VbStarter



ICQ: 357911808 

Вопросов: 118
Ответов: 1340
 Web-сайт: moscowdevils.ru
 Профиль | | #6
Добавлено: 12.02.11 19:36
Need this scum somehow get me to draw.

заменить на "Need to force drawing."

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 12.02.11 20:37
RenderTargetSource
А что это за такой метод о котором даже гугл не знает?

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 12.02.11 20:43
http://dotnet.uservoice.com/forums/40583-wpf-feature-suggestions/suggestions/1303525-add-optional-hardware-acceleration-to-rendertarget
Тебе надо тут проголосовать, может добавят фичу в 5-й версии WPF

Ответить

Номер ответа: 9
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #9 Добавлено: 12.02.11 20:47
http://stackoverflow.com/questions/2179042/rendertargetbitmap-and-viewport3d-quality-issues
тут какой-то код на c++ и DirectX показали

Ответить

Номер ответа: 10
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #10
Добавлено: 13.02.11 06:07
Закинуть на stackoverflow - хорошая мысль. Я последнее время так делаю.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам