Page 1 of 2

DDERR_SURFACELOST

PostPosted: 21 May 2010, 11:34
by breeze
С завидной периодичностью вылетает сообщение об ошибке:

Code: Select all
IDirectDrawSurface2::Blt(): DDERR_SURFACELOST
see you later!


в настройках выбран — driver=blt (hardware blitter. recommended for accelerated cards (geforce4/etc))
Обратил внимание, что данная ситуация случается при переключении между задачами, активно использующими ресурсы видеокарты (например последние версии PhotoShop)

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

DirectDraw может забрать у неактивного приложения видеопамять, занятую некоторыми (или всеми) поверхностями. Такие поверхности называются потерянными (lost). Вообще говоря, такие поверхности остаются у вашей программы, но они перестают быть связанными с какой-либо областью памяти. Любая попытка использовать потерянную поверхность приводит к ошибке DDERR_SURFACELOST. Функция IsLost позволяет узнать, была ли потеряна память данной поверхности.

Потерянную поверхность можно восстановить функцией Restore, но только после повторной активизации вашего приложения. Тем самым предотвращается восстановление поверхностей для приложений, находящихся в свернутом виде на панели задач.


Я не знаю проверяется ли сейчас что-нибудь функцией IsLost, но подозреваю что нет.

Re: DDERR_SURFACELOST

PostPosted: 21 May 2010, 12:16
by lvd
Глюкодром повышенной глючности.

Re: DDERR_SURFACELOST

PostPosted: 21 May 2010, 12:30
by molodcov_alex
Я в ентой (http://narod.ru/disk/20772663000/us0373_mod(saa).rar.html) версии убрал вылетание по этой ошибке. Народ вроде не жаловался и у меня вроде все работает.

А вообще, ИМХО, хорошо бы сделать сохранение состояния (память, регистры, порты, диски) при аварийном завершении работы.

Re: DDERR_SURFACELOST

PostPosted: 21 May 2010, 13:53
by breeze
molodcov_alex wrote:А вообще, ИМХО, хорошо бы сделать сохранение состояния (память, регистры, порты, диски) при аварийном завершении работы.


согласен, ибо, если использовать эмулятор чисто для быстрого просмотра, это не так фатально, а вот если что-то делаешь и оно вылетает :( как бы не очень приятно и нервов стоит.

Re: DDERR_SURFACELOST

PostPosted: 21 May 2010, 14:09
by deathsoft
На счет видео - хз, проверял ли смт на Lost или нет, в звуке я это переделал (т.к. вылетало постянно и у многих). В видео - смт видимо забил сделать по нормальному - поэтому и вылетает, надо переделать.

Re: DDERR_SURFACELOST

PostPosted: 21 May 2010, 14:10
by breeze
deathsoft wrote:надо переделать


Было бы просто супер! :)

Re: DDERR_SURFACELOST

PostPosted: 21 May 2010, 14:14
by deathsoft
breeze wrote:Было бы просто супер!

Проблема в том, что мне этот глюк будет проявить очень трудно. У тебя видяха какая (сколько видеопамяти)? У меня просто 512мб на видяхе и память там просто так не кончится, можно хоть 10 унриалов запустить и переключатся между ними и сворачивать.

Re: DDERR_SURFACELOST

PostPosted: 21 May 2010, 14:40
by molodcov_alex
deathsoft wrote:Проблема в том, что мне этот глюк будет проявить очень трудно.

У меня, например, такое происходит чаще всего в win2k когда Ctrl+Alt+Del жмешь (типа окошко появляется: завершить работу, диспетчер задач и прочее).
Причем сначала сурфейслостается, а потом уже приходит сообщение о потере фокуса. В дебуге (в смысле при дебугинге самого анрила), при жутких тормозах, вероятность сильно повышается, может вывалиться при просто сворачивании.

Re: DDERR_SURFACELOST

PostPosted: 21 May 2010, 15:28
by deathsoft
Я думаю надо профиксить чисто теоретически, а дальше дать протестиь тем у кого вылетает, обработку сурфас лоста можно взять из примеров для директ икса, я собственно там и смотрел как для саунд буфера обработка лоста сделана.

Re: DDERR_SURFACELOST

PostPosted: 21 May 2010, 15:41
by deathsoft
molodcov_alex wrote:убрал вылетание по этой ошибке

Убирать вылетание просто так и игнорировать эту ошибку нельзя, при возникновении этой ошибки нужно долбить в цикле ресторе и слип, пока память не отресторится, а после этого еще и скопировать в нее то что там было до потери.