Pacman в вопросах о Java

Выровняли пользовательский интерфейс, нажав Grid в элементе управления кадром, как показано ниже,

<Frame CornerRadius="8" Grid.Row="0" HorizontalOptions="FillAndExpand" HeightRequest="8">
<Grid HorizontalOptions="FillAndExpand">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="6*">
                </ColumnDefinition>
                <ColumnDefinition Width="4*">
                </ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="8">
                </RowDefinition>
            </Grid.RowDefinitions>

                <Label Grid.Row="0" Grid.Column="0" HeightRequest="8" HorizontalOptions="FillAndExpand" BackgroundColor="Lime"></Label>
                <Label Grid.Row="0" Grid.Column="1" HeightRequest="8" HorizontalOptions="FillAndExpand" BackgroundColor="Blue"></Label>

        </Grid>
</Frame>
5
задан Bill the Lizard 19 September 2012 в 22:21
поделиться

10 ответов

Похоже, что Ваш вызов к Thread.sleep не делает то, что Вы предназначили, но я не думаю, что это - источник Вашей проблемы. Вы имеете:

Thread.sleep(Math.max(0, startTime - System.currentTimeMillis()));

startTime всегда будет меньше, чем System.currentTimeMillis (), таким образом, startTime - System.currentTimeMillis () всегда будет отрицателен, и таким образом Ваш сон всегда будет для 0 миллисекунд. Это отличается от примера, который Вы показали, потому что пример увеличивает startTime 40 миллисекундами прежде, чем сделать вычисление. Это вычисляет, сколько времени спать для увеличить время рисунка к 40 миллисекундам.

Так или иначе, назад к Вашей проблеме. Я рекомендовал бы измерению выяснить, где Ваше время проводится. Нет никакого смысла, оптимизируя, пока Вы не знаете то, что является медленным. Вы уже знаете, как использовать System.currentTimeMillis (). Попытайтесь использовать это для измерения, куда все время идет. Все это потрачено, таща стены?


РЕДАКТИРОВАНИЕ - я вижу, что это было отмечено, как принято, таким образом, я должен вывести, что проблема ушла, когда Вы установили время сна? У меня нет большого количества Java опытом GUI, но я могу размышлять, что, возможно, Ваш код исчерпал ресурсы другие важные потоки. Путем установки потока, чтобы иметь максимальный приоритет и только когда-либо вызова сна (0), Вы в значительной степени гарантируете, что никакой другой поток в Вашем процессе ничего не может сделать. Вот сообщение из блога Raymond Chen, который объясняет почему.

3
ответ дан 18 December 2019 в 07:11
поделиться

Прежде всего я рекомендовал бы, чтобы Вы использовали названные константы вместо того, чтобы иметь случайные магические числа в Вашем коде и рассмотрели использование перечислений для Ваших типов ячейки. В то время как это не заставит Ваш код работать немного быстрее, это, конечно, поможет понять. Кроме того, 'я' обычно используюсь в качестве счетчика, не для возвращаемого значения. Необходимо, вероятно, назвать его cellType или что-то подобное. Я также рекомендовал бы использовать 2D массив для карты этапа, так как она делает много вещей легче, и в материально-техническом отношении и концептуально.

Тем не менее вот несколько вещей попробовать:

Вытяните setColor() из цикла и делают это однажды. Компилятор смог делать инвариантный циклом подъем и таким образом делать это для Вас (и вероятно будет), но концептуально, необходимо, вероятно, сделать это так или иначе, так как кажется, что Вы хотите, чтобы все Ваши стены были одним цветом так или иначе.

Попытайтесь звонить drawRect() вместо fillRect() и посмотрите, тянет ли это быстрее. Я не думаю, что это будет, но это стоит того, чтобы попытаться, даже если это выглядит более ужасным. Точно так же можно попытаться создать Image и затем рисование этого. Это имеет преимущество, которое действительно легко сказать Вашему Графическому объекту реализовать преобразование на Вашем изображении. Кроме того, рассмотрите вынимание этого полностью и удостоверьтесь, что это - значительный хит производительности.

Кроме того, обычно Вы не должны просить родителя для его Графического объекта и реализации, красящей непосредственно на нем. Скорее необходимо переопределить paintComponent() метод и просто использует Графику, данную Вам (возможно называющий вспомогательные методы, как Вы делаете). Компоненты Swing с двойной буферизацией по умолчанию, таким образом, Вы не должны реализовывать это сами; просто позвольте объекту колебания сделать свое задание и сообщить, когда нарисовать.

Кроме того, Вы заканчиваете тем, что перекрасили весь экран, который является чем-то вроде излишества. Если Вы звоните repaint(Rectangle), Swing может принять решение перерисовать только разделы Вашей платы, которые явно отмечены грязные. При обновлении одного из спрайтов назовите перекрашивание (r) только на области старых и новых местоположений спрайта. Когда Вы завершаете уровень и нуждаетесь в новой плате, затем можно назвать перекрашивание () (без параметров) для перерисовки всей карты.

Необходимо также посмотреть на учебное руководство Sun для получения некоторых подсказок для эффективности в Swing.

4
ответ дан 18 December 2019 в 07:11
поделиться

Я все еще считаю меня новичком с Java, но я недавно разработал игру Frogger-esque с динамической картой и редактором, использующим некоторые методы, которые Вы упомянули, и я слишком рад обеспечить некоторую справку.

Как упомянуто, перечисление способ пойти. Я настроил свою карту как 2-мерный массив и установил перечисление для каждого другого типа, пишущий метод в моем классе сопоставления, чтобы взять в одном изображении и разделить каждый квадрат на карту к каждому значению в моем перечислении.

Учебное руководство, которое помогло мне с отображением, может быть найдено на кока-коле и Коде. Весь исходный код там при необходимости в руке с каким-либо из него хотя у Вас, действительно кажется, есть достойное схватывание того, что Вы делаете. Если Вы все еще нуждаетесь в помощи, я мог бы всегда вытаскивать некоторый исходный код.

4
ответ дан 18 December 2019 в 07:11
поделиться

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

Можно ли сравнить того кода и удостовериться ли, что это - корень проблемы?

3
ответ дан 18 December 2019 в 07:11
поделиться

Ничего себе, это - довольно жесткая проблема, чтобы дать кому-то, просто изучив Java.

Мой совет? Думайте с точки зрения объектов. Можно ли записать что-то БЕЗ пользовательского интерфейса, который подражает поведению самой игры? После того как Вы получаете ту работу, можно сконцентрироваться на специальных проблемах пользовательского интерфейса. Да, запустите с локальной версии перед сетевой частью.

Я не геймер. Интересно, что Java2D API предложил бы делать Вашей жизнью лучше?

Сколько времени необходимо закончить его?

1
ответ дан 18 December 2019 в 07:11
поделиться

Именно так Вы не волнуетесь, что это - Java, я работал над Анализатором спектра (Как o-объем), где вся часть GUI (трассировка, меню, кнопка и обработка колеса) была сделана в Java. Когда я добрался там, это получало 1 фут в секунду, когда я уехал, это было 12-20. Это имело большую обработку продолжения и работало на очень медленном процессоре.

Посмотрите только на обновление частей GUI, который необходимо обновить. Часто можно перерисовать весь экран, но просто установить регион отсечения на часть, которая действительно обновляется.

Будьте осторожны относительно внутренних циклов - они - Уничтожитель Скорости.

Постарайтесь не выделять и освобождать огромные числа объектов. Я не говорю, не используют объекты, я говорю, не создают один для каждого пикселя :)

Удачи

2
ответ дан 18 December 2019 в 07:11
поделиться

Я не разработчик игр, но что framerate кажется очень медленным.

Я не совсем уверен, как Ваш код работает, но одна возможность для того, чтобы улучшить производительность рендеринга состояла бы в том, чтобы найти те части дисплея, которые не изменяются очень (такие как стены лабиринта) и стараются не воссоздавать их для каждого кадра.

Создайте BufferedImage, содержащий постоянные элементы (лабиринт?, фон), и затем перерисовывают его сначала для каждого кадра. Вдобавок к этому Буферизованному изображению потяните переменные элементы (PacMan, фантомы, точки, и т.д.).

Эта техника, наряду со многими другими подсказками по производительности Java2D, обсуждена в превосходной книге Romain Guy Грязные Толстые клиенты.

2
ответ дан 18 December 2019 в 07:11
поделиться

Это могло бы звучать очевидным, но Ваша проблема производительности состоит в том, потому что Вы перерисовываете весь лабиринт, который не должен быть сделан, вместо этого необходимо перерисовать только измененные части лабиринта.

Путем я приблизился к этой проблеме, прежде чем будет путем разделения обновления лабиринта от фактической перерисовки в различные потоки (отчасти как потоковый MVC). Каждый раз, когда Вы изменяете ячейку в своем лабиринте, Вы отметили бы его как "грязный", Ваш поток перерисовки проверит время от времени для перерисовки только грязных ячеек.

Извините за чрезвычайно универсальный совет

1
ответ дан 18 December 2019 в 07:11
поделиться

Двойные буферы Java/Swing по умолчанию. При использовании Swing Вам не нужно к двойному буферу отдельно, как другие ответы предлагают.

Я соглашаюсь с Allain, что код, который Вы перечислили, не может быть причиной 1 фута в секунду. Я написал очень неэффективный код анимации Java/Swing, который работает намного быстрее, чем Вы описываете. Сделайте еще некоторое тестирование для сужения причины замедления.

1
ответ дан 18 December 2019 в 07:11
поделиться

Если возможно, необходимо сохранить изображение лабиринта и потянуть его в одном вызове библиотеки. Это, вероятно, не должно быть полное разрешение, любой - если Вы захотите массивное, 8-разрядное чувство, то я ожидаю, что графическая библиотека будет более, чем рада обязать 8^),

Кроме того, как другие упомянули, можно сэкономить время путем перерисовки только тех частей экрана то обновление потребности. Это может быть раздражающим для реализации, но это может позволить Вам значительно улучшать свою частоту кадров. Обязательно сделайте некоторые эксперименты для проверки дело обстоит так прежде, чем проявить необходимое усилие!

1
ответ дан 18 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: