我刚开始学习一些pygame(整体编程很新),我有一些关于它是如何工作的非常基本的问题.
我还没有找到一个地方解释我何时需要blit或不在屏幕上包含某个表面.例如,绘制圆形时:
circle = pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)
Run Code Online (Sandbox Code Playgroud)
我不需要这样做screen.blit(circle),但在显示文字时:
text = font.render("TEXT", 1, (10, 10, 10))
textpos = text.get_rect()
textpos.centerx = screen.get_rect().centerx
screen.blit(text, textpos)
Run Code Online (Sandbox Code Playgroud)
如果我不blit,文本将不会出现.
说实话,我真的不知道blitting应该做什么,除了将所需的表面"粘贴"到屏幕上.我希望我已经足够清楚了.
在SDL wiki中它说
使用此功能可以从源曲面到目标曲面执行快速blit.
然而,这对我没有多大帮助.
在这种情况下,术语表面blitting意味着什么?
在我的serialiser/deserialiser中,我有以下代码段:
if (element_type.IsValueType && collection_type.IsArray)
{
try
{
GCHandle h = GCHandle.Alloc(array_object, GCHandleType.Pinned);
int arrayDataSize = Marshal.SizeOf(element_type) * c.Count;
var array_data = new byte[arrayDataSize];
Marshal.Copy(h.AddrOfPinnedObject(), array_data, 0, arrayDataSize);
h.Free();
WriteByteArray(array_data);
return;
}
catch (ArgumentException)
{
//if the value type is not blittable, then we need to serialise each array item one at a time
}
}
Run Code Online (Sandbox Code Playgroud)
其目的是尝试以尽可能最有效的方式(即,仅将内容作为一堆字节)写入流中的值类型数组.
当类型是值类型但不是blittable时,问题就出现了,Alloc()失败了.此时捕获异常并将控制权传递给处理数组的代码,就好像它由引用类型组成一样.
然而,由于我的应用程序中遇到的值类型的数量,此检查(由于抛出并捕获我理解的异常非常慢)被证明是严重的瓶颈.所以我想知道,检查类型是否是blittable的最快方法是什么?
我是 Python 初学者,对函数不是很清楚surface.blit()。它有什么作用?它是如何工作的?
关于如何创建它,我遇到了以下几点。
句法: canvas.blit(surface, surfacerect)
为什么只使用 rect?可以是其他形状吗?
如果我复制从一个FBO像素到另一个和他们每个人都有颜色附件的多个(不必是相同的号码),如果我的面具是GL_COLOR_BUFFER_BIT,哪种颜色的附件(GL_COLOR_ATTACHMENT0,GL_COLOR_ATTACHMENT1,..., GL_COLOR_ATTACHMENTi)它复制?他们都是?如果是,如果这些FBO附加了不同数量的颜色缓冲区怎么办?
假设有2个FBO以这种方式绑定:
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo1);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo2);
Run Code Online (Sandbox Code Playgroud)
请注意,它fbo1有2个颜色附件,并fbo2有4个颜色附件.
那么glBlitFrameBuffer在这种情况下如何将blit颜色附件?
我无法在OpenGL文档中的任何地方找到它.
我试图将PNG图像blit到表面上,但由于某种原因,图像的透明部分变黑,这是简单的代码:
screen = pygame.display.set_mode((800, 600), pygame.DOUBLEBUF, 32)
world = pygame.Surface((800, 600), pygame.SRCALPHA, 32)
treeImage = pygame.image.load("tree.png")
world.blit(treeImage, (0,0), (0,0,64,64))
screen.blit(world, pygame.rect.Rect(0,0, 800, 600))
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决问题?图像具有Alpha透明度,我在PhotoShop中将其打开,背景变为透明,而不是黑色或白色或任何其他颜色.
感谢您的支持 :)
我习惯用老式图书馆处理图形(allegro,GD,pygame),如果我想将一个位图的一部分复制到另一个......我只是使用blit.
我想弄清楚如何在android中做到这一点,我感到非常困惑.那么......我们将这些Canvas设置为只写,Bitmaps是只读的吗?看起来真是太愚蠢了,必须有一些我想念的东西,但我真的无法理解.
编辑:更精确一点...... 如果位图是只读的,而且画布只是写入的,我不能将A插入B,然后将B插入C?
我有一些关于 blitting matplotlib 图的问题,它本身嵌入在 Tkinter GUI 中 - 整个程序最终将在 Raspberry Pi 上运行。问题涉及多个层面,这是我的第一个问题,如有不明白之处,请提前见谅。
简而言之,我正在做的是:我正在使用 Tk GUI 来同时读取多个传感器,并且我希望对所述 GUI 上的传感器数据进行一些实时更新。我希望将每个可测量的数量放在一个单独的框架上,这就是我决定为每个 Sensor 设置一个类的原因。其中一个传感器是流量传感器,其读出和绘制如下:
import Tkinter as Tk
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from Backend import Backend #self written data acquisition handler
#global variables
t0 = datetime.now() #start time of program
#Returns time difference in seconds
def time_difference(t1, t2):
delta = t2-t1
delta = delta.total_seconds()
return delta
# Define …Run Code Online (Sandbox Code Playgroud) 我遇到以下问题:
我需要在另一个纹理上渲染纹理,然后渲染该主纹理.例如,我有蓝色矩形纹理,我想在这个蓝色矩形的顶部绘制红色矩形.但是我希望它们仅限制此矩形的渲染.如下图所示:

我读了一些关于它们之间的纹理blit或类似的东西,但我不确定这是否可行.
我的代码看起来像这样:
SDL_RenderCopy(ren,bluetexture,NULL,dBLUErect);
SDL_RenderCopy(ren,redtexture,NULL,dREDrect);
SDL_RenderPresent(ren);
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何在SDL 2.0中执行此操作?这就是我使用的方式.
我想显示具有指定透明度的alpha图像,但无法弄清楚如何操作.
为了详细说明我是如何努力的,下面的模糊是这个SO答案的一个稍微修改的代码块,但如果你运行它,你会看到"图像"丢失它的原生alpha,而" image2"永远不会改变!呸.
#!/usr/bin/env python
import pygame, sys
pygame.init()
window = pygame.display.set_mode((200, 200))
background = pygame.Surface((window.get_size()))
background.fill((255, 255, 255))
image = image2 = pygame.image.load('alpha.png')
image = image.convert()
rect = image.get_rect()
image2 = image2.convert_alpha()
rect2 = image2.get_rect()
rect2.left = rect.width + 1
i = 0
while True:
for event in pygame.event.get():
if event.type == 12:
pygame.quit()
sys.exit()
image.set_alpha(i)
image2.set_alpha(i)
window.fill((255, 255, 255))
window.blit(background, background.get_rect())
window.blit(image, rect)
window.blit(image2, rect2)
if i == 255:
i = 0
else:
i …Run Code Online (Sandbox Code Playgroud) blit ×10
python ×5
pygame ×4
alpha ×2
canvas ×2
graphics ×2
sdl ×2
android ×1
bitmap ×1
c# ×1
c++ ×1
framebuffer ×1
marshalling ×1
matplotlib ×1
opengl ×1
png ×1
rendering ×1
textures ×1
tkinter ×1
value-type ×1