Возможно, ради этого вопроса не стоило создавать новую тему, но все же. Решил для изучения языка прочесть книгу Кларка "Давайте сделаем рогалик" и поэкспериментировать с кодом. Дошел до пятой главы, о генерации персонажа. Проблема же вот в чем: программа сразу при запуске грузит одно из ядер под завязку, на 98-100 процентов (в общей сложности нагрузка 50%, компьютер двухядерный). При этом переключение на другую программу или даже просто окно происходит с трехсекундной задержкой и вдобавок зависает языковая панель — становится невозможным переключить язык. Сама программа при этом работает нормально, оперативной памяти ей требуется порядка 8000 килобайт. Провел простенький тест и запустил зацикленный вывод в консоль слова "test". Нагрузка сразу же подскакивает до 35-40%. Поставил в конце цикла "sleep 10" — нагрузка упала до 1-3%. Сделал тоже самое во всех циклах программы, но не помогло. Потом подключил к процессу второе ядро с помощью одной программки, часть нагрузки перекинулась, но общая так и осталась на планке в ровно 50%, переключение между программами и окнами все так же тормозит. Начал поочередно отключать процессы через диспетчер, но безрезультатно. Что это может быть? Проблема с оптимизацией, ошибки в коде или что-то с моим компьютером?
Я запустил исходники с пятой главы. Тестировал на 2 компах (оба двухядерники).
На основном загрузка 5-7% На ноуте (там проц послабее) 13-15%
Тесты проводил под Windows 7. У меня не стоит никаких антивирусов и прочей дряни, тормозящих систему. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Извиняюсь, я забыл сказать, что запускал код не из книги Кларка. Мой код несколько отличается от исходников (тем, что он куда более громоздкий и корявый). Да, еще опытным путем установлено, что такой провис случается в главном меню. Как только перехожу в подменю, нагрузка возвращается к норме, хотя языковая панель все еще глючит. Возможно ли, что дело во вложенных циклах? В главном файле кроме вложенных циклов и команд для подключения вспомогательных файлов больше нет ничего.
Дело в том, что в отличии от привычных старых диалектов бейсика , у freebasic блоки if-endif, select-case, do-loop и прочие имеют свою область видимости, из которой прыжки с помощью goto могут привести к таким же результатам как прыжок из процедур и функций (т.е непредсказуемым).
Почему бы просто не сделать так:
Код
If nchRet = 10 Then nchRet = 0 nemRet = 0 mamRet = 0 'GoTo MRECYCLE MainMenu()
А вообще лучше бы выложить рабочий вариант с проблемой загрузки проца. А так это гадание на кофейной гуще. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Я сильно не разбирался, но в файле mainmenu.bi нелогично вставлены sleep. Их надо вставлять в цикл:
Код
'Главное меню. Sub MainMenu() 'Отрисовка номера версии. Dim As String VerNum = "v0.01 off_line, 2013" Dim As Byte VerNumX = 105, VerNumY = 93 DrawMainBG ScreenLock Draw String (VerNumX * TileW, VerNumY * TileH), VerNum, ColorSand ScreenUnLock
Dim As Byte mamOff = 0 Dim As String mamKey
DrawMainMenu(mamRet)
Do mamKey = InKey If mamKey <> "" Then If mamKey = key_esc Or mamKey = key_close Then End ElseIf mamKey = key_enter Then mamOff = 1 If mamKey = key_enter And mamRet = 3 Then End ElseIf mamKey = key_up Then mamRet-=1 DrawMainMenu(mamRet) If mamRet < 0 Then mamRet = 3: DrawMainMenu(mamRet) ElseIf mamKey = key_dn Then mamRet+=1 DrawMainMenu(mamRet) If mamRet > 3 Then mamRet = 0: DrawMainMenu(mamRet) EndIf EndIf sleep 10,1 Loop Until mamOff = 1
ClearKeys
End Sub
'Меню новой игры. Sub NewGame() Dim As Byte nemOff = 0 Dim As String nemKey
DrawNewGame(nemRet)
Do nemKey = InKey If nemKey <> "" Then If nemKey = key_close Then End ElseIf nemKey = key_esc Then nemOff = 1 nemRet = 3 ElseIf nemKey = key_enter Then nemOff = 1 ElseIf nemKey = key_up Then nemRet-=1 DrawNewGame(nemRet) If nemRet < 0 Then nemRet = 3: DrawNewGame(nemRet) ElseIf nemKey = key_dn Then nemRet+=1 DrawNewGame(nemRet) If nemRet > 3 Then nemRet = 0: DrawNewGame(nemRet) EndIf EndIf sleep 10,1 Loop Until nemOff = 1
ClearKeys
End Sub
Если так сделаешь , то загрузка проца упадет к нулю. И конечно стоит удалить метку
Цитата
MRECYCLE:
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Точно! Поменял расположение двух строк, теперь все нормально. А вот языковая панель виснет в любой программе, даже самой простой, если включен графический режим.
В любом случае, спасибо за терпение и желание помочь новичку.
Точно! Поменял расположение двух строк, теперь все нормально.А вот языковая панель виснет в любой программе, даже самой простой, если включен графический режим.
В любом случае, спасибо за терпение и желание помочь новичку.
Ну с языковой панелью, при использовании граф. окна, точно что-то не так. Когда я запускаю графическое окно, у меня попросту раскладки не переключаются ни кнопкой внизу ни по горячим клавишам. Если бы не punto switcher сделать этого было бы невозможно. Я помню похожая хрень была в одной игре от Akela. Там я не мог ввести серийный номер ,чтобы залицензировать продукт из-за того, что при запуске была кириллица и переключиться было невозможно. Приходилось лезть в настройки системы, ставить по умолчанию английскую...
Кстати эта бага только на винде. На linux все путем. Надо об этом написать на оф. сайте. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
А вот заставить программу переключаться на английский при запуске возможно?
В этом топике я писал пример. Там переключение идет не жестко на английскую раскладку, но если учесть что у русскоязычных пользователей стоят раскладки RUS<>ENG , это работает.
Но можно прямо устанавливать английскую раскладку (заменить в коде на это):
Код
' Работает только на винде #ifdef __FB_WIN32__ #Include "windows.bi" Dim As HKL enghkl = LoadKeyboardLayout("00000409",KLF_ACTIVATE+KLF_SETFORPROCESS) ActivateKeyboardLayout(enghkl ,KLF_SETFORPROCESS) #EndIf
Если заменить 00000409 на 00000419 , то будет русская. Это работает только на винде. На linux тоже есть способы, но я не вдавался. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Попробовал по вашему совету. Значок языковой панели сразу же пропадает. Я поставил английский как стандартный, только в этом случае работает.
Вне зависимости от того, что показывает значок на панели, раскладка должна меняться. Это можно попробовать при вводе текста с клавы. Например GetKey с русской раскладкой, при нажатии любой клавиши, возвращает код 63 (то есть неопределенный) , при английской раскладке как положено. Я написал об этом на оф. сайте , но пока дело глухо...
Я бы сделал в программе свою реализацию переключения раскладки с помощью кода , который привел выше. А на значок бы вообще задвинул.
P.S. Давай на ты. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Вот пример, обрати внимание на возвращаемые символы и не смотри на значок раскладки в трее (переключение ALT+SHIFT):
Код
#Include "windows.bi" #Include "fbgfx.bi" Using FB
Screen 1 Dim As Integer iFlag Dim As Double tTimer Dim e As EVENT Do Sleep(10)
if Timer - tTimer >0.5 then iFlag = 1 if iFlag = 1 then If MultiKey(SC_ALT) And MultiKey(SC_LSHIFT) Then tTimer = Timer ActivateKeyboardLayout(Cast(HKL,HKL_NEXT) ,KLF_SETFORPROCESS) iFlag = 0 EndIf EndIf If (Screenevent(@e)) Then Select Case e.type Case EVENT_KEY_PRESS Print "scancode pressed key: " & chr(e.ascii) Case EVENT_KEY_RELEASE Print "scancode released key: " & Chr(e.ascii) End Select End If Loop Until MultiKey(1)
Конечно если к примеру прикрутить шрифт с русскими символами, будет отображаться кириллица вместо кракозябр Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…