Уменьшите мерцание с GDI + и C++

Ваш ключ разработки (сертификат отладки) изменился, и вам нужно будет сообщить Google о своем новом.

Когда вы переустановили Android Studio, он создал для вас новый сертификат отладки.

Когда вы перезагрузили приложение, он подписал его с этим новым сертификатом отладки, и Google Maps все еще ожидает старую.

Вам нужно будет изменить его на новый в Google Консоль разработчика.

Следуйте инструкциям здесь: https://developers.google.com/maps/documentation/android-api/signup

20
задан Shog9 13 October 2008 в 15:29
поделиться

4 ответа

Для завершенного предотвращения мерцания необходимо было бы завершиться весь рисунок в интервале между экранными обновлениями. Windows не обеспечивает легких средств выполнения этого для нормального рисования окна (Vista предоставляет рисунок составного объекта через DWM, но на это нельзя полагаться даже в системах под управлением Vista). Поэтому лучшее, которое можно сделать для уменьшения мерцания, должно потянуть все как можно быстрее (, уменьшают разрыв путем увеличения возможностей завершения всего рисунка в цикле обновления), и избегайте, превышают ограничения (рисование части экрана и затем рисования чего-то еще чрезмерно: риски, предоставляющие пользователю частично оттянутый экран).

Позволяют нам обсудить методы, представленные здесь до сих пор:

  • Пустой OnEraseBkgnd () : помогает избежать, превышают ограничения, препятствуя тому, чтобы недействительная область окна была переполнена цветом фона окна. Полезный при рисовании всей области снова во время [1 120] WM_PAINT, обрабатывающий так или иначе , как в случае рисунка с двойной буферизацией..., но видеть , Примечания по предотвращению превышают ограничения путем предотвращения тянущий после Вашего метод WM_PAINT .

  • ПУСТОЙ УКАЗАТЕЛЬ Возврата для [1 123] OnCtlColor () : это не должно на самом деле делать ничто ..., если у Вас нет дочерних элементов управления на Вашей форме. В этом случае см. , Примечания по предотвращению превышают ограничения путем предотвращения тянущий после Вашего метод WM_PAINT вместо этого.

  • Двойной буферизированный рисунок : помогает постараться не рваться (и потенциально превышать ограничения также), путем сокращения фактического экранного рисунка до сингла BitBLT. Может повредить время, необходимое для рисования хотя: аппаратное ускорение не может использоваться (хотя с GDI +, шансы любого помогшего с аппаратными средствами используемого рисунка являются довольно небольшими), внеэкранный битовый массив должен быть создан и заполнен для каждой перерисовки, и все окно должно быть перекрашено для каждой перерисовки. См. Примечания по эффективной двойной буферизации .

  • Используя вызовы GDI, а не GDI + для BitBlt: Это часто - хорошая идея - Graphics::DrawImage(), может быть очень медленным. Я даже нашел, что нормальный вызов GDI BitBlt() быстрее в некоторых системах. Игра вокруг с этим, но только после попытки нескольких других предложений сначала.

  • стили класса окна Avoiding, которые вызывают полную перерисовку на каждом, изменяют размер ( CS_VREDRAW, CS_HREDRAW) : Это поможет, но только если Вы не делаете потребность для перерисовки всего окна, когда размер изменяется.

Примечания по предотвращению превышают ограничения путем предотвращения тянущий до Вашего метод WM_PAINT

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

Примечания по предотвращению превышают ограничения путем предотвращения тянущий после Вашего метод WM_PAINT

, Если Вы будете иметь какой-либо дочерние элементы управления, размещенные на Вашей форме, то Вы захотите использовать стиль WS_CLIPCHILDREN, чтобы не дистиллировать их (и впоследствии быть по оттянутому ими. Знайте, это повлияет на скорость стандартной программы BitBlt несколько.

Примечания по эффективной двойной буферизации

Прямо сейчас, Вы создаете новое буферное спиной изображение каждый раз, когда представление тянет себя. Для больших окон это может представить существенное количество памяти, выделяемой и освобожденной, и будет результат в значительных проблемах производительности. Я рекомендую сохранить динамично выделенный битовый массив в Вашем объекте представления, перераспределяя его по мере необходимости для соответствия размеру представления.

Примечание, что, в то время как окно изменяется, это приведет к стольким же выделений сколько существующая система, начиная с каждого нового размера, потребует, чтобы новый задний буферный битовый массив был выделен для соответствия ему - можно упростить боль несколько, округлив размеры до следующего самого большого несколько из 4, 8, 16, и т.д., позволив Вам избежать перераспределенный на каждом крошечном изменении в размере.

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

кроме того, выделите битовый массив, который соответствует битовой глубине экрана. Конструктор для Bitmap Вы в настоящее время используете, примет значение по умолчанию к 32 бит/пкс, ARGB-расположение; если это не соответствует экрану, то он должен будет быть преобразован. Рассмотрите использование метода GDI CreateCompatibleBitmap() для получения битового массива соответствия.

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

40
ответ дан 29 November 2019 в 23:12
поделиться

Вы могли бы попытаться использовать старомодный GDI, а не GDI + для записи в DC, тем более, что Вы уже буферизуете изображение. Используйте Битовый массив:: LockBits для доступа к необработанным растровым данным создайте структуру BITMAPINFO и используйте SetDIBitsToDevice для отображения битового массива.

4
ответ дан 29 November 2019 в 23:12
поделиться

Удостоверьтесь, что класс окна для окна не включает CS_VREDRAW и флаги CS_HREDRAW в его стиле.

См. http://msdn.microsoft.com/en-us/library/ms633574 (По сравнению с 85) .aspx

3
ответ дан 29 November 2019 в 23:12
поделиться

Есть ли на форме дочерние окна? Менеджер окон запускается, заставляя родительское окно стереть его образование путем отправки сообщения WM_ERASEBKGND, ЗАТЕМ это отправляет сообщение wM_PAINT - по-видимому, это отображается на wx:: метод OnDraw. Затем это выполняет итерации по каждому дочернему элементу управления и заставляет их красить себя.

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

0
ответ дан 29 November 2019 в 23:12
поделиться
Другие вопросы по тегам:

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