我有一个"软件渲染器",我从PC移植到iPhone.使用iphone上的像素缓冲区手动更新屏幕的最快方法是什么?例如在Windows中,我发现的最快的功能是SetDIBitsToDevice.
我对iphone或库不太了解,似乎有很多层和不同类型的UI元素,所以我可能需要大量的解释......
现在我只是不断更新opengl中的纹理并将其渲染到屏幕上,我非常怀疑这将是最好的方法.
更新:
我试过openGL屏幕大小的纹理方法:
我得到了17fps ......
我使用了512x512纹理(因为它需要是2的幂)
只是呼唤
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,512,512,GL_RGBA,GL_UNSIGNED_BYTE, baseWindowGUI->GetBuffer());
Run Code Online (Sandbox Code Playgroud)
似乎对所有减速都负有责任.
评论它,并留下我所有的软件渲染GUI代码,以及现在非更新纹理的渲染,导致60fps,30%的渲染器使用,并且没有来自cpu的显着尖峰.
请注意,GetBuffer()只是返回一个指向GUI系统软件后台缓冲区的指针,无论如何都没有重新调整缓冲区或调整缓冲区大小,它的大小和格式都适合于纹理,所以我很确定减速有与软件渲染器无关,这是个好消息,看起来如果我能找到一种方法在60点更新屏幕,软件渲染应该暂时起作用.
我尝试使用512,320而不是512,512进行更新纹理调用,这奇怪甚至更慢......以10fps运行,也表示渲染利用率仅为5%,并且在openGLES内调用Untwiddle32bpp时所有时间都被浪费了.
我可以将我的软件渲染更改为原生渲染为任何pixle格式,如果它会导致更直接的blit.
fyi,在2.2.1 ipod touch G2上测试(就像类固醇上的Iphone 3G一样)
更新2:
我刚刚写完了CoreAnimation/Graphics方法,它看起来不错,但是我有点担心它如何更新每一帧的屏幕,基本上抛弃旧的CGImage,创建一个全新的...在'someRandomFunction中查看它'下面:这是更新图像的最快方式吗?任何帮助将不胜感激.
//
// 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 …Run Code Online (Sandbox Code Playgroud) 是否有可能并且支持使用iOS硬件加速的h.264解码API来解码本地(非流式)视频文件,然后在其上组合其他对象?
我想创建一个涉及在视频前面绘制图形对象的应用程序,并使用回放计时器来同步我在顶部绘制的内容,以及在视频上播放的内容.然后,根据用户的操作,更改我在顶部绘制的内容(但不是视频)
来自Android的DirectX,OpenGL和OpenGL ES,我想象的是将视频渲染为纹理,并使用该纹理绘制全屏四边形,然后使用其他精灵来绘制其余的对象; 或者也许在渲染器之前写一个中间过滤器,这样我就可以操纵各个输出帧并绘制我的东西; 或者可以在视频顶部绘制2D图层.
似乎AV基金会或者Core Media 可以帮助我做我正在做的事情,但在我深入研究细节之前,我想知道是否有可能做我想做的事情,以及我的主要内容是什么?解决问题的途径.
请不要"这对你来说太先进,先试试你好世界"的答案.我知道我的东西,只是想知道我想做什么是可能的(最重要的是,支持,所以应用程序不会最终被拒绝),在我自己研究细节之前.
编辑:
我不熟悉iOS开发,但专业的Android版DirectX,OpenGL和OpenGL ES.我正在考虑制作我目前拥有的Android应用程序的iOS版本,我只是想知道这是否可行.如果是这样,我有足够的时间从头开始iOS开发,直到做我想做的事情.如果不可能,那么我现在不会花时间研究整个平台.
因此,这是一个技术可行性问题.我不是要求代码.我正在寻找类型的答案"是的,你可以做到这一点.只需使用A和B,使用C渲染到D并用E绘制你的东西",或者"不,你不能.硬件加速解码是不适用于第三方应用程序"(这是朋友告诉我的).就这样,我会在路上.
我已经阅读了ios技术概述第32页中的视频技术概述.它几乎说我可以使用Media Player获得最简单的播放功能(不是我想要的),UIKit用于嵌入视频,对嵌入有更多的控制,但不是实际播放(不是我的'正在寻找),AVFoundation可以更好地控制播放(也许我需要的,但我在网上找到的大部分资源都是关于如何使用相机),或者是Core Media对视频进行全面的低级控制(可能就是我需要,但记录极差,甚至比AVFoundation更缺乏回放资源.
我担心我可能会在接下来的六个月里全身心地学习iOS编程,但最终却发现相关的API不适用于第三方开发人员,而我想做的事情是iTunes商店部署是不可接受的.这是我的朋友告诉我的,但我似乎无法在应用程序开发指南中找到任何相关内容.因此,我来到这里是为了询问那些在这方面有更多经验的人,不管我想做什么都是可能的.不再.
我认为这是一个有效的高级问题,可以被误解为我不做我的作业-plz-give-me-teh-codez问题.如果我在这里的判断是错误的,请随意删除,或者将这个问题贬低到你心中的蔑视.
我正在努力将单个像素绘制到a UIView来创建分形图像.我的问题是我的渲染速度.我目前正在运行此循环260,000次,但想渲染更多像素.实际上,在iPad Mini上运行大约需要5秒钟.
我UIBezierPath之前使用的是,但这甚至有点慢(大约7秒).我一直在寻找NSBitMap东西,但我不确定这是否会加速它或如何实现它.
我还在考虑尝试将我的循环中的像素存储到一个数组中,然后在循环后将它们全部绘制在一起.尽管如此,我不太确定存储然后从数组中检索像素的最佳过程是什么.
任何加速这个过程的帮助都会很棒.
for (int i = 0; i < 260000; i++) {
float RN = drand48();
for (int i = 1; i < numBuckets; i++) {
if (RN < bucket[i]) {
col = i;
CGContextSetFillColor(context, CGColorGetComponents([UIColor colorWithRed:(colorSelector[i][0]) green:(colorSelector[i][1]) blue:(colorSelector[i][2]) alpha:(1)].CGColor));
break;
}
}
xT = myTextFieldArray[1][1][col]*x1 + myTextFieldArray[1][2][col]*y1 + myTextFieldArray[1][5][col];
yT = myTextFieldArray[1][3][col]*x1 + myTextFieldArray[1][4][col]*y1 + myTextFieldArray[1][6][col];
x1 = xT;
y1 = yT;
if (i > 10000) {
CGContextFillRect(context, CGRectMake(xOrigin+(xT-xMin)*sizeScalar,yOrigin-(yT-yMin)*sizeScalar,.5,.5));
} …Run Code Online (Sandbox Code Playgroud)