forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Visual Basic (http://forum.boolean.name/forumdisplay.php?f=62)
-   -   Проблемы с переводом (http://forum.boolean.name/showthread.php?t=12664)

Лit}{Ъ 28.07.2010 23:46

Ответ: Проблемы с переводом
 
Бррр - никогда так не делал! Тоесть условно говоря мы пихаем куданибудь в форме Do Loop между ними делаем всё что надо а перед Loop ставим Invalidate()?

А чем нам мешает "перерисовка формы" ? Ну например у меня в программе раз в 70 мили секунд опрашивается клавиатура, раз в 40 проверяется физика а раз в тридцать на форму выводится новая картинка и всем хорошо...

pax 28.07.2010 23:52

Ответ: Проблемы с переводом
 
Нет, никаких циклов в Windows.Forms
у тебя должна быть функция перерисовки окна:
PHP код:

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        
'код отрисовки


        Invalidate()
    End Sub 

Цитата:

Сообщение от Лit}{Ъ (Сообщение 156521)
А чем нам мешает "перерисовка формы" ? Ну например у меня в программе раз в 70 мили секунд опрашивается клавиатура, раз в 40 проверяется физика а раз в тридцать на форму выводится новая картинка и всем хорошо...

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

Лit}{Ъ 29.07.2010 00:06

Ответ: Проблемы с переводом
 
Я правельно понимаю что речь идёт о Form Events? Из них у меня есть только просто Paint... Хотя скорее всего реч идёт о чём то другом... А если так то получается мы каждый раз когда видим что форме вздумалось перерисоваться застовляем её нанести на себя нужную нам картинку?

pax 29.07.2010 00:13

Ответ: Проблемы с переводом
 
Да, но используя Invalidate() в конце функции перерисовки OnPaint мы заставляем ее перерисовываться постоянно, тратя на это свободные ресурсы системы для получения максимального количества кадров в секунду.

Лit}{Ъ 29.07.2010 00:15

Ответ: Проблемы с переводом
 
Цитата:

Сообщение от pax (Сообщение 156523)
Представь ситуацию, что твоему процессору и видеокарте не угнаться за таймером, если функция отрисовки будет слишком тяжелой ;) А при применении отрисовки в цикле будет выводиться столько кадров, на сколько хватит ресурсов компьютера.

И тут я понял откуда взялось Fraps Past Second :) ! А у меня получается сия величина была фиксированной!


Цитата:

Сообщение от pax (Сообщение 156530)
Да, но используя Invalidate() в конце функции перерисовки OnPaint мы заставляем ее перерисовываться постоянно, тратя на это свободные ресурсы системы для получения максимального количества кадров в секунду.

То есть при команде Invalidate() мы якобы говорим -" рисуйся как только сможеш"? И в следующий раз onPaint сработает как только ЦП компьютера достаточно освободится?

А В это время работают к примеру таймеры Физики и Опроса клавиатуры, а OnPaint втискивается между ними максимально возможное колличество раз?!

pax 29.07.2010 00:24

Ответ: Проблемы с переводом
 
Invalidate() говорит форме, что ее область не действительна и ее нужно перерисовать. И когда она сможет, она ее перерисует.

Вот нашел в интернете довольно старые уроки, но может пригодятся для понятия общих принципов http://progs.biz/directx/direct3d/vb/vb01.aspx

Лit}{Ъ 29.07.2010 00:34

Ответ: Проблемы с переводом
 
Огромное спасибо! Вы раскрыли мне глаза на истину! Обязательно перепишу рейдринг на досуге.

Только до сих пор остаётся действительным вопрос о том как заставит VB не закрывать окно об ошиьке после завершения приложения. Проблема сейчас явно не в перерисовке (таймеры с запасом) да и на 6.0 это прикрасно фурычит.В прблесках окна с ошибкой я понял что он зависает на загруске информации однако что по этому поводу сообщает VB непонятно... Так как окно проподает с глаз долой..

pax 29.07.2010 00:36

Ответ: Проблемы с переводом
 
Цитата:

А В это время работают к примеру таймеры Физики и Опроса клавиатуры, а OnPaint втискивается между ними максимально возможное колличество раз?!
Тут еще такой казус может случиться... таймеры работают в отдельных потоках приложения и при этом может случиться перекрестная работа с одними и теми же переменными для отрисовки и изменения.
Если использовать цикл как в первом туторе, то можно рендерить постоянно кадры, а основываясь на времени вызывать методы обновления физики и игровой логики. Пример такого принципа - цикл с твинигом в Blitz3d. Там функция Update вызывается столько раз, сколько нужно для обеспечения выполнения обновления игры например 30 раз в секунду. а все остальное вермя выполняется рендеринг геометрии с интерполяцией по промежуточным положениям.

pax 29.07.2010 00:38

Ответ: Проблемы с переводом
 
Цитата:

Сообщение от Лit}{Ъ (Сообщение 156537)
Огромное спасибо! Вы раскрыли мне глаза на истину! Обязательно перепишу рейдринг на досуге.

Только до сих пор остаётся действительным вопрос о том как заставит VB не закрывать окно об ошиьке после завершения приложения. Проблема сейчас явно не в перерисовке (таймеры с запасом) да и на 6.0 это прикрасно фурычит.В прблесках окна с ошибкой я понял что он зависает на загруске информации однако что по этому поводу сообщает VB непонятно... Так как окно проподает с глаз долой..

Для отладки работай для начала в оконном режиме и ставь где надо точки останова (слева от кода красные точки) для просмотра состояния переменных на разных шагах работы приложения. Да и возможно правильно составленный цикл отрисовки решит проблемы. Хотя взможно проблема в неверной инициализации графического режима... тут надо думать. Самый простой способ зарегистрировать ошибку в полноэкранном режиме - ставить блоки Try для ловли ошибок и писать их в файл.

Лit}{Ъ 29.07.2010 00:48

Ответ: Проблемы с переводом
 
Про точки вкурсе! Только вот зараза - Оконный режим диркт Х это как раз то с чем я не умею работать.... Мудрый 6.0. выводил ошибку в MSG BoX который не закрывается покане нажмёш - а тут... Пипец...

Чёрт! С точками тоже не помогает!

pax 29.07.2010 00:50

Ответ: Проблемы с переводом
 
Пробуй блоки ловли исключений, вот пример: http://www.homeandlearn.co.uk/NET/nets5p4.html
т.е.:
PHP код:

Try

'Действие, которое может вызвать ошибку'

Catch ex As Exception

' если произошла ошибка между Try и Catch - ее регистрация (запись в файл или вывод в MessageBox)'
MessageBox.Show(ex.Message)
End Try 

UPD: Решил проспамить пример работы с DirectDraw и сюда тоже http://gpwiki.org/index.php/DirectX:...NET:DX9:Basics

Лit}{Ъ 29.07.2010 01:16

Ответ: Проблемы с переводом
 
Помогло! 1 ошибкой меньше! Только без дебагинга с маркерами и просмотром значений будет туго. Чего компу может нехватать что он не может свернуть(развернуть) приложение?

pax 29.07.2010 01:21

Ответ: Проблемы с переводом
 
Для сворачивания надо чтобы окно могло выполнять оконные сообщения... попробуй нажимать сочетание клавиш Windows + D для сворачивания всех окон и потом переключения на студию.

Вообще попробуй организовать цикл так, как приведено в туторе по ссылке в посте 41. Там как раз бесконечный цикл и есть вызов Application.DoEvents(), который дает системе возможность обработки сообщений, в том числе и оконных. А я спать пошел.

Лit}{Ъ 29.07.2010 01:31

Ответ: Проблемы с переводом
 
До цикла даже не доходит! У меня походу компа на нужды студии не хватает... Сейчас я понял самую гениальную вещ изобретённую человеком MSG Box! Я при помощи него переменные отлеживаю. Ужассс...

Огромный сенкс за прмощ.

pax 29.07.2010 20:50

Ответ: Проблемы с переводом
 
Ну как бы полноэкранный режим - это только маленькая часть возможностей, которые нужно реализовать правильно. Один раз понять в чем проблема, а далее будет все как по маслу. Тестировать конечно надо в оконном режиме и иметь возможность в любой момент перейти в полноэкранный.


Часовой пояс GMT +4, время: 12:14.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot