forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Я новичок! (http://forum.boolean.name/showthread.php?t=377)

impersonalis 15.03.2013 00:49

Ответ: Я новичок!
 
Вложений: 1
Необходимо реализовать передачу кванта процессорного времени другим потокам. Самый ломовой (учитывая б3д) способ - вставить Delay 1 в конце тела цикла (ну можно ив начале - сами там, исходя из конкретики решаемой задачи, определитесь). По идее это должно спровоцировать переключение на другой поток и выделение ему некоторого дискретного минимального времени (вероятно, большего чем 1мс). В том виде, в каком код приведён сейчас, вы, фактически и говорите системе: выполнять с такой производительностью, с какой только возможно - именно поэтому нагрузка на цп 99%.
Вложение 18934
(фрагмент статьи про многопоточность, касающийся темы)
А вообще - концептуально касаясь производительности код, условно (ох сейчас меня закидают за придумывание терминологии) можно разделить на два типа: "взаимодействие" и "работа". Первый вариант кода: подгруздка данных из сети, мониторинг портов, обновление GUI, реакция на ввод пользователя - не должны выполняться в бесконечном цикле без всяких ограничений, как то: событие от таймера, от внешнего потока, сообщающего о необходимости перерисовать окошко, прочитать сетевые пакеты из буфера и т.п. Второй вариант кода: грубо говоря, разнообразные расчёты (так или иначе решаемые на ПК задачи формализуются до вычислений). Причём во втором случае - всю необходимую для вычислений информацию мы уже получили благодаря коду "взаимодействия". Глупо ограничивать себя и не стараться выполнить задачу как можно быстрее. Последнее, разумеется не касается неких гибридных вариантов, где вычисления выполняются фоном, так как их тяжесть (негативный эффект создаваемый неконтролируемой нагрузкой) критичнее, времени их работы (например: архивация большого обёъма данных; размазанный во времени обработчик ИИ юнитов в RTS [когда каждый кадр принимается решение только по некоторому количеству юнитов, чтобы сгладить выбросы в нагрузке, избежав подлагивания картинки]).

Вы привели код явно для "взаимодействия" а закодили его как "работа".

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

Неудачная архитектура (применения подхода "работа" в задаче "взаимодействие"):

В данном случае, Ослу не имеет смысл создавать повышенную нагрузку на ЦП (Шрек* - будем рассматривать именно их диалог, хотя Шрека то и дело подменяет Феона), т.к. очевидно, что:
1) такое разрешение по времени не нужно;
2) рациональнее "уснуть" и ждать наступления события.

*-на самом деле по аналогии это сущность персонализирующая собой совокупность "ЦП+поток оценки геоположения". Можно рассмотреть ситуацию иначе: первый поток - это Осёл, второй - Шрек, воздух (среда, позволяющая информации распространятся в виде звуковых колебаний) - шина передачи данных. Вместо того, чтобы ожидать сигнального пакета от второго потока, первый флудит в шину с максимальной частотой, делая невозможной работу третьего потока - Феоны - из-за перманентной занятости шины. ЦП - это некий формальный исполнитель программы с тремя потоками**: два из них постоянно работают со структурой (интерфейсной частью шины данных), третий поток спит (т.к. его культурность алгоритмически обозначает необходимость дождаться одновременной доступности в течение некоторого времени*** шины [разрешающего значения сигнального поля интерфейсной структуры] и доступности одного из потоков, с которым предстоит вести диалог - нетрудно заметить что это событие не наступит никогда: Осел или Шрек свободны, только когда говорит второй из них, т.е. занята шина).

**- ну это уже вопрос философии. С солипсистской точки зрения, все живые существа управляются на единственном реальном cpu - вашем мозге. См. ещё Телеология, Логос.
Здесь же мы рассматриваем локальный участок вселенной (внутри кареты), поэтому строим модель только для него.

*** - задержку можно интерпретировать как долгую реакцию, связанную с низким приоритетом потока Феона (планировщик выделяет квант Феоне так редко, что возможность говорить к этому времени всегда уже обнаруживает Осёл или Шрек), или как искусственную задержку в работе, величина которой позволяет отделить событие "пауза между словами" и "тишина".

Цитата:

В сущности, все модели неправильны, но некоторые полезны
Джордж Бокс

St_AnGer 15.03.2013 00:51

Ответ: Я новичок!
 
Цитата:

Сообщение от boajuse (Сообщение 254928)
после экспериментов с блитцем3д наткнулся на проблему чрезмерной загрузки процессора. Например, код:
"repeat
print "hello world"
until keyhit(1)"
при исполнении грузит проц на 99%.
это нормально?дебуггер отключен.

Это нормально, блиц сжирает всё свободное процессорное время. Добавление в простой бесконечный цикл Delay(1) разгрузит проц. Ну это всё конечно если мне память не изменяет. На форуме эта тема вроде поднималась неоднократно.

Во, Impersonalis опередил :)

апд: Моё 1000-е сообщение! Юбилей :)

boajuse 16.03.2013 13:16

Ответ: Я новичок!
 
спасибо за ответы, хотя я уже почти решил переходить на BlitzMax - там есть альфа-прозрачность для изображений по умолчанию(или в B3d тоже есть?)

Reizel 16.03.2013 13:41

Ответ: Я новичок!
 
Цитата:

Сообщение от boajuse (Сообщение 255010)
спасибо за ответы, хотя я уже почти решил переходить на BlitzMax - там есть альфа-прозрачность для изображений по умолчанию(или в B3d тоже есть?)

Очень разумное решение, если хочешь мутить 2д игру. Действительно, в максе есть не только прозрачность, но и другие доставляющие методы смешивания, плюс все это на порядок быстрее рисуется, нежели в блице, ибо реализовано через тот же 3д.К тому же присутствуют некоторые етоды отрисовки, которых опросту нет в блице - например, многоугольники(закрашенные, а при должном умении - еще и текстурированные), в общем это стопроцентный форвард) к тому же, в максе сам язык более гибок, ООП и ништяки из коробки. Плюс поддержка модулей и кода, написанного на С/С++(что иной раз очень необходимо), и возможность невозбранно прикрутить 3д-часть от самого блица, и использовать его в качестве рендера. А лучше хорс. Вот)

harmon 15.09.2013 03:04

Ответ: Я новичок!
 
Здравствуйте. У меня беда с загрузкой b3d. Загружаю и ставлю камеру в позицию объекта “geroy”. Но камера оказывется совершенно в другом месте.
For q%=1 To CountChildren (vr%)
vr1%=GetChild (vr%,q%)
vrt$=EntityName$(vr1%)
If vrt$<>"" Then
vrt1$=Lower$(vrt$)
If Instr(vrt1$,"door")>0 Then
EntityParent vr1%,0
t%=CopyEntity (vr1%)
FreeEntity vr1%
End If
If Instr(vrt1$,"geroy")>0 Then;ãëàâíûé ãåðîé
EntityParent vr1%,0
pl%=CopyEntity (vr1%,0)
cam%=CreateCamera (pl%)

End If
End If
Next
Что я не так делаю?

Arton 15.09.2013 03:16

Ответ: Я новичок!
 
Цитата:

Сообщение от harmon (Сообщение 267080)
Здравствуйте. У меня беда с загрузкой b3d. Загружаю и ставлю камеру в позицию объекта “geroy”. Но камера оказывется совершенно в другом месте.
For q%=1 To CountChildren (vr%)
vr1%=GetChild (vr%,q%)
vrt$=EntityName$(vr1%)
If vrt$<>"" Then
vrt1$=Lower$(vrt$)
If Instr(vrt1$,"door")>0 Then
EntityParent vr1%,0
t%=CopyEntity (vr1%)
FreeEntity vr1%
End If
If Instr(vrt1$,"geroy")>0 Then;ãëàâíûé ãåðîé
EntityParent vr1%,0
pl%=CopyEntity (vr1%,0)
cam%=CreateCamera (pl%)

End If
End If
Next
Что я не так делаю?

"Что, где, когда."

harmon 15.09.2013 03:25

Ответ: Я новичок!
 
vr%=loadanimmesh("lab.b3d");Загрузка комнаты
For q%=1 To CountChildren (vr%);Перебор всех элементов b3d
vr1%=GetChild (vr%,q%);Очередной элемент
vrt$=EntityName$(vr1%);Его имя
If vrt$<>"" Then;Если имя есть
vrt1$=Lower$(vrt$);Все буквочки делаем строчные
If Instr(vrt1$,"door")>0 Then;Если это дверь
EntityParent vr1%,0
t%=CopyEntity (vr1%)
FreeEntity vr1%
End If
If Instr(vrt1$,"geroy")>0 Then;Если это глав герой
EntityParent vr1%,0;Отвязываем его от всего B3d
pl%=CopyEntity (vr1%,0);Создаем копию
cam%=CreateCamera (pl%);привязываем камеру к копии

End If
End If
Next

Камера оказывается ровно в центре а не там где должна. Объект geroy находится на месте.

Arton 15.09.2013 03:40

Ответ: Я новичок!
 
harmon, если ты ставишь координаты только

cam%=CreateCamera (pl%);привязываем камеру к копии

То координаты камеры от этого не меняются, используй PositionEntity (ent,x,y,z)


Зачем ты вбрасываешь куски кода? Думаешь здесь сидят программисты-гадалки, по огрызку кода понимают проблему =/

harmon 15.09.2013 03:50

Ответ: Я новичок!
 
Не получилось. Камера оказывается ровно по середине меша.

Arton 15.09.2013 04:14

Ответ: Я новичок!
 
Цитата:

Сообщение от harmon (Сообщение 267086)
Не получилось. Камера оказывается ровно по середине меша.

Сейчас я покурю каучук и прозрею в чём твоя проблема...

[затягивает]

Вижу PositionEntity неправильно используешь ты...

[затягивает]

Камера в координатах объекта что бы была, EntityX() (а так же EntityY() и EntityZ()) применит надо тебе.

PositionEntity cam,EntityX (obj),EntityY (obj),EntityZ (obj)

cam - камера (или любой другой энтити)

obj - объект в чьи координаты надо ставить камеру...

[затягивает]

Файлы помощи блица держи Вложение 19679, на русский переведён он. Найдёшь помощь сильную там...

Распаковывать сюда ...\Blitz3D\help - подтвердить замену файлов.

[затягивает]

Ап


окай что то я и правда укурился...

А вот так например написать несудьба?

PositionEntity cam,EntityX (obj),EntityY (obj)+5,EntityZ (obj)

harmon 15.09.2013 04:15

Ответ: Я новичок!
 
Я именно так и применил PositionEntity cam%,EntityX(pl%),EntityY(pl%),EntityZ(pl%)
Объект (кубик geroy) находится в углу. Камера находится по середине. Вывел координаты совпадают а реальное положение нет.
Странно но координаты всех getchild 0,0,0.

Arton 15.09.2013 04:20

Ответ: Я новичок!
 
Цитата:

Сообщение от harmon (Сообщение 267090)
Я именно так и применил PositionEntity cam%,EntityX(pl%),EntityY(pl%),EntityZ(pl%)
Объект (кубик geroy) находится в углу. Камера находится по середине. Вывел координаты совпадают а реальное положение нет.

"Реальное положение", в смысле?
"Камера находится по середине" по середине кубика, или просто в центре 3D пространства?

Если просто применить позишен, камера оказывается в координатах кубика, то бишь в его центре, так?

Не понимаю в чём у тебя проблема, мало информации.

harmon 15.09.2013 04:28

Ответ: Я новичок!
 
Есть комната с дверью. В углу комнаты кубик с именем geroy (именно на его месте должна появляться камера). Загружаю узнаю где кубик (ставлю камеру). Камера не на месте кубика а ровно посередине комнаты. Проверил координаты всех CHILD - они все 0,0,0.
Проблема в том что камера не появляется на месте кубика.
Как сделать вложение в сообщение?

Arton 15.09.2013 04:35

Ответ: Я новичок!
 
Цитата:

Сообщение от harmon (Сообщение 267092)
Есть комната с дверью. В углу комнаты кубик с именем geroy (именно на его месте должна появляться камера). Загружаю узнаю где кубик (ставлю камеру). Камера не на месте кубика а ровно посередине комнаты. Проверил координаты всех CHILD - они все 0,0,0.
Проблема в том что камера не появляется на месте кубика.
Как сделать вложение в сообщение?

В расширенном режиме, внизу есть кнопка "Управление вложениями", справа над окошком ввода текста, свиток - "вложения".

Выложи исходник с медией, посмотрю что там.

Надеюсь там не ололо-сто страниц кода :-)

harmon 15.09.2013 04:40

Ответ: Я новичок!
 
Вложений: 1
Вот эта штука не работает.


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

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