我正在用C++和MFC写一款俄罗斯方块游戏。我有一个计时器和OnTimer处理程序。处理程序如下所示:
... do some game-only logic ...
this->RedrawWindow();
在OnPaint处理程序中,我使用位图和BitBlt函数来绘制块、地图(带位图背景)、分数等。一切都是从头开始绘制的,我重新绘制了整个窗口区域。整体性能是正常的,有时会闪烁,但还可以,但当我在地图中添加位图背景时,重绘时的闪烁变得令人无法忍受。我是否必须使用另一种算法来绘制位图,或者每次触发OnPaint时,我都会错误地进行所有的重绘?
如何消除闪烁?我只能使用C++和MFC,不
在询问了这个之后,我更改了代码。它可以工作,但是当WM_PAINT绘制窗口并且光标在窗口中移动时,绘制并不是同时在任何地方完成的。这里您有一个来更好地查看它。这是我的WM_PAINT:
//TV is a struct with the dimensions of the window.
//BitmapBuffer is the bitmap containing the painting.
static int cont;
cont++;
HDC HDc;
PAINTSTRUCT ps;
HDc = BeginPaint(iden
如果我有一个应用程序,它产生数据的速度很慢,但消耗数据的速度很快,那么它是一个很好的双缓冲区实现吗?基本思想是让生产者填充后台缓冲区,而消费者处理前台缓冲区。我不希望客户端看起来像是在等待数据。我想在生产和消费之间取得平衡。如何实现此功能?即使我有一个后台缓冲区线程...它必须与前台缓冲区线程同步,这样前台缓冲区才能知道何时有新数据(缓冲区被交换)。如果后台缓冲区线程产生数据的时间太长,那么前台缓冲区将不得不等待处理数据。
void fill_back_buffer() {
//wait to fill buffer
//fill back buffer
//swap
我完全是Java图形学的新手。
我写了一个简单的“游戏”,你用箭头键控制一个盒子。
以下是源代码:
package com.thundercrust.graphics;
public class Drawings extends Canvas implements KeyListener, Runnable {
public static Thread thread;
public static Drawings draw;
private static final long serialVersionUID = 1L;
public static boolean running =
基本上,我已经设置了一个类来处理发送WM_SETREDRAW消息,如下所示:
public static class DrawingLocker
{
[DllImport("user32", CharSet = CharSet.Auto)]
private extern static IntPtr SendMessage(IntPtr hWnd,
int msg, int wParam, IntPtr lParam);
private const int WM_SETREDRAW = 11; //0xB
public
这个程序使用opengl显示一个房子,输出只显示一个空白屏幕,没有其他任何东西,我没有做任何改变窗口位置和大小的工作,我不知道出了什么问题
#include<Gl/glut.h>
GLfloat square[][2]={{100,200},{100,100},{200,100},{200,200}};//coordinates of the vertices of the square part of the house
GLfloat door[][2]={{125,150},{125,100},{175,100},{175,150}};// coordinates of th
它总是能处理图像,但矩形和椭圆形永远不会正确缓冲。我在我的gamepanel类中有一个基本的游戏循环,可以重复地绘制玩家。它不会删除矩形,只会留下痕迹。为了学习,我想使用矩形而不是图像。我试着在游戏循环中使用重绘,但它疯狂地闪烁,仍然不起作用。我在这个网站上看了另一个关于这方面的教程,但是他们使用的opengl对我来说是陌生的,我不想花时间去弄明白它。
JFrame:
import javax.swing.JFrame;
public class Game {
public static void main(String[] args) {
JFrame f = n