Ben PC'den iPhone'a taşıyan bir "yazılım renderer" var. Ekranı el ile iPhone'da bir piksel tampon ile güncellemenin en hızlı yolu nedir? örneğin pencerelerde en hızlı bulduğum işlev SetDIBitsToDevice'dir.En hızlı yolu iphone üzerinde bir ekran tampon çizmek için
ben iphone veya kütüphaneler hakkında fazla bilgi sahibi ve pek çok katmanları ve kullanıcı arayüzü öğeleri farklı türleri var gibi görünmektedir, bu yüzden çok açıklama yapılması gerekebilir yok ...
şimdilik Sadece opengl'deki bir dokuyu sürekli güncelleyeceğim ve bunu ekrana sunacağım, bunun bunun en iyi yolu olacağından şüphe duyuyorum.
GÜNCELLEME: Ben openGL ekran büyüklüğünde doku yöntemi denedi
:
Ben 17fps var ... Bir 512x512 doku kullanılan
(o ikisinin bir güç gerektiğinden)glTexSubImage2D(GL_TEXTURE_2D,0,0,0,512,512,GL_RGBA,GL_UNSIGNED_BYTE, baseWindowGUI->GetBuffer());
sadece çağrı hemen hemen yeniden gibiydi TÜM yavaş için desteklenebilir.
dışarı yorum, ve tüm yazılım render GUI kodunda bırakarak ve şimdi olmayan güncelleme doku oluşturma, 60fps% 30 oluşturucusu kullanımı ve cpu hiçbir kayda değer sivri sonuçlandı.
GetBuffer() yalnızca GUI sisteminin yazılım destekleyicisine bir işaretçi döndürdüğünü, arabelleğin yeniden boyutlandırılması veya yeniden boyutlandırılması olmadığını, doku için uygun şekilde boyutlandırıldığını ve biçimlendirildiğini unutmayın; yavaşlamanın yazılım işleyicisiyle ilgisi olmadığını, ki bu iyi bir haber, ekran 60'ı güncellemek için bir yol bulabilirsem, yazılımın oluşturulması şu an için çalışmalı.
512,312 yerine 512,320 numaralı güncelleştirme doku çağrısını yapmayı denedim, bu garip bir şekilde daha yavaş ... 10fps hızında çalışıyor, ayrıca render kullanımının yalnızca% 5 gibi olduğunu ve her zaman bir aramada harcanıyor diyor openGiddle32bpp'e openGLES içinde.
Yazılımımın oluşturulmasını, daha doğrudan bir harmanla sonuçlanacak olursa, herhangi bir pixle biçimine dönüştürecek şekilde değiştirebilirim.
, Bilginize (steroid böylece bir Iphone 3G gibi) bir 2.2.1 ipod touch G2
GÜNCELLEME 2 üzerinde test: Sadece CoreAnimation/Grafik yöntemi yazma bitirdikten
, iyi görünüyor, ama ben biraz eski CGImage, tamamen yeni bir tane oluşturma, her bir çerçeve ekran güncelleme hakkında endişeli biraz ... aşağıdaki 'someRandomFunction' içinde kontrol: bu görüntüyü güncellemek için en hızlı yoldur? herhangi bir yardım büyük takdir edilecektir.
//
// catestAppDelegate.m
// catest
//
// Created by User on 3/14/10.
// Copyright __MyCompanyName__ 2010. All rights reserved.
//
#import "catestAppDelegate.h"
#import "catestViewController.h"
#import "QuartzCore/QuartzCore.h"
const void* GetBytePointer(void* info)
{
// this is currently only called once
return info; // info is a pointer to the buffer
}
void ReleaseBytePointer(void*info, const void* pointer)
{
// don't care, just using the one static buffer at the moment
}
size_t GetBytesAtPosition(void* info, void* buffer, off_t position, size_t count)
{
// I don't think this ever gets called
memcpy(buffer, ((char*)info) + position, count);
return count;
}
CGDataProviderDirectCallbacks providerCallbacks =
{ 0, GetBytePointer, ReleaseBytePointer, GetBytesAtPosition, 0 };
static CGImageRef cgIm;
static CGDataProviderRef dataProvider;
unsigned char* imageData;
const size_t imageDataSize = 320 * 480 * 4;
NSTimer *animationTimer;
NSTimeInterval animationInterval= 1.0f/60.0f;
@implementation catestAppDelegate
@synthesize window;
@synthesize viewController;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
[window makeKeyAndVisible];
const size_t byteRowSize = 320 * 4;
imageData = malloc(imageDataSize);
for(int i=0;i<imageDataSize/4;i++)
((unsigned int*)imageData)[i] = 0xFFFF00FF; // just set it to some random init color, currently yellow
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
dataProvider =
CGDataProviderCreateDirect(imageData, imageDataSize,
&providerCallbacks); // currently global
cgIm = CGImageCreate
(320, 480,
8, 32, 320*4, colorSpace,
kCGImageAlphaNone | kCGBitmapByteOrder32Little,
dataProvider, 0, false, kCGRenderingIntentDefault); // also global, probably doesn't need to be
self.window.layer.contents = cgIm; // set the UIWindow's CALayer's contents to the image, yay works!
// CGImageRelease(cgIm); // we should do this at some stage...
// CGDataProviderRelease(dataProvider);
animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(someRandomFunction) userInfo:nil repeats:YES];
// set up a timer in the attempt to update the image
}
float col = 0;
-(void)someRandomFunction
{
// update the original buffer
for(int i=0;i<imageDataSize;i++)
imageData[i] = (unsigned char)(int)col;
col+=256.0f/60.0f;
// and currently the only way I know how to apply that buffer update to the screen is to
// create a new image and bind it to the layer...???
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
cgIm = CGImageCreate
(320, 480,
8, 32, 320*4, colorSpace,
kCGImageAlphaNone | kCGBitmapByteOrder32Little,
dataProvider, 0, false, kCGRenderingIntentDefault);
CGColorSpaceRelease(colorSpace);
self.window.layer.contents = cgIm;
// and that currently works, updating the screen, but i don't know how well it runs...
}
- (void)dealloc {
[viewController release];
[window release];
[super dealloc];
}
@end
Hey, ben de bu problemin içine koştum, her çerçeveyi oluşturmak ve yok etmek için tek çözümdür? (bunu denedim ve glTexsubimage'den daha yavaş). Doğrudan sağlayıcının tüm noktasının bu arabelleğe işaret etmesi gerektiği görünüyor, eğer değiştirirsem, görüntü güncellenir. Bunun hakkında herhangi bir yardım? –
CGDataProviderCreateDirect'i kullanma noktasının CADisplayLink kullanarak yenilenen bir piksel arabelleğe doğrudan erişim olduğunu düşündüm. Ne yazık ki, bu korkunç derecede yavaş. Herhangi bir geçici çözüm bulundu? – aoakenfo